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线只开仓一次,还是出现闪烁,希望帮助解决
其实你代码有两个问题
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));
}
//完整代码。自己找不出来闪烁的原因,恳请老师帮忙,策略逻辑如下:
/*上下轨只做多策略,价格先达到上轨,当日就只做多一次,如果先碰触下轨,当日停止交易,即使后面再碰触上轨了也不做多了*/