图表策略优化为实盘A函数策略红包200
//------------------------------------------------------------------------// 简称: 1Min_Correct// 名称: 反转策略(1分钟)-正确版//------------------------------------------------------------------------Params Numeric Lots(1); Numeric PriceOffset(1); Bool EnableLimitOrder(True);Vars Numeric prevClose; Numeric prevOpen; Bool prevIsYin(False); Bool prevIsYang(False); Numeric targetPrice; Bool needReverse(False); Bool orderExecuted(False); // 控制单根K线只执行一次Events OnBar(ArrayRef<Integer> indexs) { orderExecuted = False; // 每根K线重置 If(CurrentBar > 1 And orderExecuted == False) { prevClose = Close[1]; prevOpen = Open[1]; prevIsYin = (prevClose < prevOpen); prevIsYang = (prevClose > prevOpen); Commentary("K线" + Text(CurrentBar) + ": 前一根" + IIfString(prevIsYin, "阴柱", IIfString(prevIsYang, "阳柱", "平线"))); needReverse = False; If(MarketPosition == -1 And prevIsYin) needReverse = True; If(MarketPosition == 1 And prevIsYang) needReverse = True; // --- 统一的执行逻辑(确保单根K线只执行一次)--- // 情况1:需要反向操作(先平后开) If(needReverse And orderExecuted == False) { // 平仓操作 If(MarketPosition == -1) // 平空仓 { If(EnableLimitOrder) { targetPrice = Open - PriceOffset * MinMove * PriceScale; If(targetPrice >= Low) { BuyToCover(0, targetPrice); orderExecuted = True; Commentary("→ 限价平空仓:" + Text(targetPrice)); } } If(orderExecuted == False) // 限价单未成交,市价确保 { BuyToCover(0, Close); orderExecuted = True; Commentary("→ 市价平空仓"); } } Else If(MarketPosition == 1) // 平多仓 { If(EnableLimitOrder) { targetPrice = Open + PriceOffset * MinMove * PriceScale; If(targetPrice <= High) { Sell(0, targetPrice); orderExecuted = True; Commentary("→ 限价平多仓:" + Text(targetPrice)); } } If(orderExecuted == False) { Sell(0, Close); orderExecuted = True; Commentary("→ 市价平多仓"); } } // 平仓后立即开反向仓 If(orderExecuted And prevIsYin) // 开多仓 { If(EnableLimitOrder) { targetPrice = Open - PriceOffset * MinMove * PriceScale; If(targetPrice >= Low) { Buy(Lots, targetPrice); Commentary("→ 限价开多仓:" + Text(targetPrice)); } Else { Buy(Lots, Close); Commentary("→ 市价开多仓"); } } Else { Buy(Lots, Close); Commentary("→ 市价开多仓"); } } Else If(orderExecuted And prevIsYang) // 开空仓 { If(EnableLimitOrder) { targetPrice = Open + PriceOffset * MinMove * PriceScale; If(targetPrice <= High) { SellShort(Lots, targetPrice); Commentary("→ 限价开空仓:" + Text(targetPrice)); } Else { SellShort(Lots, Close); Commentary("→ 市价开空仓"); } } Else { SellShort(Lots, Close); Commentary("→ 市价开空仓"); } } } // 情况2:开新仓(无持仓时需要开仓) Else If(MarketPosition == 0 And orderExecuted == False) { If(prevIsYin) // 开多仓 { If(EnableLimitOrder) { targetPrice = Open - PriceOffset * MinMove * PriceScale; If(targetPrice >= Low) { Buy(Lots, targetPrice); orderExecuted = True; Commentary("→ 限价开多仓:" + Text(targetPrice)); } } If(orderExecuted == False) { Buy(Lots, Close); orderExecuted = True; Commentary("→ 市价开多仓"); } } Else If(prevIsYang) // 开空仓 { If(EnableLimitOrder) { targetPrice = Open + PriceOffset * MinMove * PriceScale; If(targetPrice <= High) { SellShort(Lots, targetPrice); orderExecuted = True; Commentary("→ 限价开空仓:" + Text(targetPrice)); } } If(orderExecuted == False) { SellShort(Lots, Close); orderExecuted = True; Commentary("→ 市价开空仓"); } } } // 情况3:继续持仓 Else If(orderExecuted == False) { Commentary("→ 继续持仓"); } } }上面是图表策略,1分钟反转策略。简单的讲就是上个K线是阳线,那么下根K线一开盘固定以开盘价+一跳开空单,挂限价单(类似于开盘第一时间排队价)等待成交,如果当根K线不成交,比如设置为挂单后的58秒或者当根K线的58秒,撤单挂市价单追单。第一步完成,无论如何,我都会有1手空单在手上,那么当根K线如果是阴线,触发在下一根K线开盘平仓,且开新多单,图表策略是先平后开仓,但是实盘中,平仓和开仓在这个策略里都是同向,为了保证挂单能更容易成交,那么这里选择平仓和开仓同时挂单,平空开多,价格都是新的K线的开盘价减一跳挂单。为什么选择新的K线开盘价平仓开仓,因为这样上一根K线已经结束,不会出现信号闪烁,新的K线第一个BAR已经确定开盘价,我希望的限价单也不会出现误差和问题。如果当根K线是阳线,继续持仓(第一根K线的空单),不操作,如果是十字星,不操作。策略行为表当前持仓前一根K线策略动作空仓(-1)阴线(↓)平空 + 开多(反转)多仓(+1)阳线(↑)平多 + 开空(反转)空仓(0)阴线(↓)开多空仓(0)阳线(↑)开空多仓(+1)阴线(↓)继续持多(不操作)空仓(-1)阳线(↑)继续持空(不操作)任意十字星不操作这张图十字的地方比较有代表性,前4根K线那根十字星(持仓遇到十字星不操作,但是开仓不影响),已经平空开多了,下一根K线十字星,不操作,再下一根K线是阴线,因为我是持有多单,继续持仓,直到我的标记的K线的左边那根K线,阳线,符合要求,那么就触发平多开空,所以在标记的那根K线,以开盘价+一跳,挂平多1手,挂开空1手,当根K线3085,开和平都是3086符合要求。这张图标记的前8根K线,平多开空了,然后一路都是阳线或者十字星,持续持仓到标记前的一根阴线,当这根阴线结束,没有任何信号干扰,确定需要平空开多,开盘价是3090,那么我需要挂3089的限价单,平空1手,开多1手,但是当根K线没有跌破开盘价,所以在当根K线结束的收盘价3092成交,也就是我希望实盘在当根K线结束前市价追单以确保成交,保证逻辑不混乱个人难点,我个人对A函数的理解不透彻,出现2个问题无法达到预期效果。第一就是跟图表一样,虽然信号显示是挂的限价单(排队价),但是模拟实盘中就是新K线的第一个BAR就市价挂单撮合成交了,成交价基本就是开盘价或者开盘价的对价。第二就是检查信号错乱,挂单没有检查到我有持仓,一直挂单最后持仓变成几百手。当然我自己的问题比较初级,希望哪位大神能帮我把图表策略完全实盘化就行,支付宝报号码直接转账,谢谢。