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("获取买一价或卖一价无效,无法进行交易判断");
}
}
}
你这发了一大段代码,到底是要问那个地方的业务逻辑?
乱七八糟,完全瞎写。先去看看基础教学吧。
直接用Q_Open可以print 基准价(开盘价) 赋值了以后就没了