请问: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公式修改和重写的权利 //------------------------------------------------------------------------

用global 对象做buy sell 的信号条件,不管是tbq3,还是旗舰版,还是tbq,都是容易闪烁的。我觉得你似乎对这些数据结构的特点认知还不太够,要不再去把零基础课程里的相关内容复习下?

回复:你好,我主要疑问的是机制上的问题:SellShort已经执行过一次了,MP就应当就变成了-1后面这个判断进不进去已经无所谓了,图表信号应该就在那儿呀,为什么后面条件不满足了就会取消掉的

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

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

回复:好的,我在论坛上也搜索了一些相关贴子我改成Series<Numeric> MyPos试试🤝

按我的想法是,虽然成交后MyPos会变成1,会造成条件进不去但之前的SellShort信号应该在的,MarketPosition 应该等于-1但根据输出↓来看,MarketPosition 不是-1说明之前的SellShort没了