您现在的位置:程序化交易>> 期货公式>> (MC)multicharts>> MC知识>>正文内容

精华 回测中如何处理K线跳空问题 [MC]

  • MC用户求助: 回测中如何处理K线跳空问题
    (原创:Alex)

    K线跳空的问题,对于主力合约来说,多数是由于换月造成的,其它情况则是由于市场巨大波动造成的;对于这个问题,我们只能在回测中想办法使它对回测报告不产生影响,但是在实时行情中,这个没有办法自动避免,也就是说,如果是主力换月,那么可能需要您提前平仓处理一下,如果是市场巨大波动,那么这个是没有办法避免的。下面我们将对回测中出现的跳空进行探讨并且提出解决方案,使其过滤掉由于换月导致的回测报告不真实的部分。

    一、关键字ChangeMarketPosition

    关键字ChangeMarketPosition可以在图表上标注一个指定名称、价格和手数的指令信号。无论是否开启自动交易,此关键字产生的指令信号不会发到经纪商。完全的语句是ChangeMarketPosition(Delta, Price, Name),参数Delta表示指定要标注在图上的信号手数,参数Price表示价格,参数Name表示信号名称。

    二、测试代码 如下是在双均线交易策略中加入了处理K线跳空的代码。 inputs: Price( Close ), FastLength( 9 ), SlowLength( 18 ) ; variables: var0( 0 ), var1( 0 ) ;   var0 = AverageFC( Price, FastLength ) ; var1 = AverageFC( Price, SlowLength ) ;   condition1 = CurrentBar > 1 and var0 crosses over var1 ; if condition1 then                                                                              Buy ( "MA2CrossLE" ) next bar at market ;   condition1 = CurrentBar > 1 and var0 crosses under var1 ; if condition1 then                                                                              Sell Short ( "MA2CrossSE" ) next bar at market ; {以上都是双均线交易策略部分,下面是所加入的处理K线跳空的代码}   if open next bar>=close*1.008 or open next bar<=close*0.992 then begin {利用open next bar来获取下一根bar的开盘价,并且将它与当根bar的收盘价进行比较,当下一根bar的开盘价超过当根bar的收盘价0.008时,表示向上跳空;当下一根bar的开盘价低于当根bar的收盘价0.008时,表示向下踏空}   value2=0; for value1=0 to currententries-1 begin value2=value2+openentrycontracts(value1); end; {通过for循环来统计一下当前未平仓部位(也就是当前持仓)总共有多少手数}   if marketposition=1 then changemarketposition(-value2,close,"sell"); {如果当前持仓value2手数时,并且产生跳空,那么在当根bar的收盘价处执行关键字ChangeMarketPosition(也就是在图表上产生一个平仓指令),指定的手数是value2,方向是卖出,指令名称是”sell”}   if marketposition=-1 then changemarketposition(value2,close,"buytocover"); end; {如果当前持仓是-value2手数时,并且产生跳空,那么在当根bar的收盘价处执行关键字ChangeMarketPosition(也就是在图表上产生一个平仓指令),指定的手数是value2,方向是买入,指令名称是”buytocover”}

     

  • MC回复讨论一: if marketposition=1 then changemarketposition(-value2,close,"sell"); {如果当前持仓value2手数时,并且产生跳空,那么在当根bar的收盘价处执行关键字ChangeMarketPosition(也就是在图表上产生一个平仓指令),指定的手数是value2,方向是卖出,指令名称是”sell”}   “在图表上产生一个平仓命令”,即回测的时候会把跳空后的开仓的部位平掉,但是实盘中不会发送到交易所,只在本地执行,这样理解对吧?

     

  • MC回复讨论二:

    比如下一根bar(为方便叙述,下一根bar的编号为20)的开盘价与当根bar(为方便叙述,当根bar的编号为19)的收盘价对比,有很大跳空,那么可以在当根bar上执行关键字changemarketposition,使图表上当根bar(bar的编号为19)上平仓,这种只会对图表部位产生影响,不会实际发送委托单到交易所;通过这种方式,使回测绩效更接近策略本身的逻辑;即使是开启自动交易,也只是在图表上平仓,不会实际发送委托单到交易所。

     

  • MC回复讨论三:

    第一、您可以在公式编译器中查看关键字changemarketposition,它只会改变图表部位,也就是在当根bar上买卖一定的手数,也可以将之前图表的持仓平仓,但是不会实际发送委托单到交易所。只是改变图表部位。

    第二、无论是回测还是实盘交易中,都可以使用;举例,目前当根bar的编号为10(之前有持仓多头3手),而下一根bar人编号为11,并且这编号为11的bar相对于编号为10的bar有一个跳空,那么利用上面的代码使编号为10的bar上产生3手多头平仓,之后在编号为11的bar上,持仓就会为0。但是这只是改变图表部位的信息,并不会在跳空时将经纪商持仓3手平仓,而且策略代码很多关键字是根据图表进行取值,这样图表部位更改之后,策略代码的计算逻辑也相应的改变了。

    第三、上面的这个跳空做法,建议只使用在回测中,使绩效更接近实际。

     

  • MC回复讨论四:

    第一、您可以在公式编译器中查看关键字changemarketposition,它只会改变图表部位,也就是在当根bar上买卖一定的手数,也可以将之前图表的持仓平仓,但是不会实际发送委托单到交易所。只是改变图表部位。

    第二、无论是回测还是实盘交易中,都可以使用;举例,目前当根bar的编号为10(之前有持仓多头3手),而下一根bar人编号为11,并且这编号为11的bar相对于编号为10的bar有一个跳空,那么利用上面的代码使编号为10的bar上产生3手多头平仓,之后在编号为11的bar上,持仓就会为0。但是这只是改变图表部位的信息,并不会在跳空时将经纪商持仓3手平仓,而且策略代码很多关键字是根据图表进行取值,这样图表部位更改之后,策略代码的计算逻辑也相应的改变了。

    第三、上面的这个跳空做法,建议只使用在回测中,使绩效更接近实际。

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 511411198  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容