以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  金字塔软件问题提交  (http://222.73.7.161/bbs/list.asp?boardid=2)
----  预警系统的一个BUG  (http://222.73.7.161/bbs/dispbbs.asp?boardid=2&id=12985)

--  作者:Marcus
--  发布时间:2012/7/18 16:43:40
--  预警系统的一个BUG
 出于稳定性考虑,我一直使用V2.75版本,目前在本地预警系统上发现了一个小麻烦。

我使用变量PositionCount来控制策略的逻辑仓位,然后拿逻辑仓位和账户实际仓位对比再完成仓位矫正,同时用PositionCount作为下单条件防止多个信号出现重复下单的问题。大体的代码是这样写的:

variable: PositionCount=0; //初始化为空仓
HOW:=1;//固定开仓一手

//仓位矫正
LH:=TBUYHOLDINGEX(ACCOUNTID, \'IF08\',1);
SH:=TSELLHOLDINGEX(ACCOUNTID,\'IF08\',1);
if abs(LH-SH-PositionCount)>0.01 then begin
    DEBUGOUT(\'Found suspicious position count %.0f!\',PositionCount);
end

//开多
if BUYSIGNAL then begin
    if abs(PositionCount)<0.01 then begin
        TBUY(1,HOW,LMT,Close,0,ACCOUNTID),TFILTER;
        PositionCount:=HOW;
        DEBUGOUT(\'TBUY = %.0f\',HOW);
        DEBUGOUT(\'Position count = %.0f\',PositionCount);
    end
end


出现BUYSIGNAL后下单正常成交,PositionCount被设置成1。问题出现在次周期,系统输出PositionCount=0的警告,这样如果再次出现买入信号,就会再次下单,突破仓位限制造成持仓风险过大的麻烦。

这样的情况有些交易日出现,有些交易日正常。单个策略运行时当然可以在每周期开始前根据实际仓位矫正逻辑仓位,但在多个策略同时运行或者有人工操盘时时,实际仓位并不能知道哪个逻辑仓位出了问题也就没法矫正了。

请问各位有什么更好的办法可以避免这个问题?

[此贴子已经被作者于2012-7-18 16:45:47编辑过]

--  作者:just
--  发布时间:2012/7/19 9:09:41
--  

用这个EXTGBDATA函数 定义positioncount试试


--  作者:Marcus
--  发布时间:2012/7/19 21:57:23
--  
以下是引用just在2012-7-19 9:09:41的发言:

用这个EXTGBDATA函数 定义positioncount试试

谢谢提醒。
看过说明文档了,应该用全局变量。

--  作者:Marcus
--  发布时间:2012/7/20 13:54:47
--  
 新问题出现了
我设置了全局变量PC_IF,策略运行前获取仓位并在策略运行结束后更新仓位

//策略运行前,获取当前仓位
PositionCount:=EXTGBDATA(\'PC_IF\');

//策略运行区。。。

//策略运行后,更新仓位指标
if abs(PositionCount-EXTGBDATA(\'PC_IF\'))>0.01 then begin
    EXTGBDATASET(\'PC_OSCMTM_IF\',PositionCount);
    DEBUGOUT(\'Set GB position count = %.0f\',PositionCount);
end

但不知为何,无论我怎么修改全局变量下的PC_IF值,都不会影响到实际数值。。。

一个现实的例子,实际仓位IF08为-1,PC_IF为0,两者不一致需要手工矫正。我人工修改对话框“全局变量”中的“PC_IF”值为-1,按确定貌似一切正常。但调试窗口输出PositionCout值为0,打开“全局变量”对话框一看,又被自动修正成0了。可以肯定的是没有调用EXTGBDATASET,因为没有对应的调试语句输出。所以我认为问题出在对话框并不能修正内部数据,仅仅是个显示窗口而已。

[此贴子已经被作者于2012-7-20 13:58:16编辑过]

--  作者:Marcus
--  发布时间:2012/7/20 13:57:07
--  
 说着说着发现补历史数据补出大问题,输入数据出错导致信号一片混乱。。。


--  作者:just
--  发布时间:2012/7/20 14:03:18
--  

补什么历史数据出现问题? 什么周期 什么品种 多长时间。

至于变量问题,把能反映问题的代码 贴上来  我们测试看看。


--  作者:Marcus
--  发布时间:2012/7/20 15:34:58
--  
以下是引用just在2012-7-20 14:03:18的发言:

补什么历史数据出现问题? 什么周期 什么品种 多长时间。

至于变量问题,把能反映问题的代码 贴上来  我们测试看看。

首先申明我用的是V2.75版,版本不同可能会不一样。

中午用补数据的方式补了1分钟最近两天的数据,结果19号10:30-11:00这个位置出了问题,可以看截图。其他品种也有问题,时间点不一。
图片点击可在新窗口打开查看

至于变量问题,涉及到保密需要修改一下做一个类似的简单策略,如果明天能重现的话再贴上来。


[此贴子已经被作者于2012-7-20 15:40:10编辑过]

--  作者:Marcus
--  发布时间:2012/7/20 15:40:39
--  

图片点击可在新窗口打开查看此主题相关图片如下:wrong.png
图片点击可在新窗口打开查看
 
--  作者:Marcus
--  发布时间:2012/7/23 10:13:23
--  
 上周五的问题重现,就连新写的一个简单的3分钟预警模块也出错,开空后GB数据被设置成-1,次周期一读出来就变成了0;或者反手开仓后设置成1,次周期读出来依旧为-1.
另外金子塔预警系统的提前若干秒下单,不明白内部是单线程还是多线程设置,有没有可能会对全局变量数据库不当操作?

12.07.23 09:30:55 IF09
TBuyShort 已成功触发下单操作 价格:0 数量:1
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:testbug.rar


12.07.23 09:30:55 IF09
TSELL = 1
12.07.23 09:30:55 IF09
Position count = -1
12.07.23 09:30:55 IF09
Set GB position count = -1
12.07.23 09:30:55 IF09
运行结束

12.07.23 09:31:55 IF09
Found suspicious position count -1!
12.07.23 09:31:55 IF09
Found account position short -1!
12.07.23 09:31:55 IF09
Found wrong position count 0!
12.07.23 09:31:55 IF09
TSELL = 1
12.07.23 09:31:55 IF09
Position count = -1
12.07.23 09:31:55 IF09
Set GB position count = -1
12.07.23 09:31:55 IF09
运行结束


--  作者:just
--  发布时间:2012/7/23 12:20:14
--  

数据补充问题,我这里本地试了一下 没有发现问题,如果有必要可以 联系我们客服 远程协助。