分享

TB编程常见错误(二) 信号闪现

 蜡笔小签 2016-07-26

信号闪现

 

 

    信号闪现也是程序化交易中常见的问题,一般在测试中不会被发现,要在模拟或实盘交易中才会看出来。如果代码隐含了信号闪现的条件,那么会让整个测试无效,因为实盘的交易会与测试结果截然不同。

 

    例如上一篇提到的这行代码:
    If(Close <= StopLoss) Sell(1,Close);
    如果收盘价低于止损价,则在收盘价卖出。

   

    这里我举一个例子给大家说明信号闪现的表现:

    我们现在持有商品A,止损价定在8元。然后出现了这样的走势:开盘价10元,过了1分钟,冲高到12元,再过了2分钟下跌落到7元,最后的收盘价是11元。

    如果是测试,这笔止损交易是不会发生的,因为收盘价11元不满足止损条件。但如果这是模拟或实盘运行的时候,close在这根bar结束前,代表的是现价,也就是说,在创出最低价7元前,当现价是8元的时候,这止损条件会生效并诱发止损。当价格在8元或以下时,止损卖出信号会一直出现。但价格回升之后,信号会消失。
 
    信号闪现问题在国内的文华和TB都十分严重,尤其是TB。TB的仓位和下单分A函数和普通函数,A函数是基于实时账户和行情,普通函数则是读取图表。信号闪现会直接造成图表显示的仓位和与账户真实仓位不一致,导致后续的交易无法实现。
 
    例如上面的例子,信号闪现后,商品A已经平仓,但由于信号消失了,图表上还会显示持有仓位。这时,后面再出现平仓信号时,是无法交易的。同时,这也说明测试的交易结果会与现实非常不同!用严谨一点的说法来解释信号闪现的原因就是作为判断依据的数据有问题,会导致判断不稳定。基于这个原因,避免信号闪现的出现有两种办法。一,采用不会变更的数据,例如上一根K线已经走完,那么收盘价则不会再变。二,采用即使会变但不会改变判断的数据,例如当前最低价,如果当前最低价已经低于止损,那么即便后面的最低价创新低,也不会改变止损的判断。

 

    解决办法有很多,例如:
    If(Close[1] <= StopLoss) Sell(1,Open);
    如果上一根K线的收盘价低于止损价,则在当前的开盘价卖出平仓。这会比较接近于收盘平仓,因为如果不是休市或隔夜,比较小概率会出现缺口,上一根收盘和当前开盘会比较连续。

    If(Low <= StopLoss) Sell(1, StopLoss);
    如果当前最低价低于止损价,则在止损价卖出平仓。这是一种即时止损的方式,可以严格控制亏损幅度。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多