同一根K线信号消失问题

Begin

       {

               If(High>=上轨)//突破上轨开多单

               {

                       Buy(lots,Max(Open,BuyPosition)+i_offset);

                       Return;

               }

        If(Low<=下轨)//突破下轨开空单

               {

                       SellShort(lots,Min(Open,SellPosition)-i_offset);

                       Return;

               }

       }

       If(MarketPosition == -1)


       {

               If(High>=上轨)//持有空单,突破上轨平空


               {

                       BuyToCover(lots,Max(Open,BuyPosition)+i_offset);

                       Return;

               }

       }

       If(MarketPosition == 1)

      {

              If(Low<=下轨)//持有多单,突破下轨平空

               {

                       Sell(lots,Min(Open,SellPosition)-i_offset);

                       Return;

               }

       }

End

上下轨突破策略,以上代码执行时出现问题,当开仓后,同一根K线价格反方向运行达到平仓时,信号消失,在同一根K线即开仓又平仓,怎样解决?

同一根K线信号闪烁的问题
同一根K线平仓和开仓问题
一根K线多信号
同一根bar信号出现开仓之后信号消失再出现又开仓如何解决?
获取同一根K线指标的最大值
关于信号消失的问题
最后一根K线在收盘前交易
平台是出现信号就下单吗? 如果K线走完信号又消失了怎么处理? 会自动平仓吗
当根K线是阳线,之后的K线出现阴线开空怎么处理编写逻辑?
在同根K线开仓+平仓,遇到问题

图表系统无法描述K线内部的情况

如果同时满足2种情况,K线不能展现先上还是先下,则根据程序顺序执行


解决方法:

1、你的交易周期需要更小的周期

2、使用更严格的条件去控制,比如当根出过信号不再出


Begin


If(BarsSinceToday == 0)

{

TriggeredShort = False; 控制单根K线只交易一次

}

If(MarketPosition == 0 && !TriggeredShort)//开仓

   {

If(Low<=SellPosition &&! TriggeredShort )//低于下轨开空

 {

  SellShort(lots,Min(Open,SellPosition));

  TriggeredShort = True;  // 标记触发

  Return;

 }      

  If(High>=BuyPosition &&! TriggeredShort )//高于上轨开多

{

 Buy(lots,Max(Open,BuyPosition)+i_offset);

 TriggeredShort = True;  // 标记触发

 Return;

}

  }

 

//平仓;

。。。。。。。

我用一个bool变量控制只开仓次数,还出现闪烁,什么原因?

你这个控制不住

图表交易函数

IF块任何条件改变

都大概率导致闪烁

这是机制问题


你要小周期数据

1 小到同一个bar不会同时触发多个信号

2 but/sell外面的IF块,里面的变量不得有任何改变,也就是说,同一个bar,IF()里永恒不变

原本High/Low被理论上用来锁定唯一性

避免闪烁

但也带来同一个bar高低点同时触发多个信号

第二套方案

你也可以考虑

1 📊设置为双向交易

允许多空同时开仓

2 当前bar刚开仓则不平仓

下一个bar再处理

谢谢

Params


Numeric K1(0.05);//声明数值参数k1,初值为0.5,其实就是上轨系数,当然不喜欢这个数值的可以根据自己统计结果改的。//


Numeric K2(0.25);//声明数值参数k2,初值0.5,即下轨系数。//


Numeric Mday(1);//声明数值参数Mday,初值为1.//


Numeric lots(1);//声明数值参数lots,初值1,其实就是买卖手数。//


Numeric offset(0);//声明数值参数offset,初值0。//


Numeric TimesMaxToday(1);  //限制当天开仓最多次数;




Vars


Numeric RangeX(0);//声明数值变量BuyRange,初值为0,即上轨幅度。//


Numeric BuyTrig(0);//声明数值变量BuyTrig,初值为0.//


Numeric SellTrig(0);//声明数值变量SellTrig,初值为0.//


Numeric HH;//声明数值变量HH。//


Numeric LL;//声明数值变量LL。//


Numeric HC;//声明数值变量HC。//


Numeric LC;//声明数值变量LC。//


Numeric i_offset;//声明数值变量i_offset。//


Numeric BuyPosition;//声明数值变量BuyPosition,即买入价格。//


Numeric SellPosition;//声明数值变量SellPosition,即卖出价格。//


Numeric myExitPrice;                    // 平仓价格


Numeric myPrePrice;                   //止盈价格


Series<Numeric> TimesToday(0);  //记录当天开仓次数;


Bool BarTraded(False);//控制一根k线只开一次仓


Bool TriggeredShort(False);// 空条件触发标记


Events


  onBar(ArrayRef<Integer> indexs)


  {    


 


      i_offset = offset*MinMove*PriceScale;//其实就是之前一直说的最小跳动价固定公式了,这里就多添加了参数offset而已,即可以让你滑点委托成交。//


      HH = Highest(HighD(1),Mday);//变量HH值即为昨天最高价。//


      HC = Highest(CloseD(1),Mday);//变量HC值即为昨天的收盘价。//


      LL = Lowest(LowD(1),Mday);//变量LL值为昨天最低价。//


      LC = Lowest(CloseD(1),Mday);//变量LC值为昨天收盘价。跟变量HC一样的。//


      RangeX=Max(HH - LC,HC - LL);//假如昨天最高价-昨天收盘价 >= 昨天收盘价-昨天最低价。//


     


      BuyTrig = K1*RangeX;//根据上面求得的,直接代入解读了。//


      SellTrig = K2*RangeX;//其实你看这两个公式都知道,上下幅度系数是一致的。//


 


      BuyPosition = OpenD(0)+BuyTrig;//上轨,即开盘价 + BuyTrig。//


      SellPosition = OpenD(0)-SellTrig;//下轨,即开盘价 - SellTrig。//


 


      PlotNumeric("BuyPosition",BuyPosition);//画线上轨。//


      PlotNumeric("SellPosition",SellPosition);//画线下轨。//




   If(BarsSinceToday == 0)


   {


    TimesToday = 0;


     TriggeredShort = False;


     BarTraded = False;//控制一根k线只开一次仓


   }




  If(MarketPosition == 0 &&TimesToday<TimesMaxToday)


     {


               If(!TriggeredShort &&!BarTraded &&Low<=SellPosition)


                     {


                       TriggeredShort = True;  // 标记触发


                        BarTraded = True;       // 锁定当前K线


                        Commentary("空条件触发,停止当日交易");


                        Return;


                     }


                If(!TriggeredShort &&!BarTraded &&High>=BuyPosition)//假如当前高价 >= 上轨。


                    {


    Buy(lots,Max(Open,BuyPosition)+i_offset);


            TimesToday = TimesToday+1;


    BarTraded = True;


                        Return;//返回,不执行了。//


                     }


     }


 


                 //平仓;


  If(MarketPosition==1)


  {


               if(Low <= SellPosition)


               {


                 Sell(lots, Min(Open, SellPosition) - i_offset);


                }


           


              Return;


  }


   Commentary("当天开仓次数="+Text(TimesToday));


  }


//完整代码。自己找不出来闪烁的原因,恳请老师帮忙,策略逻辑如下:


/*上下轨只做多策略,价格先达到上轨,当日就只做多一次,如果先碰触下轨,当日停止交易,即使后面再碰触上轨了也不做多了*/

你两个帖子交叉问

问题跟你说了


buy/sell模式,不需要你去控制,加了控制,反而制造了闪烁,多此一举弄巧成拙;即使要控制,普通变量也毫无意义


你好好看看给你的建议

先把基本机制理顺了

不要一味编码

越搞越错

ok