图表策略优化为实盘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就市价挂单撮合成交了,成交价基本就是开盘价或者开盘价的对价。

第二就是检查信号错乱,挂单没有检查到我有持仓,一直挂单最后持仓变成几百手。

当然我自己的问题比较初级,希望哪位大神能帮我把图表策略完全实盘化就行,支付宝报号码直接转账,谢谢。

图表策略与A函数策略的衔接
求A函数的实盘策略学习最好是挂排队价的
策略是不是可以实盘了
A函数不能和图表策略写到一起吗?
图表有信号 实盘中不能发单
图表函数开仓价格问题
策略图表信号不对
图表与A函数
如何将小数转化为整数
如何获取实盘策略交易账户的全局风险度

注意到你发了2贴,意义不明