我为了在一个品种内实现同一策略不同参数进行相对独立的交易,而使用重启程序仍能保存的全局变量(extgbdata类型)来记录各组参数对应的仓量和平仓价格,来避免tholding只能显示所有持仓总和的结果的问题。可以看作5个相对独立的策略在同一个品种上跑。在最下面贴出了第2组策略的代码,其他4组都是一样的。
昨天晚上出现了一个bug,如下图,白糖第2组参数连续产生了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); //止损限额
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;