有没有大神帮我看看,为什么这个总是信号闪烁,信号持仓和账户持仓不同步

Params Numeric closeHour(15); Numeric closeMinute(0);// 变量定义区Vars Numeric newprice; // 最新价格 Numeric opentime; // 开仓时间(时间戳) Numeric closeTotalSec; //收盘时间 Numeric openTotalSec; //开盘时间 Numeric TradeDate; //交易日期 Global Numeric RiskPoint(0.005); //风险点 Global Bool opened(False); // 标记是否已开仓 Series<Numeric> prentryPrice; // 记录开仓价格 Series<Numeric> openPrice; // 9:00开盘价 Series<Numeric> tradePrice; // 9:15开盘价 Series<Numeric> LastTradeDate; // 最后储存交易日 Series<Numeric> OpenPrice_0900(InvalidNumeric); // 09:00 的开盘价 Series<Numeric> OpenPrice_0915(InvalidNumeric); // 09:15 的开盘价 Series<Numeric> OpenPrice_1030(InvalidNumeric); //10:30 的开盘价// 事件处理区Events // 初始化:只执行一次 OnInit() { prentryPrice = 0; openPrice = 0; tradePrice = 0; openTotalSec = 9*3600 + 30*60; // 9:30开盘 closeTotalSec = 15*3600; // 15:00收盘 Print("OnInit: RiskPoint = " + Text(RiskPoint)); } // 每根K线闭合时触发(核心逻辑) OnBar(ArrayRef<Integer> indexes) { Numeric currentSec = Hour()*3600 + Minute()*60; // 获取当前时间和日期 TradeDate = TradingDate(); Commentary("当前日期:"+text(TradeDate)); // 过滤非交易日(周六=6,周日=0) TradeDate = TradingDate(); Commentary("当前日期:"+text(TradeDate)); // 过滤非交易日(周六=6,周日=0) If(WeekdayFromDateTime(Time) == 6 Or WeekdayFromDateTime(Time) == 0) Return; Commentary("最后储存日期:"+text(LastTradeDate)); // 检查是否为新的交易日,重置状态 If(TradeDate != LastTradeDate) { LastTradeDate = TradeDate; Commentary("修改后储存日期:"+text(LastTradeDate)); OpenPrice_0900 = 0; OpenPrice_0915 = 0; OpenPrice_1030 = 0; opened = False; } // 记录21:00开盘价 If(currentSec == 9*3600) { OpenPrice_0900 = Open; } // 记录21:15开盘价 If(currentSec == 9*3600 + 15*60) { OpenPrice_0915 = Open; } // 记录9:00开盘价 If(currentSec == 10*3600 + 30*60) { OpenPrice_1030 = Open; } // 2. 开仓逻辑:满足时间条件 + 价格条件 + 未开仓 If ( MarketPosition == 0 && opened == False ) { if(currentSec >= 9*3600 + 15*60 && currentSec <= 9*3600 + 18*60 && OpenPrice_0900 != InvalidNumeric) { If(OpenPrice_0915 < OpenPrice_0900) // 当前价格低于开盘价,做空,这个条件永远成立 { // 开空仓 SellShort(1, OpenPrice_0915); opened = True; prentryPrice = OpenPrice_0915; // 记录开仓价 Print("开空仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime())); } Else If(OpenPrice_0915 > OpenPrice_0900) // 当前价格高于开盘价,做多 { // 开多仓 Buy(1, OpenPrice_0915); opened = True; prentryPrice = OpenPrice_0915; // 记录开仓价 Print("开多仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime())); } Else // 价格相等,不开仓 { Print("价格与开盘价相等,今日不开仓"); } } if(currentSec >= 10*3600 + 30*60 && currentSec <= 10*3600 + 33*60 && OpenPrice_0900 != InvalidNumeric)//currentTotalSec == 10*3600 + 30*60 { If(OpenPrice_1030 < OpenPrice_0900) { // 开空仓 SellShort(1, OpenPrice_1030); opened = True; prentryPrice = OpenPrice_1030; // 记录开仓价 Print("开空仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime())); } Else If(OpenPrice_1030 > OpenPrice_0900) // 当前价格高于开盘价,做多 { // 开多仓 Buy(1, OpenPrice_1030); opened = True; prentryPrice = OpenPrice_1030; // 记录开仓价 Print("开多仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime())); } Else // 价格相等,不开仓 { Print("价格与开盘价相等,今日不开仓"); } } } // 3. 止损逻辑(独立于开仓逻辑,已开仓时持续检查) If(opened == True && MarketPosition != 0) { // 空单止损:价格从下方涨到开仓价的(1+0.5%)以上,即亏损达到0.5% If(MarketPosition == -1 && High >= prentryPrice * (1 + RiskPoint)) { BuyToCover(0, High); // 平空仓 opened = False; Commentary("止损平仓(做空): 数量: " + "1" + ", 时间: " + Text(Time) + ", 价格: " + Text(High)); prentryPrice = 0; } // 多单止损:价格从上方跌到开仓价的(1-0.5%)以下,即亏损达到0.5% If(MarketPosition == 1 && Low <= prentryPrice * (1 - RiskPoint)) { Sell(0, Low); // 平多仓 opened = False; Commentary("止损平仓(做多): 数量: " + "1" + ", 时间: " + Text(Time) + ", 价格: " + Text(Low)); prentryPrice = 0; } } // 4. 收盘前10分钟强制平仓 If( opened == True && currentSec >= 14*3600 + 50*60 && MarketPosition != 0)//currentTotalSec >= 14*3600 + 50*60 { If(MarketPosition == 1) { //Print("准备平仓,时间:" + Text(CurrentTime())); Sell(0,Open); //Print("平仓指令已发送,MarketPosition = " + Text(MarketPosition)); Commentary("平仓(做多): 数量: " + " 1 " + ", 时间: " + Text(Time)); opened = False; prentryPrice = 0; } IF(MarketPosition == -1) { BuyToCover(0,Open); opened = False; prentryPrice = 0; Commentary("平仓(做空): 数量: " + " 1 " + ", 时间: " + Text(Time)); } } }

您好,粗略看了下,大致问题可能出在,用全局变量来控制是否开仓。

回复:满足平仓条件,平仓后(2),下个Tick再运行公式,就会因为条件(1)不满足而不执行,这样平仓信号就消失了。这就是这种场合一般用序列来控制,而不用全局变量来控制的原因。