精华 回测中如何处理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 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容