获取不到开盘基准价 大神们帮帮我几天没睡觉了
Params // 原策略参数 Numeric OffsetShort(50); Numeric OffsetLong(30); Numeric FirstLoss(50); Numeric SecondLoss(100); Numeric StopLoss(150); Vars Bool IsNightSession(true); Bool IsBasePriceSet(false); Numeric OpenPositionCount(0); Numeric TotalPositionCount(0); Numeric lastTradeDate; Numeric basePrice; // 用于存储基准价Events OnInit() { IsNightSession = true; OpenPositionCount = 0; TotalPositionCount = 0; lastTradeDate = TrueDate(0); } OnBar(ArrayRef<Integer> indexs) { Numeric currentTradeDate = TrueDate(0); // 如果是新的交易日,重置相关变量 if(currentTradeDate!= lastTradeDate) { IsBasePriceSet = false; OpenPositionCount = 0; TotalPositionCount = 0; lastTradeDate = currentTradeDate; } // 在 13:30 点开盘时确定基准价 If (Hour == 13 && Minute == 30 && Second == 0) { // 添加调试语句,标记即将获取开盘价并赋值 Print("即将在13:30获取开盘价并赋值"); Numeric openPrice = Q_Open(); // 获取开盘价 // 添加调试语句,打印获取到的开盘价 Print("13:30获取到的开盘价:" + Text(openPrice)); If (openPrice!= InvalidNumeric) // 检查是否有效 { basePrice = openPrice; // 将有效的开盘价存储到 basePrice 变量 IsBasePriceSet = true; } Else { // 处理获取开盘价无效的情况 Commentary("获取开盘价无效,无法确定基准价"); } } // 每天 21:00 重置相关标记(此部分逻辑与上面新交易日重置不冲突,可按需保留) If (Hour == 21 && Minute == 00 && Second == 0) { IsBasePriceSet = false; OpenPositionCount = 0; TotalPositionCount = 0; } // 添加调试语句,标记即将打印基准价 Print("即将打印基准价"); // 打印相关信息,使用 basePrice 变量显示基准价 Print("当前日期:" +(DateTimeTostring(currentdate+currenttime))); Print("当前价格:" + Text(Close)); Print("基准价格:" + Text(basePrice)); Print("市场仓位:" + Text(MarketPosition)); // 比较当前价格与基准价进行交易判断 If (IsBasePriceSet) { // 开仓逻辑 Numeric askPrice = Q_AskPrice(); // 获取卖一价 Numeric bidPrice = Q_BidPrice(); // 获取买一价 If (askPrice!= InvalidNumeric && bidPrice!= InvalidNumeric) // 检查是否有效 { If (MarketPosition == 0) { If (askPrice >= basePrice + OffsetShort) { SellShort(1, askPrice); OpenPositionCount = 1; TotalPositionCount = 1; Commentary("做空,卖一价高于基准价 " + Text(OffsetShort, 2) + " 点"); } Else If (bidPrice <= basePrice - OffsetLong) { Buy(1, bidPrice); OpenPositionCount = 1; TotalPositionCount = 1; Commentary("做多,买一价低于基准价 " + Text(OffsetLong, 2) + " 点"); } } // 持仓中处理补仓和止损逻辑 Else { Numeric Loss = Abs(Close - basePrice); If (MarketPosition == -1) { If (Loss >= FirstLoss && OpenPositionCount == 1) { SellShort(1, Close); OpenPositionCount = 2; TotalPositionCount = 2; Commentary("空仓第一次补仓,亏损达到 " + Text(FirstLoss, 2) + " 点"); } Else If (Loss >= SecondLoss && OpenPositionCount == 2) { SellShort(1, Close); OpenPositionCount = 3; TotalPositionCount = 3; Commentary("空仓第二次补仓,亏损达到 " + Text(SecondLoss, 2) + " 点"); } Else If (Loss >= StopLoss) { BuyToCover(TotalPositionCount, Close); OpenPositionCount = 0; TotalPositionCount = 0; Commentary("空仓止损,亏损达到 " + Text(StopLoss, 2) + " 点"); } } Else If (MarketPosition == 1) { // 多头补仓逻辑 If (Loss >= FirstLoss && OpenPositionCount == 1) { Buy(1, Close); OpenPositionCount = 2; TotalPositionCount = 2; Commentary("多仓第一次补仓,亏损达到 " + Text(FirstLoss, 2) + " 点"); } Else If (Loss >= SecondLoss && OpenPositionCount == 2) { Buy(1, Close); OpenPositionCount = 3; TotalPositionCount = 3; Commentary("多仓第二次补仓,亏损达到 " + Text(SecondLoss, 2) + " 点"); } Else If (Loss >= StopLoss) { Sell(TotalPositionCount, Close); OpenPositionCount = 0; TotalPositionCount = 0; Commentary("多仓止损,亏损达到 " + Text(StopLoss, 2) + " 点"); } } } } Else { // 处理获取买一价或卖一价无效的情况 Commentary("获取买一价或卖一价无效,无法进行交易判断"); } } }