以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  金字塔软件问题提交  (http://www.weistock.com/bbs/list.asp?boardid=2)
----  疑似BUG: 序列变量初始化不了  (http://www.weistock.com/bbs/dispbbs.asp?boardid=2&id=4817)

--  作者:paulshen
--  发布时间:2011/1/13 15:54:24
--  疑似BUG: 序列变量初始化不了

可运行的公式如下:

//用于后台交易的优化
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

 

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


--  作者:阿火
--  发布时间:2011/1/13 16:13:38
--  

variable :

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

 

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

[此贴子已经被作者于2011-1-13 16:13:57编辑过]

--  作者:paulshen
--  发布时间:2011/1/13 16:17:46
--  

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

 

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

[此贴子已经被作者于2011-1-13 16:18:37编辑过]

--  作者:paulshen
--  发布时间:2011/1/13 17:34:12
--  

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

 

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


--  作者: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;


--  作者:paulshen
--  发布时间:2011/1/13 17:40:58
--  

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


--  作者:阿火
--  发布时间: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编辑过]

--  作者:paulshen
--  发布时间:2011/1/14 11:48:12
--  疑似BUG: 序列变量初始化不了

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


--  作者:fly
--  发布时间:2011/1/14 14:21:07
--  

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

 

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


--  作者:大灰狼
--  发布时间:2011/1/14 14:47:44
--  

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

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