同一根K线信号闪烁的问题
BeginIf(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线只开仓一次,还是出现闪烁,希望帮助解决
你别用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 这里有一期是是直播讲解一个信号闪烁实例,怎么排查出问题的地方,然后如何修改它。
回复:ParamsNumeric 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); //限制当天开仓最多次数;VarsNumeric 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)); }//完整代码。自己找不出来闪烁的原因,恳请老师帮忙,策略逻辑如下:/*上下轨只做多策略,价格先达到上轨,当日就只做多一次,如果先碰触下轨,当日停止交易,即使后面再碰触上轨了也不做多了*/