Params
Numeric closeHour(15);
Numeric closeMinute(0);
// 变量定义区
Vars
Numeric newprice; // 最新价格
Numeric opentime; // 开仓时间(时间戳)
Numeric closeTotalSec; //收盘时间
Numeric openTotalSec; //开盘时间
Numeric TradeDate; //交易日期
Numeric RiskPoint(0.005); //风险点
Series<Bool> opened(False); // 标记是否已开仓
Series<Numeric> prentryPrice; // 记录开仓价格
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;
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) // 当前价格低于开盘价,做空,这个条件永远成立
{
// 开空仓
//opened = True;
SellShort(1, OpenPrice_0915);
opened = True;
Commentary("1");
prentryPrice = OpenPrice_0915; // 记录开仓价
Print("开空仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime()));
}
Else If(OpenPrice_0915 > OpenPrice_0900) // 当前价格高于开盘价,做多
{
// 开多仓
//opened = True;
Buy(1, OpenPrice_0915);
opened = True;
Commentary("2");
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)
{
// 开空仓
//opened = True;
SellShort(1, OpenPrice_1030);
opened = True;
Commentary("3");
prentryPrice = OpenPrice_1030; // 记录开仓价
Print("开空仓成功,开仓价:" + Text(prentryPrice) + ",当前时间:" + Text(CurrentTime()));
}
Else If(OpenPrice_1030 > OpenPrice_0900) // 当前价格高于开盘价,做多
{
// 开多仓
//opened = True;
Buy(1, OpenPrice_1030);
opened = True;
Commentary("4");
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))
{
//opened = False;
BuyToCover(0, High); // 平空仓
opened = False;
Commentary("5");
Commentary("止损平仓(做空): 数量: " + "1" + ", 时间: " + Text(Time) + ", 价格: " + Text(High));
prentryPrice = 0;
}
// 多单止损:价格从上方跌到开仓价的(1-0.5%)以下,即亏损达到0.5%
If(MarketPosition == 1 && Low <= prentryPrice * (1 - RiskPoint))
{
//opened = False;
Sell(0, Low); // 平多仓
opened = False;
Commentary("6");
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()));
//opened = False;
Sell(0,Open);
opened = False;
Commentary("7");
Print("平仓指令已发送,MarketPosition = " + Text(MarketPosition));
Commentary("平仓(做多): 数量: " + " 1 " + ", 时间: " + Text(Time));
prentryPrice = 0;
}
IF(MarketPosition == -1)
{
//opened = False;
BuyToCover(0,Open);
opened = False;
Commentary("8");
prentryPrice = 0;
Commentary("平仓(做空): 数量: " + " 1 " + ", 时间: " + Text(Time));
}
}
}
您自己输出变量调试下,就可以发现
