同一根K线信号闪烁的问题


Begin


If(BarsSinceToday == 0)

{

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

}


If(MarketPosition == 0)//开仓

   {

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;

}

  }

 

//平仓;


If(MarketPosition==1  )

{

if(Low<=SellPosition)

{

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

}

Return;        

}

If(MarketPosition==-1  )


 {

if(High>=BuyPosition)

 {

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

   Return;      

  }

End

以上突破策略,用bool变量控制在一根K线只开仓一次,还是出现闪烁,希望帮助解决

同一根K线信号消失问题
同一根K线平仓和开仓问题
一根K线多信号
关于信号闪烁的问题
关于信号闪烁的问题
信号闪烁问题
获取同一根K线指标的最大值
信号闪烁
信号闪烁问题
当根K线是阳线,之后的K线出现阴线开空怎么处理编写逻辑?

其实你代码有两个问题


1、你的控制变量是简单的变量

每次都会被初始化

也就是毫无意义


要用全局变量

onbaropen初始化一次

2、上个帖子里跟你说的

你的代码反复犯错

跟你说了

你回了个“谢谢”

然而并不改


解决思路

两个方案

上个帖子已经说的非常清楚了

https://bbs.tbquant.net/thread/20250318092637692966


上个帖子不是跟你说了?

如果光是回测角度而言

把交易放在更小的时间周期上


你IF块拿掉那个控制标志

应该反而不闪烁吧

buy/sell本身就会控制只交易一次


那个全局变量

等你用A函数

控制实盘账户发单一次就行了

你别用return

简单说明一下return逻辑造成的问题

if a :buy,return;

if b: sellshort,return;

伪代码,不要计较语法,意思很简单,a条件控制开多,b条件控制开空。

如果盘中b条件先达到,出现开空信号。

之后又达到了a条件,满足开多,然后return,那就不会执行开空代码了,所以空信号就消失了

自己再想想

好的,谢谢。我试试

If(MarketPosition == 0 &&TimesToday<TimesMaxToday)//一天只交易一次

  {

       If(!TriggeredShort&&Low<=SellPosition)//先碰触下轨,当日不管多空不再交易

                  {

                    TriggeredShort = True;  // 标记触发

                 }

             If(!TriggeredShort  &&High>=BuyPosition)//先碰触上轨,开多,当日只开多一次

                 {

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

         TimesToday = TimesToday+1;

          }

  }

以上代码去掉了return,还是闪烁,我的逻辑,上下轨只做多策略,价格先达到上轨,当日就只做多一次,如果先碰触下轨,当日停止交易,即使后面再碰触上轨了也不做多了,我 上面代码可以实现逻辑,但多信号有时闪烁,请老师解决问题。

解决信号闪烁问题必须有完整的代码和环境,通过一步一步调试去处理。

这个工作一般是自己完成的。

https://video.tbquant.net/video?id=20250310103731783228

这里有一期是是直播讲解一个信号闪烁实例,怎么排查出问题的地方,然后如何修改它。

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));

   }

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

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