以下是完整代码,我定义了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没了