可运行的公式如下:
//用于后台交易的优化
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
请帮忙看看,是什么原因。变量初始用法有问题?
variable :
申明并初始化变量;variable 为全局变量申明语句,一般用在逐周期计算模式。因为variable变量在序列模式与普通的变量是没有区别的。
在序列模式,变量初始化就直接赋值为0,或者干脆不用,直接删除 红色那一行就好了
我的本意就是做全局变量申明,也希望初始成0,为了避免由于没做初始化可能带来的问题。
这里主要问题是做了变量申明以后,STHH和STLL都成了空值。
问题还是出在DEBUGFILE上,对STLL和STHH做了全局声明以后就无法正常输出了。
用循环打出STLL和STHH的序列值看都是正常的。
或者把这两行
DEBUGFILE(FILEPATH,'STHH:%.2f',STHH);
DEBUGFILE(FILEPATH,'STLL:%.2f',STLL);
改成:
DEBUGFILE(FILEPATH,'STHH:%.1f',STHH[D]);
DEBUGFILE(FILEPATH,'STLL:%.1f',STLL[D]);
也是可以正常输出。其中D:=datacount;
还有做了全局申明以后, cross函数也无法正常调用STLL和STHH了。BO,BC,SO, SC都成了-1。
尝试把
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); RUNMODE:1; |
我这里测试了一下,可以输入正确结果
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等语句最好放在程序前面吧。
这样写的确可以了申明了,知不知道什么申明时加下标不行?我看到运行模式网页里是那么用的。
如果是个已经固定了值的数组,比如S[10]=0,是可以的.
估计是楼主用到了datacount,随着行情的变化,是个不断变化的值.
变量的申明和初始化是两码事。
尤其是数组的申明和初始化是要严格区分的