//------------------------------------------------------------------------
// 简称: KUAHEYUMOX
// 名称: 跨品种集合竞价模型(美原油→沥青)
// 类别: 策略应用
// 类型: 用户应用
// 输出: Void
// 说明:
// 夜盘阶段 (15:00~20:55):
// 记录沥青15:00收盘价、美原油15:00价格
// 若20:49前美原油未跌破15:00价格,则在20:55以沥青收盘价-50跳申报集合竞价多单
// 若跌破则放弃夜盘交易
// 日盘阶段 (23:00~次日08:55):
// 记录美原油23:00价格
// 若08:49前美原油未跌破23:00价格,则在08:55以前日沥青收盘价-50跳申报集合竞价多单
// 若跌破则放弃日盘交易
// 集合竞价开盘后若委托未成交,自动撤单
//------------------------------------------------------------------------
Params
// ----- 申报价格偏移 -----
Numeric offsetTicks(50); // 申报价格偏移量(相对沥青15点收盘价,单位:最小变动价位)
// ----- 定时器间隔 -----
Numeric checkInterval(60000); // 美原油监控定时器间隔(毫秒),默认60秒
// ----- 夜盘申报时间 -----
Numeric nightOrderHour(20); // 夜盘申报小时
Numeric nightOrderMinute(55); // 夜盘申报分钟
// ----- 日盘申报时间 -----
Numeric dayOrderHour(8); // 日盘申报小时
Numeric dayOrderMinute(55); // 日盘申报分钟
// ----- 夜盘检查截止时间 -----
Numeric nightCheckEndHour(20); // 夜盘检查截止小时
Numeric nightCheckEndMinute(49); // 夜盘检查截止分钟
// ----- 日盘检查截止时间 -----
Numeric dayCheckEndHour(8); // 日盘检查截止小时
Numeric dayCheckEndMinute(49); // 日盘检查截止分钟
// ----- 撤单延迟(秒) -----
Numeric cancelDelaySeconds(5); // 集合竞价开盘后等待N秒再撤单,给撮合留时间
// ----- 交易手数 -----
Numeric tradeLots(1); // 每次委托手数
Vars
// ----- 数据记录 -----
Numeric asphaltClosePrice; // 沥青15:00收盘价(当日夜盘及次日日盘共用)
Numeric crudeStartPrice; // 美原油起点价格(夜盘:15:00价格;日盘:23:00价格)
// ----- 状态标志 -----
Numeric nightCrudeBroken; // 夜盘美原油是否已跌破(0=未跌破,1=已跌破)
Numeric dayCrudeBroken; // 日盘美原油是否已跌破(0=未跌破,1=已跌破)
Numeric nightOrderPlaced; // 夜盘是否已申报(0=未申报,1=已申报)
Numeric dayOrderPlaced; // 日盘是否已申报(0=未申报,1=已申报)
// ----- 委托管理 -----
Numeric orderID; // 当前有效委托单ID
Numeric orderStatus; // 委托状态: 0=无委托, 1=已提交未成交, 2=已成交
Numeric orderPlacedSession; // 记录当前委托属于哪个时段: 1=夜盘, 2=日盘
// ----- 时段标识 -----
Numeric isNightSession; // 1=夜盘时段(15:00~次日凌晨), 0=日盘时段(23:00~次日)
// ----- 定时器ID -----
Global Integer timerId;
// ----- 辅助变量 -----
Numeric currentHour;
Numeric currentMinute;
Numeric currentSecond;
//------------------------------------------------------------------------
// 自定义函数区
//------------------------------------------------------------------------
Defs
// 获取当前系统时间(时、分、秒)
Void GetCurrentTime(NumericRef hour, NumericRef minute, NumericRef second)
{
Numeric now = CurrentTime();
hour = IntPart(now);
minute = IntPart((now - hour) * 100);
second = IntPart((now - hour - minute/100.0) * 10000);
}
// 检查美原油是否跌破起点价格(取最低价、买一价、收盘价的最小值)
Bool IsCrudeBroken(Numeric startPrice)
{
Numeric currentLow = data1.Low;
Numeric currentBid = data1.Bid;
Numeric currentPrice = data1.Close;
Numeric lowestCurrent = Min(currentLow, Min(currentBid, currentPrice));
Return lowestCurrent < startPrice;
}
// 获取沥青申报价格 = 沥青15点收盘价 - 偏移量 * 最小变动价位
Numeric GetOrderPrice()
{
Return asphaltClosePrice - offsetTicks * data0.MinMove;
}
// 执行集合竞价申报(限价买入开仓)
Void PlaceAuctionOrder(Numeric price, Numeric session)
{
If(orderStatus == 0)
{
orderID = A_SendOrder(Enum_Buy, Enum_Entry, tradeLots, price);
orderStatus = 1;
orderPlacedSession = session;
Comment(\"【集合竞价申报】时段=\" + IIfString(session==1,\"夜盘\",\"日盘\") +
\", 价格=\" + Text(price) + \", 委托号=\" + Text(orderID));
}
}
// 撤销未成交委托
Void CancelOrder()
{
If(orderStatus == 1)
{
A_DeleteOrder(orderID);
orderStatus = 0;
Comment(\"【撤单】委托号=\" + Text(orderID) + \", 原因=集合竞价超时未成交\");
}
}
//------------------------------------------------------------------------
// 事件函数区
//------------------------------------------------------------------------
Events
OnInit()
{
// 初始化所有变量
asphaltClosePrice = 0;
crudeStartPrice = 0;
nightCrudeBroken = 0;
dayCrudeBroken = 0;
nightOrderPlaced = 0;
dayOrderPlaced = 0;
orderID = 0;
orderStatus = 0;
orderPlacedSession = 0;
isNightSession = 0;
// 创建定时器(美原油监控)
timerId = CreateTimer(checkInterval);
// 数据源设置(data1为美原油加权,需手动添加)
Range[1:1]
{
AddDataFlag(Enum_Data_RolloverBackWard()); // 后复权,保证连续性
}
// 交易设置(可选)
// SetTradeLots(tradeLots);
// SetSlippage(Enum_Rate_PointPerHand, 1);
}
OnBar(ArrayRef<Integer> indexs)
{
Numeric barTime = data0.CurrentTime();
Numeric barHour = IntPart(barTime);
Numeric barMinute = (barTime - barHour) * 100;
// ========= 夜盘阶段初始化(15:00) =========
If(barHour == 15 And barMinute == 0 And asphaltClosePrice == 0 And isNightSession == 0)
{
asphaltClosePrice = data0.Close; // 记录沥青收盘价
crudeStartPrice = data1.Close; // 记录美原油起点价(15:00)
nightCrudeBroken = 0;
nightOrderPlaced = 0;
isNightSession = 1; // 进入夜盘模式
Comment(\"【夜盘启动】沥青收盘=\" + Text(asphaltClosePrice) +
\", 美原油起点=\" + Text(crudeStartPrice));
}
// ========= 日盘阶段初始化(23:00) =========
If(barHour == 23 And barMinute == 0 And isNightSession == 1)
{
crudeStartPrice = data1.Close; // 记录美原油新起点(23:00)
dayCrudeBroken = 0;
dayOrderPlaced = 0;
isNightSession = 0; // 切换到日盘模式
Comment(\"【日盘启动】美原油起点=\" + Text(crudeStartPrice));
}
}
OnTimer(Integer id, Integer intervalMillsecs)
{
// 获取当前时间
GetCurrentTime(currentHour, currentMinute, currentSecond);
// ========= 一、夜盘申报逻辑 =========
If(asphaltClosePrice != 0 And isNightSession == 1 And nightOrderPlaced == 0)
{
// 检查美原油是否跌破(持续监控)
If(IsCrudeBroken(crudeStartPrice))
nightCrudeBroken = 1;
// 到达夜盘检查截止时间(20:49后)进行最终判断
If(currentHour == nightCheckEndHour And currentMinute >= nightCheckEndMinute)
{
If(nightCrudeBroken == 0)
{
Numeric orderPrice = GetOrderPrice();
PlaceAuctionOrder(orderPrice, 1); // 1表示夜盘
nightOrderPlaced = 1;
} Else
{
Comment(\"【夜盘放弃】美原油已跌破起点 \" + Text(crudeStartPrice) + \",不参与交易\");
nightOrderPlaced = 1; // 标记已处理,避免重复判断
}
}
}
// ========= 二、日盘申报逻辑 =========
If(asphaltClosePrice != 0 And isNightSession == 0 And dayOrderPlaced == 0)
{
// 检查美原油是否跌破(持续监控)
If(IsCrudeBroken(crudeStartPrice))
dayCrudeBroken = 1;
// 到达日盘检查截止时间(08:49后)进行最终判断
If(currentHour == dayCheckEndHour And currentMinute >= dayCheckEndMinute)
{
If(dayCrudeBroken == 0)
{
Numeric orderPrice = GetOrderPrice();
PlaceAuctionOrder(orderPrice, 2); // 2表示日盘
dayOrderPlaced = 1;
} Else
{
Comment(\"【日盘放弃】美原油已跌破起点 \" + Text(crudeStartPrice) + \",不参与交易\");
dayOrderPlaced = 1;
}
}
}
// ========= 三、集合竞价未成交撤单逻辑 =========
If(orderStatus == 1)
{
// 根据委托所属时段确定开盘时间
Numeric auctionOpenHour = (orderPlacedSession == 1) ? 21 : 9;
Numeric auctionOpenMinute = 0;
// 判断是否已过开盘时间 + 延迟秒数
Bool isAfterOpen = False;
If(currentHour > auctionOpenHour)
isAfterOpen = True;
Else If(currentHour == auctionOpenHour And currentMinute > auctionOpenMinute)
isAfterOpen = True;
Else If(currentHour == auctionOpenHour And currentMinute == auctionOpenMinute And currentSecond >= cancelDelaySeconds)
isAfterOpen = True;
If(isAfterOpen)
{
CancelOrder();
Comment(\"【未成交撤单】开盘后等待 \" + Text(cancelDelaySeconds) + \" 秒仍未成交,已撤销\");
}
}
}
OnFill(FillRef ordFill)
{
// 成交时更新状态
If(ordFill.IsBuy And ordFill.OrderID == orderID)
{
orderStatus = 2;
Comment(\"【成交确认】集合竞价委托已成交,委托号=\" + Text(orderID));
}
}
OnOrder(OrderRef ord)
{
// 委托被撤销时重置状态
If(ord.IsDeleted And ord.OrderID == orderID)
{
orderStatus = 0;
Comment(\"【委托撤销确认】委托号=\" + Text(orderID));
}
}
OnExit()
{
// 策略退出时撤销所有未成交委托
If(orderStatus == 1)
CancelOrder();
Comment(\"【策略退出】清理完毕\");
}
//------------------------------------------------------------------------
// 编译版本 2026/5/12
// 版权所有 wangrenquan
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer策略修改和重写的权利
//------------------------------------------------------------------------
请用TBQ3这个内容帮我编写一套完整的全自动交易模型
美原油加权15点价格到20点49价格不跌破15点价格,内盘沥青期货15点收盘价为准到晚上20点55分自动提交集合竞价比15点收盘价低50个点申报挂单,要是美原油跌破了就不参与交易
早上以是一样,美原油23点到早上8点49分不跌破沥青8点55分参与集合竞价申报跌破了就不参与交易
要是集合竞价开盘后没有成交,就自动撤单。老师你说的对呀我还没有学会呀,我想用这个我自己的策略实现全自动交易。这个模型怎么写呀、老师帮帮忙呗
社区置顶帖里有收费代写服务的说明,根据说明操作
什么乱七八糟AI写的玩意,狗屁不通