以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  全局变量无法取得正确值  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=55537)

--  作者:lcgs005
--  发布时间:2013/8/22 10:13:30
--  全局变量无法取得正确值
下面的公式,是金叉时开多单,死叉时开空单,希望开仓后用全局变量记住开仓的周期,若仓位自动平或手动平仓后全局变量置为0,用下面的公式全局变量始终显示为0,不知是什么原因

DIFF:=EMA(CLOSE,12) - EMA(CLOSE,26);
DEA:=EMA(DIFF,9);
MACD:=2*(DIFF-DEA);
mszt:=macd>=ref(macd,1);
dezt:=diff>=dea;
jc:=cross(diff,dea);
sc:=cross(dea,diff);
aa:=tholding;
//多周期的开多与止损
kd:=aa=0  and jc;
if kd then BEGIN
tbuy(1,1,mkt);
extgbdataset(\'dcw\',1); 
end
//平空与止损-若本级别仓位未被其它周期平掉则本周期仓位由本级别止损
dzs:=aa>0 and extgbdata(\'dcw\')=1 and  dezt=0;
if dzs then begin
tsell(1,0,mkt);
extgbdataset(\'dcw\',0); 
end

//开空部份
kk:=aa=0 and sjbm=0 and sc;
if kk then begin
tbuyshort(1,1,mkt);
extgbdataset(\'kcw\',-1); 
end
//平空与止损
kzs:=aa<0 and extgbdata(\'kcw\')=-1  and dezt;
if kzs then BEGIN
tsellshort(1,0,mkt);
extgbdataset(\'kcw\',0); 
end
//本级别仓位无论手动自动平仓后均将本级别全局变量置为0
if aa=0 then begin
extgbdataset(\'dcw\',0); 
extgbdataset(\'kcw\',0); 
end

--  作者:jinzhe
--  发布时间:2013/8/22 10:16:34
--  

不要在所有公式前写aa:=tholding

直接把tholding判断写入后面所有的条件判断


--  作者:lcgs005
--  发布时间:2013/8/22 10:53:48
--  
按你的指导改为这样了,全局变量仍然一直为0,开仓后并不变化,拜托看下其它有没有问题
DIFF:=EMA(CLOSE,12) - EMA(CLOSE,26);
DEA:=EMA(DIFF,9);
MACD:=2*(DIFF-DEA);
mszt:=macd>=ref(macd,1);
dezt:=diff>=dea;
jc:=cross(diff,dea);
sc:=cross(dea,diff);
//多周期的开多与止损
kd:=tholding=0  and jc;
if kd then BEGIN
tbuy(1,1,mkt);
extgbdataset(\'dcw\',1); 
end
//平空与止损-若本级别仓位未被其它周期平掉则本周期仓位由本级别止损
dzs:=tholding>0 and extgbdata(\'dcw\')=1 and  dezt=0;
if dzs then begin
tsell(1,0,mkt);
extgbdataset(\'dcw\',0); 
end

//开空部份
kk:=tholding=0 and sjbm=0 and sc;
if kk then begin
tbuyshort(1,1,mkt);
extgbdataset(\'kcw\',-1); 
end
//平空与止损
kzs:=tholding<0 and extgbdata(\'kcw\')=-1  and dezt;
if kzs then BEGIN
tsellshort(1,0,mkt);
extgbdataset(\'kcw\',0); 
end
//本级别仓位无论手动自动平仓后均将本级别全局变量置为0
if tholding=0 then begin
extgbdataset(\'dcw\',0); 
extgbdataset(\'kcw\',0); 
end


--  作者:jinzhe
--  发布时间:2013/8/22 11:03:05
--  

sjbm

这个是在哪里定义的?


--  作者:lcgs005
--  发布时间:2013/8/22 11:15:11
--  
sjb=0这个去掉吧,可能之前的没清除掉
现在用的这个:

DIFF:=EMA(CLOSE,12) - EMA(CLOSE,26);
DEA:=EMA(DIFF,9);
MACD:=2*(DIFF-DEA);
mszt:=macd>=ref(macd,1);
dezt:=diff>=dea;
jc:=cross(diff,dea);
sc:=cross(dea,diff);
//多周期的开多与止损
kd:=tholding=0  and jc;
if kd then BEGIN
tbuy(1,1,mkt);
extgbdataset(\'dcw\',1); 
end
//平空与止损-若本级别仓位未被其它周期平掉则本周期仓位由本级别止损
dzs:=tholding>0 and extgbdata(\'dcw\')=1 and  dezt=0;
if dzs then begin
tsell(1,0,mkt);
extgbdataset(\'dcw\',0); 
end

//开空部份
kk:=tholding=0  and sc;
if kk then begin
tbuyshort(1,1,mkt);
extgbdataset(\'kcw\',-1); 
end
//平空与止损
kzs:=tholding<0 and extgbdata(\'kcw\')=-1  and dezt;
if kzs then BEGIN
tsellshort(1,0,mkt);
extgbdataset(\'kcw\',0); 
end
//本级别仓位无论手动自动平仓后均将本级别全局变量置为0
if tholding=0 then begin
extgbdataset(\'dcw\',0); 
extgbdataset(\'kcw\',0); 
end
[此贴子已经被作者于2013/8/22 11:15:35编辑过]

--  作者:jinzhe
--  发布时间:2013/8/22 13:30:42
--  

都加个ISLASTBAR试试,下面是添加之后的代码

 

 

WARNING_DISABLE:4;
DIFF:=EMA(CLOSE,12) - EMA(CLOSE,26);
DEA:=EMA(DIFF,9);
MACD:=2*(DIFF-DEA);
mszt:=macd>=ref(macd,1);
dezt:=diff>=dea;
jc:=cross(diff,dea);
sc:=cross(dea,diff);
//多周期的开多与止损

if tholding=0  and jc  and islastbar then BEGIN
tbuy(1,1,mkt);
extgbdataset(\'dcw\',1);
end
//平空与止损-若本级别仓位未被其它周期平掉则本周期仓位由本级别止损
dzs:=tholding>0 and extgbdata(\'dcw\')=1 and  dezt=0;
if dzs  and islastbar then begin
tsell(1,0,mkt);
extgbdataset(\'dcw\',0);
end
//开空部份
kk:=tholding=0  and sc;
if kk and islastbar then begin
tbuyshort(1,1,mkt);
extgbdataset(\'kcw\',-1);
end
//平空与止损
kzs:=tholding<0 and extgbdata(\'kcw\')=-1  and dezt;
if kzs and islastbar  then BEGIN
tsellshort(1,0,mkt);
extgbdataset(\'kcw\',0);
end
//本级别仓位无论手动自动平仓后均将本级别全局变量置为0

if tholding=0 and islastbar then begin
extgbdataset(\'dcw\',0);
extgbdataset(\'kcw\',0);
end

 


{
KD:=;          //开多条件
PD:=;          //平多条件
KK:=;          //开空条件
PK:=;          //平空条件


平空:SELLSHORT(PK,1,THISCLOSE);                  //平空信号
开多:BUY(KD AND HOLDING=0,1,THISCLOSE);          //开多信号
平多:SELL(PD,1,THISCLOSE);                       //平多信号
开空:BUYSHORT(KK AND HOLDING=0,1,THISCLOSE);     //开空信号

}
{
信号语句排列规则——先平后开
“费率设置”按钮——用于合理设置模型“费率”,以便在图形上正确输出如下帐户信息:

持仓:holding,linethick0;
资产:asset,noaxis;
可用现金:cash(0),linethick0;

您可以在查看菜单->交易系统模板 中设置自己需要的模板
}


--  作者:lcgs005
--  发布时间:2013/8/22 14:43:55
--  
加了islastbar仍然是0,

图片点击可在新窗口打开查看此主题相关图片如下:00.jpg
图片点击可在新窗口打开查看


--  作者:jinzhe
--  发布时间:2013/8/22 15:23:56
--  

if tholding=0 and islastbar then begin
extgbdataset(\'dcw\',0);
extgbdataset(\'kcw\',0);
end

 

 

删了这段就能赋值,具体如何处理明天开盘后我试试


--  作者:fly
--  发布时间:2013/8/22 15:27:45
--  

请运行在序列模式下


--  作者:fly
--  发布时间:2013/8/22 15:37:31
--  

以下是个范例,比你的还复杂呢,已验证,正常使用,推荐给您看看

 

 

用BARPOS和全局变量结合起来,控制是否开仓。

//序列模式运行

//t1_flag 0表示没有仓位,1表示持有多头,-1表示持有空头

//bar控制一根K线只能有一次开平仓

 

runmode:1;

ss:=1; //手数

maa:ema(c,5);

buycond:=h>maa;

sellcond:=l<maa;


//平多

if extgbdata(\'t1_flag\')>0 and sellcond  and barpos>extgbdata(\'bar\')  then

  begin

  tsell(1,ss,mkt);

  extgbdataset(\'t1_flag\',0);

  end


//平空

if extgbdata(\'t1_flag\')<0 and buycond and barpos>extgbdata(\'bar\')  then

  begin

  tsellshort(1,ss,mkt);

  extgbdataset(\'t1_flag\',0);

  end 


//开多

if extgbdata(\'t1_flag\')=0 and buycond then

  begin

  tbuy(1,ss,mkt);

  extgbdataset(\'t1_flag\',1);

  extgbdataset(\'bar\',barpos);

  end


//开空

if extgbdata(\'t1_flag\')=0 and sellcond then

    begin

    tbuyshort(1,ss,mkt);

    extgbdataset(\'t1_flag\',-1);

    extgbdataset(\'bar\',barpos);

    end

全局变量使用注意事项:

策略运行过程中,手动平仓进行干预,请到"工具--数据--全局变量"里,将对应的全局变量清0,否则会引起开平仓混乱

论坛帖子http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=48919