全部 TBQuant功能 TBL语言 TB开户 问答专区 其他
这段代码出现跨周期跟踪止损信号闪烁请问问题在哪里?
2021-11-19 10:19

Data0是选择的1小时周期,在程序里面subscribeBar 1天。

跨周期出现了信号闪烁,信号闪烁可能的原因有1.方向,2价格,3仓位,4买卖,我跟踪止损里面这4点都打印了一遍出来是固定死的,不知道为什么还是会出现信号闪烁,请教老师,谢谢您抽一点时间回答。

OnInit()
{
    SubscribeBar(Symbol, "1d", 20100101);
}
OnBar()
{
    Range[0:1]
    {
        atr = Average(TrueRange, ATRLength);
    }
    For layer = 0 To GetArraySize(indexs) - 1
    {
        if(indexs[layer] == 0)
        {
            Range[0:0]
            {
                // 追踪止损
                If(MarketPosition == 1)
                {
                    If(BarsSinceEntry == 0)                    // 开仓后第一根bar,直接等于开仓价
                    {
                        HighestAfterEntry = AvgEntryPrice;
                    }
                    Else If(BarsSinceEntry > 0)                // 之后的bar不断用最高和之前最高价做对比,赋值给开仓后最高价
                    {
                        HighestAfterEntry = Max(HighestAfterEntry[1], high[1]);
                    }
                    Else
                    {
                        HighestAfterEntry = HighestAfterEntry[1];
                    }
                    //跟踪止损平仓
                    If(MarketPosition == 1 and BarsSinceEntry > 0 and HighestAfterEntry - AvgEntryPrice > NATRstop*atr[1])         // 有多仓并且最低价已经低于开仓均线的xx 倍atr
                    {
                        If(low <= HighestAfterEntry - NATRstop*atr[1])
                        {
                            Sell(0, Min(Open, HighestAfterEntry - NATRstop*atr[1]));
                            Normal_trailing_long = True;
                            PlotString("trailing stop", "trailing stop", high*1.01, White);
                        }
                    }
                    // 硬止损平仓
                    If(MarketPosition == 1 and BarsSinceEntry > 0 and low <= AvgEntryPrice - NATRstop*atr[1]/ts)                // 只有硬止损时加上ts系数
                    {
                        MyExitPrice = Min(Open, AvgEntryPrice - NATRstop*atr[1]/ts);
                        Sell(0, MyExitPrice);
                        PlotString("HardStop", "HardStop", high*1.01, White);
                    }
                }
                Else If(MarketPosition == -1)
                {
                    If(BarsSinceEntry == 0)                    // 开仓后第一根bar,直接等于开仓价
                    {
                        LowestAfterEntry = AvgEntryPrice;
                    }
                    Else If(BarsSinceEntry > 0)                // 之后的bar不断用最低和之前最低价做对比,赋值给开仓后最低价
                    {
                        LowestAfterEntry = Min(LowestAfterEntry[1], low[1]);
                    }
                    Else                                    // 没有仓位时,保持上次价格信息,没有其他用途
                    {
                        LowestAfterEntry = LowestAfterEntry[1];
                    }
                    //跟踪止损平仓
                    If(MarketPosition == -1 and BarsSinceEntry > 0 and (AvgEntryPrice - LowestAfterEntry) > NATRstop*atr[1])         // 有空仓并且最高价已经大于开仓均线的xx 倍atr
                    {
                        If(high >= (LowestAfterEntry + NATRstop*atr[1]))
                        {
                            BuyToCover(0, Max(Open, LowestAfterEntry + NATRstop*atr[1]));
                            Normal_trailing_short = True;
                            PlotString("trailing stop", "trailing stop", high*1.01, White);
                            begins = False;
                            big_cond[0] = 0;
                        }
                    }
                    // 硬止损平仓
                    If(MarketPosition == -1 and BarsSinceEntry > 0 and high >= (AvgEntryPrice + NATRstop*atr[1]/ts))
                    {    
                        MyExitPrice = Max(Open, AvgEntryPrice + NATRstop*atr[1]/ts);
                        Print("MyExitPrice " + Text(MyExitPrice));
                        BuyToCover(0, MyExitPrice);
                        PlotString("HardStop", "HardStop", high*1.01, White);
                    }
                    
                }            
            }
        }
    }
}

下一篇: 代码编写
tblaocai

您好!您这个策略产生信号消失的原因是因为交易信号做了一个 if(indexs[layer] == 0)的判断,这样如果触发OnBar的数据源是data1,就会导致这个Tick,data0图层的交易信号没有执行,从而导致信号消失。

2021-11-22 11:09
shadowghost
@tblaocai

谢谢回复。我的data1日线只是用ATR来算仓位,出现信号闪烁是在在跟踪止损的时候,移动止损的逻辑只在data0里面。

2021-11-25 09:44
tblaocai
@shadowghost

这个不冲突,data1的数据更新,还是算data1的ATR,只要允许公式在Data0上产生交易信号就可以,就能避免Data0上的信号消失。

2021-11-25 10:29
shadowghost
@tblaocai

我的交易信号是在1小时周期data0上产生的。

另外如果我是跨周期一个tick过来应该会执行两遍onBar吧,所以我才加了一个layer来判断只执行一次range[0:0]和一次range[1:1]。

2021-11-25 10:57
tblaocai
@shadowghost

有两个数据源是会可能触发两次(如果两个数据源同时更新就触发一次),所以不能强制某次触发时跳过包含交易信号的代码,这样会导致信号消失。

2021-11-26 09:19
您未登录,请先 登录注册 后发表评论
顶部