请问:TBQ3中,使用Global变更做为信号条件会导致信号飘移

以下是完整代码,我定义了Global变量MyPos做为真实持仓,因为可能有发单但未成交的情况

在OnOrder中,根据成交情况,改变MyPos的值

目前使用的情况下看,//可以开仓条件 If(MarketPosition == 0 and MyPos == 0) 在这个条件中现象了问题

只要发单成交后, MyPos == 0 这个条件就会导致信号闪烁消失。


但我不明白的是:

从我的截图来看,开空是已经成交了,说明执行了SellShort,并且发单成交

这个时候就当是:MarketPosition = -1,MyPos = -1

图表信号已经产生,但实际上,报出了信号闪烁错误,并且产生头寸监控的报警


如图:9:48,空头信号产生,并且发了单,但49的时候,信号就丢失了,并且提示信号闪烁

实际已经报单成交

因为信号丢失,造成警报


Vars
    Global Integer MyPos(0);                 //真实仓位
    Series<Numeric> BuyPrice(0);
    Series<Numeric> SellPrice(0);
    
Events

    //代理信号事件,接管当前策略单元的所有信号
    OnSignal(ArrayRef<Signal> sigs)
    {
        // 非实时行情,不处理
        if (QuoteStatus <> Enum_QuoteStatus_RealTime)
        {
            Return;
        }

        Integer i = 0;
        For i = 0 To GetArraySize(Sigs) - 1
        {
            SignalRef sig = Sigs[i];
            If(!BitHas(sig.flag, Enum_Signal_NotSend) && QuoteStatus == Enum_QuoteStatus_RealTime)
            {
                //无持仓 但要求平仓 说明之前有未成交订单,则撤所有单
                if(MyPos == 0 and sig.combOffset == Enum_Exit)
                {
                    A_DeleteAccountOrder(0);
                }
                
                //无持仓 开仓
                if (MyPos == 0 and sig.combOffset == Enum_Entry)
                {
                    A_SendOrder(sig.side,sig.combOffset,sig.volume,sig.price);
                }            
                
                //有持仓 平仓
                if(MyPos <> 0 and sig.combOffset == Enum_Exit)
                {
                    A_SendOrder(sig.side,sig.combOffset,sig.volume,sig.price);
                }
            }
        }
    }

    //订单状态处理
    OnOrder(OrderRef ord)
    {
        //成交
        if (ord.status <> Enum_Filled)
            Return;
        
        //平仓
        if (ord.combOffset <> Enum_Entry)
        {
            MyPos = 0;
            Return;
        }
        
        //开仓
        else if(ord.combOffset == Enum_Entry)
        {
            // 买入
            if (ord.side == Enum_Buy)
            {                
                MyPos = 1;
            }
            
            // 卖出
            if (ord.side == Enum_Sell)
            {
                MyPos = -1;
            }
            
            Return;
        }
    }
    
        
    //Bar数据更新
    OnBar(ArrayRef<Integer> indexs)
    {
        
        //止损价 20周期低点
        BuyPrice = Highest(High[1],2);
        SellPrice = Lowest(Low[1],2);
        
                
        //可以开仓条件
        If(MarketPosition == 0 and MyPos == 0)
        {
            //开仓做多 趋势不向下 + 上穿高点
            if(CrossOver(High,BuyPrice))
            {
                Buy(1, BuyPrice);
            }
        
            if(CrossUnder(Low,SellPrice))
            {
                SellShort(1, SellPrice);
            }
        }
        
        //测试平仓
        if(MarketPosition ==1 and BarsSinceEntry>1)
        {
            Sell(1,Open);
        }
        
        if(MarketPosition ==-1 and BarsSinceEntry>1)
        {
            BuyToCover(1,Open);
        }
        
        PlotNumeric("BuyPrice",BuyPrice,0,DarkBrown);
        PlotNumeric("SellPrice",SellPrice,0,DarkBrown);
        
        //持仓方向(多)
        if(MarketPosition == 1)
        {
            PlotString("MarketPosition","↑",0,Red);
            PlotBool("MyPos",MyPos==1);
        }
        
        //持仓方向(多)
        else if(MarketPosition == -1)
        {
            PlotString("MarketPosition","↓",0,Green);   
            PlotBool("MyPos",MyPos==-1); 
        }
    }
//------------------------------------------------------------------------
// 编译版本    GS2010.12.08
// 版权所有    TradeBlazer Software 2003-2025
// 更改声明    TradeBlazer Software保留对TradeBlazer平
//            台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------


使用ma均线价格作为判断条件,导致信号闪烁
使用tbpy,什么原因会导致进程退出?
使用ma均线导致的信号闪烁如何处理
请问TBQ3有信号复核功能吗??
多图层导致的信号闪烁
关于A函数不能做为分支条件
信号闪烁 不能用Global ,怎么来解决
盘中信号还是会闪
反馈一个会导致BUG的问题
老师,请问信号闪烁时相同信号不重复发单,相同信号是如何定义的?

用global 对象做buy sell 的信号条件,不管是tbq3,还是旗舰版,还是tbq,都是容易闪烁的。

我觉得你似乎对这些数据结构的特点认知还不太够,要不再去把零基础课程里的相关内容复习下?

你好,我主要疑问的是机制上的问题:

SellShort已经执行过一次了,MP就应当就变成了-1

后面这个判断进不进去已经无所谓了,图表信号应该就在那儿呀,为什么后面条件不满足了就会取消掉的

marketposition等同于序列类型,序列类型每次驱动的时候,取的是上一根bar的终值,不是上一次运行的终值,这个就是在零基础课程里说明国的内容

你要求的这个机制是global这种数据结构的特点,不是序列类型的

好的,我在论坛上也搜索了一些相关贴子

我改成Series<Numeric> MyPos试试


🤝

按我的想法是,虽然成交后MyPos会变成1,会造成条件进不去

但之前的SellShort信号应该在的,MarketPosition 应该等于-1

但根据输出↓来看,MarketPosition  不是-1

说明之前的SellShort没了