请大师帮忙看看为何不能再开拓者软件上显示开仓平仓箭头
//------------------------------------------------------------------------// 简称: SAR_Fixed_Complete_V3// 名称: 抛物线转向固定仓差策略(Commentary信号版)//------------------------------------------------------------------------Params Numeric N(1); // 目标仓差手数 Numeric AfStep(0.04); // SAR加速因子步长 Numeric AfLimit(0.2); // SAR加速因子上限Vars // 持仓变量 Numeric myLongPosition; // 当前多头持仓 Numeric myShortPosition; // 当前空头持仓 Global Numeric myPreLongPosition; // 昨日剩余多仓 Global Numeric myPreShortPosition; // 昨日剩余空仓 // SAR指标变量 Numeric oParCl; // SAR当前值 Numeric oParOp; // SAR操作点 Numeric oPosition; // SAR趋势方向 Numeric oTransition; // 反转标志 // 辅助变量 Numeric lots; // 可用资金可开手数 Numeric targetNetPos; // 目标净持仓 Numeric curNetPos; // 当前净持仓 Numeric adjustVolume; // 需调整的净手数 // 信号锁与每日重置 Global Numeric signalTriggered; // 1=已触发,0=未触发 Global Numeric lastBarDate; // 上一次Bar日期 // --- 用于标记信号的变量 --- Numeric buySignal; // 做多信号(开多或平空) Numeric sellSignal; // 做空信号(开空或平多)Events OnInit() { Position pos; myPreLongPosition = pos.longYesterdayVolume; myPreShortPosition = pos.shortYesterdayVolume; signalTriggered = 0; lastBarDate = 0; } OnBar(ArrayRef<Integer> indexs) { Range[0:DataSourceSize() - 1] { // 1. 每日更新昨日持仓和重置信号锁 if (lastBarDate != Date) { Position pos; myPreLongPosition = pos.longYesterdayVolume; myPreShortPosition = pos.shortYesterdayVolume; lastBarDate = Date; signalTriggered = 0; } // 2. 计算可用资金可开手数 Account avb; Numeric contractValue = Open * ContractUnit * BigPointValue; if (contractValue > 0) lots = IntPart(avb.Available / contractValue); else lots = 0; // 3. 计算SAR指标 ParabolicSAR(AfStep, AfLimit, oParCl, oParOp, oPosition, oTransition); PlotAuto("ParCl", oParCl, 0, Rgb(185,150,0), Enum_Dot); // 4. 获取当前实时持仓 Position pos; myLongPosition = pos.LongCurrentVolume; myShortPosition = pos.ShortCurrentVolume; curNetPos = myLongPosition - myShortPosition; // --- 初始化信号变量 --- buySignal = 0; sellSignal = 0; // 5. 做多信号 If (MarketPosition <> 1 && oPosition == 1 && High > oParCl && signalTriggered == 0) { signalTriggered = 1; buySignal = 1; // 标记本Bar有多头交易信号 // 平昨日空头老仓 if (myPreShortPosition > 0) { BuyToCover(myPreShortPosition, Open); myShortPosition = myShortPosition - myPreShortPosition; if (myShortPosition < 0) myShortPosition = 0; myPreShortPosition = 0; } // 重新获取持仓 myLongPosition = pos.LongCurrentVolume; myShortPosition = pos.ShortCurrentVolume; curNetPos = myLongPosition - myShortPosition; targetNetPos = N; adjustVolume = targetNetPos - curNetPos; if (adjustVolume > 0) { Numeric buyLots = Min(adjustVolume, lots); if (buyLots > 0) { Buy(buyLots, Open); myLongPosition = myLongPosition + buyLots; lots = lots - buyLots; } Numeric remain = adjustVolume - buyLots; if (remain > 0 && myShortPosition > 0) { Numeric coverLots = Min(remain, myShortPosition); BuyToCover(coverLots, Open); myShortPosition = myShortPosition - coverLots; } } else if (adjustVolume < 0) { Numeric sellLots = Min(-adjustVolume, myLongPosition); if (sellLots > 0) { Sell(sellLots, Open); myLongPosition = myLongPosition - sellLots; } Numeric remain = -adjustVolume - sellLots; if (remain > 0) { Numeric shortLots = Min(remain, lots); if (shortLots > 0) { SellShort(shortLots, Open); myShortPosition = myShortPosition + shortLots; } } } } // 6. 做空信号 If (MarketPosition <> -1 && oPosition == -1 && Low < oParCl && signalTriggered == 0) { signalTriggered = 1; sellSignal = 1; // 标记本Bar有空头交易信号 if (myPreLongPosition > 0) { Sell(myPreLongPosition, Open); myLongPosition = myLongPosition - myPreLongPosition; if (myLongPosition < 0) myLongPosition = 0; myPreLongPosition = 0; } myLongPosition = pos.LongCurrentVolume; myShortPosition = pos.ShortCurrentVolume; curNetPos = myLongPosition - myShortPosition; targetNetPos = -N; adjustVolume = targetNetPos - curNetPos; if (adjustVolume < 0) { Numeric sellLots = Min(-adjustVolume, myLongPosition); if (sellLots > 0) { Sell(sellLots, Open); myLongPosition = myLongPosition - sellLots; } Numeric remain = -adjustVolume - sellLots; if (remain > 0) { Numeric shortLots = Min(remain, lots); if (shortLots > 0) { SellShort(shortLots, Open); myShortPosition = myShortPosition + shortLots; } } } else if (adjustVolume > 0) { Numeric buyLots = Min(adjustVolume, lots); if (buyLots > 0) { Buy(buyLots, Open); myLongPosition = myLongPosition + buyLots; } Numeric remain = adjustVolume - buyLots; if (remain > 0 && myShortPosition > 0) { Numeric coverLots = Min(remain, myShortPosition); BuyToCover(coverLots, Open); myShortPosition = myShortPosition - coverLots; } } } // --- 7. 使用 Commentary 函数生成图表信号标记 --- // 当 buySignal 为 1 时,调用 Commentary,图表上会自动出现一个信号标记 If(buySignal == 1) { Commentary("做多信号触发"); } // 当 sellSignal 为 1 时,调用 Commentary,图表上会自动出现一个信号标记 If(sellSignal == 1) { Commentary("做空信号触发"); } // 持续显示持仓信息 Commentary("多头=" + Text(myLongPosition) + " 空头=" + Text(myShortPosition)); Commentary("净持仓=" + Text(myLongPosition - myShortPosition)); } }