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)不满足而不执行,这样平仓信号就消失了。这就是这种场合一般用序列来控制,而不用全局变量来控制的原因。