Rss & SiteMap

金字塔客服中心 - 专业程序化交易软件提供商 http://www.weistock.com/bbs/

专业程序化软件提供商
共10 条记录, 每页显示 10 条, 页签: [1]
[浏览完整版]

标题:疑似BUG: 序列变量初始化不了

1楼
paulshen 发表于:2011/1/13 15:54:24

可运行的公式如下:

//用于后台交易的优化
INPUT:AP(3,1,20,1);
INPUT:SL(9,5,30,1);
INPUT:tOA(1,1,300,1);

//时间条件
OT:=CURRENTTIME>91500;//Cannot use '=91500' OPENTIME(1);

//仓位条件
OAT:=tOA;
FILEPATH:='D:\DEBUGFILE\TSTS-TestDebugFile.TXT';
//------------------------------------------------------------
//技术指标=======================================================

//适应周期和序列两种模式
RUNMODE:1;
if not(islastbar)then exit;

D:=datacount;
variable:I=0;
variable:STLL[D]=0,STHH[D]=0;

for I=5 to datacount do begin
 STHH[I]:=HIGH[I-1];
 STLL[I]:=LOW[I-1];
end

 

{开平仓条件}
BO:=cross(high,STHH);
SO:=cross(STLL,low);

{平仓条件}
BC:=cross(high,STHh);
SC:=cross(STLL,low);

//初始化仓位全局变量
if date<>ref(date,1) and islastbar then begin
 EXTGBDATASET('TSTS',Tholding);
end

//--------------------交易指令-----------------------------
SPR:=C-AP*MINDIFF;//卖出价
BPR:=C+AP*MINDIFF;//买入价
SPR:=if(SPR<LOW,C,SPR);
BPR:=if(BPR>HIGH,C,BPR);
 

//多单止损 - 初始止损信号
AVG:=tAVGENTERPRICE;
SLL:=AVG-SL;
S_SL:=if(AVG=0,0,C<=SLL);

//平多开空

//空单止损 - 初始止损信号
AVG:=tAVGENTERPRICE;
SLH:=AVG+SL;
B_SL:=if(AVG=0,0,C>=SLH);

DEBUGFILE(FILEPATH,'=======',0);
DEBUGFILE(FILEPATH,'TH:'&numtostr(THOLDING,1)&' TodayTH:'&numtostr(todayHOLDING,1)&' TH2:'&numtostr(THOLDING2,1)&' TSTS:'&numtostr(EXTGBDATA('TSTS'),0),0);

DEBUGFILE(FILEPATH,'STHH:%.2f',STHH);
DEBUGFILE(FILEPATH,'STLL:%.2f',STLL);
DEBUGFILE(FILEPATH,'BO:%.0f',BO);
DEBUGFILE(FILEPATH,'BC:%.0f',BC);
DEBUGFILE(FILEPATH,'SO:%.0f',SO);
DEBUGFILE(FILEPATH,'SC:%.0f',SC);
DEBUGFILE(FILEPATH,'B_SL:%.0f',B_SL);
DEBUGFILE(FILEPATH,'S_SL:%.0f',S_SL);
DEBUGFILE(FILEPATH,'C:%.1f',C);
DEBUGFILE(FILEPATH,'H:%.1f',H);
DEBUGFILE(FILEPATH,'L:%.1f',L);
DEBUGFILE(FILEPATH,'O:%.1f',O);
DEBUGFILE(FILEPATH,'SLL:%.1f',SLL);
DEBUGFILE(FILEPATH,'SLH:%.1f',SLH);

//-----------------------------------------------------

如果增加序列变量初始化(标为红色),则输出结果如下:

2011-01-13 15:25:03.801    =======
2011-01-13 15:25:03.801    TH:-1.0 TodayTH:-1.0 TH2:-1.0 TSTS:-1
2011-01-13 15:25:03.801    STHH:-1.#R
2011-01-13 15:25:03.817    STLL:-1.#R
2011-01-13 15:25:03.817    BO:-1
2011-01-13 15:25:03.817    BC:-1
2011-01-13 15:25:03.817    SO:-1
2011-01-13 15:25:03.817    SC:-1
2011-01-13 15:25:03.817    B_SL:0
2011-01-13 15:25:03.817    S_SL:0
2011-01-13 15:25:03.817    C:3147.0
2011-01-13 15:25:03.817    H:3147.4
2011-01-13 15:25:03.817    L:3144.4
2011-01-13 15:25:03.817    O:3145.2
2011-01-13 15:25:03.817    SLL:3142.2
2011-01-13 15:25:03.817    SLH:3160.2

 

如上所示,STHH和STLL为空值。

 

如果去掉初始化行,则可得到正常值:

2011-01-13 15:22:43.151    =======
2011-01-13 15:22:43.167    TH:-1.0 TodayTH:-1.0 TH2:-1.0 TSTS:-1
2011-01-13 15:22:43.183    STHH:3146.80
2011-01-13 15:22:43.183    STLL:3145.20
2011-01-13 15:22:43.183    BO:1
2011-01-13 15:22:43.183    BC:1
2011-01-13 15:22:43.183    SO:0
2011-01-13 15:22:43.183    SC:0
2011-01-13 15:22:43.198    B_SL:0
2011-01-13 15:22:43.198    S_SL:0
2011-01-13 15:22:43.198    C:3147.0
2011-01-13 15:22:43.198    H:3147.4
2011-01-13 15:22:43.198    L:3144.4
2011-01-13 15:22:43.198    O:3145.2
2011-01-13 15:22:43.198    SLL:3142.2
2011-01-13 15:22:43.198    SLH:3160.2

 

请帮忙看看,是什么原因。变量初始用法有问题?

2楼
阿火 发表于:2011/1/13 16:13:38

variable :

申明并初始化变量;variable 为全局变量申明语句,一般用在逐周期计算模式。因为variable变量在序列模式与普通的变量是没有区别的。

 

在序列模式,变量初始化就直接赋值为0,或者干脆不用,直接删除 红色那一行就好了

[此贴子已经被作者于2011-1-13 16:13:57编辑过]
3楼
paulshen 发表于:2011/1/13 16:17:46

我的本意就是做全局变量申明,也希望初始成0,为了避免由于没做初始化可能带来的问题。

 

这里主要问题是做了变量申明以后,STHH和STLL都成了空值。

[此贴子已经被作者于2011-1-13 16:18:37编辑过]
4楼
paulshen 发表于:2011/1/13 17:34:12

问题还是出在DEBUGFILE上,对STLL和STHH做了全局声明以后就无法正常输出了。

 

用循环打出STLL和STHH的序列值看都是正常的。

5楼
paulshen 发表于:2011/1/13 17:36:29

或者把这两行

DEBUGFILE(FILEPATH,'STHH:%.2f',STHH);
DEBUGFILE(FILEPATH,'STLL:%.2f',STLL);
改成:

DEBUGFILE(FILEPATH,'STHH:%.1f',STHH[D]);
DEBUGFILE(FILEPATH,'STLL:%.1f',STLL[D]);

也是可以正常输出。其中D:=datacount;

6楼
paulshen 发表于:2011/1/13 17:40:58

还有做了全局申明以后, cross函数也无法正常调用STLL和STHH了。BO,BC,SO, SC都成了-1。

7楼
阿火 发表于:2011/1/13 22:48:30

尝试把

variable:I=0;
variable:STLL[D]=0,STHH[D]=0;

 

改成

variable:I=0;
variable:STLL=0,STHH=0;

 

位置放在input之后:

INPUT:AP(3,1,20,1);
INPUT:SL(9,5,30,1);
INPUT:tOA(1,1,300,1);

RUNMODE:1;
variable:I=0;
variable:STLL=0,STHH=0;

 

我这里测试了一下,可以输入正确结果

2011-01-13 22:34:59.859    =======
2011-01-13 22:34:59.859    TH:0.0 TodayTH:0.0 TH2:0.0 TSTS:0
2011-01-13 22:34:59.859    STHH:3147.80
2011-01-13 22:34:59.859    STLL:3145.60
2011-01-13 22:34:59.859    BO:0
2011-01-13 22:34:59.859    BC:0
2011-01-13 22:34:59.859    SO:1
2011-01-13 22:34:59.859    SC:1
2011-01-13 22:34:59.859    B_SL:0
2011-01-13 22:34:59.859    S_SL:0
2011-01-13 22:34:59.859    C:3147.0
2011-01-13 22:34:59.859    H:3147.4
2011-01-13 22:34:59.859    L:3144.4
2011-01-13 22:34:59.859    O:3146.4
2011-01-13 22:34:59.859    SLL:-9.0
2011-01-13 22:34:59.859    SLH:9.0

 

runmode、varibale、input等语句最好放在程序前面吧。


[此贴子已经被作者于2011-1-13 22:51:33编辑过]
8楼
paulshen 发表于:2011/1/14 11:48:12

这样写的确可以了申明了,知不知道什么申明时加下标不行?我看到运行模式网页里是那么用的。

9楼
fly 发表于:2011/1/14 14:21:07

如果是个已经固定了值的数组,比如S[10]=0,是可以的.

 

估计是楼主用到了datacount,随着行情的变化,是个不断变化的值. 

10楼
大灰狼 发表于:2011/1/14 14:47:44

变量的申明和初始化是两码事。

尤其是数组的申明和初始化是要严格区分的

共10 条记录, 每页显示 10 条, 页签: [1]


Powered By Dvbbs Version 8.3.0
Processed in 0.03223 s, 2 queries.