以文本方式查看主题

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

--  作者:xiebooo
--  发布时间:2016/3/2 14:32:07
--  全局变量出错
这个问题我自己实在解决不了,请帮忙看看,可能比较复杂费脑,提前抱歉并谢谢啦!

我为了在一个品种内实现同一策略不同参数进行相对独立的交易,而使用重启程序仍能保存的全局变量(extgbdata类型)来记录各组参数对应的仓量和平仓价格,来避免tholding只能显示所有持仓总和的结果的问题。可以看作5个相对独立的策略在同一个品种上跑。在最下面贴出了第2组策略的代码,其他4组都是一样的。

昨天晚上出现了一个bug,如下图,白糖第2组参数连续产生了2次开多,都下单且成交了,造成了持仓的变化。但是按照下面贴出来的代码,同一组开多之后,在全部平掉之前,不应该再出现开仓了。

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

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

可以判断这两笔开多都是由第2组参数触发的,判断依据:
1. 触发这两笔开多的价格是5365和5364,只符合第2组参数的开仓条件;
2. 检查全局变量的值,baitang1c = 36, baitang2c = 38,3c、4c、5c=0,但是实际持仓=112=36+38*2

上面情况表明,第2组参数莫名其妙开了第2次仓,请问这可能是什么导致的?我觉得有可能是某种原因导致 baitang2c的值被清零了,程序判断第2组参数没有持仓,因而可以开仓,但这怎么会发生呢?贴部分代码只是为了阅读清晰,如果需要我也不介意把全部代码贴出。

----------------------------------------------------------------------------
INPUT: 2ent(0.7,0.1,1.5,0.2); //进场条件
INPUT: 2ext(3,0.5,5,0.3); //离场条件
INPUT: 2inir(0.001,0,0.03,0.001); //止损限额

2c:= extgbdata(\'baitang2c\'); //第2组参数仓量
2p:= extgbdata(\'baitang2p\'); //第2组参数平仓价格
2j:= extgbdata(\'baitang2j\'); //第2组参数持仓期间极值

//品种内第2套参数的交易代码
if 2c > 0 then begin
if close > 2j then 2j := close; //更新极值
if (2j - 2ext * atr) > 2p then 2p := 2j - 2ext * atr; //更新平仓价格
if close <= ceiling(2p) then begin //平仓并清零所有全局变量
tsell(1, 2c, mkt);
2j := 0;
2p := 0;
2c := 0;
end;
extgbdataset(\'baitang2c\', 2c); //全局变量清零
extgbdataset(\'baitang2p\', 2p);
extgbdataset(\'baitang2j\', 2j);
end;
if 2c < 0 then BEGIN
if close < 2j then 2j := close; //更新极值
if (2j + 2ext * atr) < 2p then 2p := 2j + 2ext * atr; //更新平仓价格
if close >= floor(2p) then begin //平仓并清零所有全局变量
tsellshort(1, abs(2c), mkt);
2j := 0;
2p := 0;
2c := 0;
end;
extgbdataset(\'baitang2c\', 2c); //清零全局变量
extgbdataset(\'baitang2p\', 2p);
extgbdataset(\'baitang2j\', 2j);
end;
if 2c = 0 then begin
if close >= floor(ou2) then begin //开多条件
2j := close; //记录开仓后极值
2p := close - inistop * atr; //计算初始平仓价格
2c := round((tasset * 1inir) / (inistop * atr * MULTIPLIER)); //计算仓量
tbuy(1, 2c, mkt); //开仓
extgbdataset(\'baitang2c\', 2c); //记录全局变量的最新值
extgbdataset(\'baitang2p\', 2p);
extgbdataset(\'baitang2j\', 2j);
end;
if close <= ceiling(od2) then begin //开空条件
2j := close; //记录开仓后极值
2p := close + inistop * atr; //计算初始平仓价格
2c := round((tasset * 1inir) / (inistop * atr * MULTIPLIER)); //计算仓量
tbuyshort(1, 2c, mkt); //开仓
extgbdataset(\'baitang2c\', -2c); //记录全局变量的最新值
extgbdataset(\'baitang2p\', 2p);
extgbdataset(\'baitang2j\', 2j);
end;
end;

--  作者:xiebooo
--  发布时间:2016/3/2 14:40:01
--  
前面的代码没有调整格式,可能阅读不方便,下面的整理了格式会清晰很多
------------------------------------------------------------------------------------------------------
INPUT: 2ent(0.7,0.1,1.5,0.2); //进场条件
INPUT: 2ext(3,0.5,5,0.3); //离场条件
INPUT: 2inir(0.001,0,0.03,0.001); //止损限额

2c:= extgbdata(\'baitang2c\'); //第2组参数仓量
2p:= extgbdata(\'baitang2p\'); //第2组参数平仓价格
2j:= extgbdata(\'baitang2j\'); //第2组参数持仓期间极值

//品种内第2套参数的交易代码
if 2c > 0 then begin
if close > 2j then 2j := close; //更新极值
if (2j - 2ext * atr) > 2p then 2p := 2j - 2ext * atr; //更新平仓价格
if close <= ceiling(2p) then begin //平仓并清零所有全局变量
tsell(1, 2c, mkt);
2j := 0;
2p := 0;
2c := 0;
end;

extgbdataset(\'baitang2c\', 2c); //全局变量清零
extgbdataset(\'baitang2p\', 2p);
extgbdataset(\'baitang2j\', 2j);

end;
if 2c < 0 then BEGIN
if close < 2j then 2j := close; //更新极值
if (2j + 2ext * atr) < 2p then 2p := 2j + 2ext * atr; //更新平仓价格
if close >= floor(2p) then begin //平仓并清零所有全局变量
tsellshort(1, abs(2c), mkt);
2j := 0;
2p := 0;
2c := 0;
end;
extgbdataset(\'baitang2c\', 2c); //清零全局变量
extgbdataset(\'baitang2p\', 2p);
extgbdataset(\'baitang2j\', 2j);
end;
if 2c = 0 then begin
if close >= floor(ou2) then begin //开多条件
2j := close; //记录开仓后极值
2p := close - inistop * atr; //计算初始平仓价格
2c := round((tasset * 1inir) / (inistop * atr * MULTIPLIER)); //计算仓量
tbuy(1, 2c, mkt); //开仓
extgbdataset(\'baitang2c\', 2c); //记录全局变量的最新值
extgbdataset(\'baitang2p\', 2p);
extgbdataset(\'baitang2j\', 2j);
end;
if close <= ceiling(od2) then begin //开空条件
2j := close; //记录开仓后极值
2p := close + inistop * atr; //计算初始平仓价格
2c := round((tasset * 1inir) / (inistop * atr * MULTIPLIER)); //计算仓量

tbuyshort(1, 2c, mkt); //开仓
extgbdataset(\'baitang2c\', -2c); //记录全局变量的最新值
extgbdataset(\'baitang2p\', 2p);
extgbdataset(\'baitang2j\', 2j);
end;

end;

--  作者:jinzhe
--  发布时间:2016/3/2 14:49:08
--  
不要在图表上运行你的后台策略,尤其是这种需要extgbdata全局变量计算的,图表上也会运行从而影响到后台,有问题用后台调试问题
--  作者:xiebooo
--  发布时间:2016/3/2 14:51:26
--  
你是说不要在主窗口上打开后台程序化监测的品种?10分钟前重复下单的情况又出现了
[此贴子已经被作者于2016/3/2 14:52:01编辑过]

--  作者:jinzhe
--  发布时间:2016/3/2 15:01:57
--  
不要这样干,把你的后台公式放到图表上
图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看