欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件公式模型编写问题提交 → 全局变量出错

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有2338人关注过本帖树形打印复制链接

主题:全局变量出错

帅哥哟,离线,有人找我吗?
xiebooo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:165 积分:0 威望:0 精华:0 注册:2015/11/17 17:32:45
全局变量出错  发帖心情 Post By:2016/3/2 14:32:07    Post IP:101.254.236.229[只看该作者]

这个问题我自己实在解决不了,请帮忙看看,可能比较复杂费脑,提前抱歉并谢谢啦!

我为了在一个品种内实现同一策略不同参数进行相对独立的交易,而使用重启程序仍能保存的全局变量(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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:165 积分:0 威望:0 精华:0 注册:2015/11/17 17:32:45
  发帖心情 Post By:2016/3/2 14:40:01    Post IP:101.254.236.229[只看该作者]

前面的代码没有调整格式,可能阅读不方便,下面的整理了格式会清晰很多
------------------------------------------------------------------------------------------------------
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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:46311 积分:50819 威望:0 精华:2 注册:2011/3/23 8:50:25
  发帖心情 Post By:2016/3/2 14:49:08    Post IP:58.246.57.26[只看该作者]

不要在图表上运行你的后台策略,尤其是这种需要extgbdata全局变量计算的,图表上也会运行从而影响到后台,有问题用后台调试问题


金字塔—专业程序化交易量化投资平台

客户服务部

----------------------------------------------------------- 欢迎您参加我公司的技术培训,具体培训需求请发邮件到service@weistock.com

您的宝贵建议或者投诉,请发往邮箱:weiwei@weistock.com

 回到顶部
帅哥哟,离线,有人找我吗?
xiebooo
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:165 积分:0 威望:0 精华:0 注册:2015/11/17 17:32:45
  发帖心情 Post By:2016/3/2 14:51:26    Post IP:101.254.236.229[只看该作者]

你是说不要在主窗口上打开后台程序化监测的品种?10分钟前重复下单的情况又出现了
[此贴子已经被作者于2016/3/2 14:52:01编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
jinzhe
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:46311 积分:50819 威望:0 精华:2 注册:2011/3/23 8:50:25
  发帖心情 Post By:2016/3/2 15:01:57    Post IP:58.246.57.26[只看该作者]

不要这样干,把你的后台公式放到图表上
图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看


金字塔—专业程序化交易量化投资平台

客户服务部

----------------------------------------------------------- 欢迎您参加我公司的技术培训,具体培训需求请发邮件到service@weistock.com

您的宝贵建议或者投诉,请发往邮箱:weiwei@weistock.com

 回到顶部