编译没问题,也关联了账户。为什么达到条件时,没有发出交易指令
以下代码不能自动下单请问需要改哪里?//------------------------------------------------------------------------Params Numeric topRatioOpen(0.99); // 空头开仓/多头反手比例 Numeric stopShortRatio(0.98); // 空头止赢平仓比例 Numeric reverseRatio(1.01); // 反手比例 Numeric stopLongRatio(1.02); // 多头止赢平仓比例 Numeric lots(6); // 交易手数 Numeric seedDate(20261022); // DTOP 种子日期(该日之后才开始交易) Numeric seedPrice(5040); // DTOP 种子价格 Numeric tradeEndDate(20261225); // 结束日: 该日之后不再交易 Integer accountIdx(0); // 交易账户下标 Integer pollMs(300); // 轮询间隔(毫秒), 越小越灵敏Vars Plot plt; // 绘图对象(叠加在K线主图, 标注信号价) Global Numeric gDTOP(0); // 上沿基准 Global Numeric gDBOTTOM(0); // 下沿基准 Global Numeric gTrackHigh(0); // 空仓期跟踪高点 Global Numeric gTrackLow(0); // 空仓期跟踪低点 Global Integer gState(0); // 0空仓 1空头 2多头 Global Integer gNextDir(0); // 下一方向限制: 1仅空 2仅多 0不限 Global Integer gFirstOpen(1); // 是否首次开仓 Global Position gPos; // 账户持仓快照 Global Array<Integer> gIds; // 委托单号收集 Global Integer gTimerId(-1); // 轮询定时器ID Global Bool gReadyDone(False); // OnReady 防重复 Global String gEvt(""); // 待标注: 事件名 Global Numeric gEvtPrice(0); // 待标注: 信号价 Global Bool gNeedPlot(False); // 待标注: 是否有待画标注DefsEvents OnInit() // 初始化事件: 策略启动时执行一次 { SetCloseMode("10s"); // 保留微周期(用于OnBar画标注) SetInitCapital(10000000); // 设置初始资金1000万 If(seedPrice > 0) // 若种子价>0 gDTOP = seedPrice; // 用种子价初始化上沿基准DTOP } OnReady() // 行情就绪事件: 数据准备完成后执行 { If(gReadyDone == False) // 若尚未初始化过(防重复执行) { A_SubscribeTradeByCreateSource(A_GetOrderCreateSource); // 订阅本策略产生的委托 gTimerId = CreateTimer(pollMs); // 启动毫秒轮询定时器 gReadyDone = True; // 标记已完成初始化 } } OnBar(ArrayRef<Integer> indexs) // 每根微周期K线触发(仅用于种子与标注, 不下单) { // 种子: 若用当日最高价作种子 Numeric td = TrueDate(0); // 取当前Bar的真正交易日 If(seedPrice == 0 And td == seedDate) // 若未给定种子价且到了种子日期 gDTOP = Max(gDTOP, High); // 用当日最高价累计更新DTOP // 把 OnTimer 中记录的信号价标注到当根K线 If(gNeedPlot) // 若存在待标注的信号价 { plt.setOption("信号价", "no-text", True); // 该标注不显示在工具栏 plt.text("信号价", gEvtPrice, gEvt + " " + Text(gEvtPrice)); // 在当根K标注 事件名+信号价 gNeedPlot = False; // 标注完成后复位标志 } } OnTimer(Integer id, Integer millsecs) // 定时器回调: 每 pollMs 毫秒触发一次, 做实时价检查与下单 { If(id != gTimerId) // 只处理本策略的定时器 Return; // 不是本策略的则直接返回 Numeric td = TrueDate(0); // 取当前交易日 If(gDTOP <= 0 Or td <= seedDate Or td > tradeEndDate) // 交易区间外不交易 Return; // 在区间外则直接返回 // 刷新账户持仓 A_GetPosition(gPos); // 获取账户持仓快照到 gPos // 有未成交委托则等待, 避免重复发单 If(gPos.longActiveVolume != 0 Or gPos.shortActiveVolume != 0 // 多头/空头有未成交开仓委托 Or gPos.longActiveCloseVolume != 0 Or gPos.shortActiveCloseVolume != 0) // 或有多头/空头未成交平仓委托 Return; // 存在未成交委托则本轮不发新单, 等待 Numeric px = Q_Last; // 最新价 If(px == InvalidNumeric Or px <= 0) // 若最新价无效或非正 Return; // 无效价则跳过本轮 String sym = Symbol(); // 取当前策略应用商品的合约代码 Numeric openShortLine; // 空头开仓线 Numeric openLongLine; // 多头开仓线 Numeric shortStopLine; // 空头止损线(开仓过滤用) Numeric longStopLine; // 多头止损线(开仓过滤用) Numeric lineA; // 状态内止盈线 Numeric lineB; // 状态内反手(止损)线 Numeric stopPrice; // 反手止损价 Numeric buyPx = Q_AskPrice; // 买入/平空 用卖一价 Numeric sellPx = Q_BidPrice; // 卖出/开空 用买一价 If(buyPx == InvalidNumeric Or buyPx <= 0) buyPx = px; // 卖一价无效则退回最新价 If(sellPx == InvalidNumeric Or sellPx <= 0) sellPx = px; // 买一价无效则退回最新价 // ================== 空仓状态 ================== If(gState == 0) // 若当前为空仓 { If(gFirstOpen == 1) // 若是首次开仓: 以种子价计算各线 { openShortLine = IntPart(topRatioOpen * seedPrice); openLongLine = IntPart(reverseRatio * seedPrice) + 1; shortStopLine = IntPart(stopShortRatio * seedPrice); longStopLine = IntPart(stopLongRatio * seedPrice) + 1; } Else // 非首次开仓: 用空仓期跟踪的高低点计算 { If(gTrackHigh == 0) // 若跟踪高点尚未初始化 { gTrackHigh = px; // 用当前价初始化跟踪高点 gTrackLow = px; // 用当前价初始化跟踪低点 } If(px > gTrackHigh) gTrackHigh = px; // 刷新跟踪高点为区间最高 If(px < gTrackLow) gTrackLow = px; // 刷新跟踪低点为区间最低 openShortLine = IntPart(topRatioOpen * gTrackHigh); openLongLine = IntPart(reverseRatio * gTrackLow) + 1; shortStopLine = IntPart(stopShortRatio * gTrackHigh); longStopLine = IntPart(stopLongRatio * gTrackLow) + 1; } // 价格达到 空头开仓线 -> 立即开空 If((gNextDir == 0 Or gNextDir == 1) // 方向允许做空 And px <= openShortLine // 且最新价触及空头开仓线 And px > shortStopLine) // 且未跌破空头止损线 { A_SellShort(sym, lots, sellPx, gIds, "", "", accountIdx); // 以买一价开空(指定账户) If(gFirstOpen == 1) gDTOP = seedPrice; Else gDTOP = gTrackHigh; // 设定上沿基准DTOP gDBOTTOM = px; // 下沿基准初始化为当前价 gEvt = "开空"; gEvtPrice = openShortLine; gNeedPlot = True; // 记录待标注事件与信号价 gState = 1; gNextDir = 0; gFirstOpen = 0; // 切空头; 解除方向限制; 标记非首次 } // 价格达到 多头开仓线 -> 立即开多 Else If((gNextDir == 0 Or gNextDir == 2) // 方向允许做多 And px >= openLongLine // 且最新价触及多头开仓线 And px < longStopLine) // 且未突破多头止损线 { A_Buy(sym, lots, buyPx, gIds, "", "", accountIdx); // 以卖一价开多(指定账户) If(gFirstOpen == 1) gDBOTTOM = seedPrice; Else gDBOTTOM = gTrackLow; // 设定下沿基准DBOTTOM gDTOP = px; // 上沿基准初始化为当前价 gEvt = "开多"; gEvtPrice = openLongLine; gNeedPlot = True; // 记录待标注事件与信号价 gState = 2; gNextDir = 0; gFirstOpen = 0; // 切多头; 解除方向限制; 标记非首次 } } // ================== 空头持仓 ================== Else If(gState == 1) // 若当前持有空单 { If(px < gDBOTTOM) gDBOTTOM = px; // 实时更新最低价(下沿基准) lineA = IntPart(stopShortRatio * gDTOP); lineB = IntPart(reverseRatio * gDBOTTOM) + 1; // 达到止赢线 -> 立即平空(对手价) If(px <= lineA) // 若最新价已跌到空头止赢线 { A_BuyToCover(sym, lots, buyPx, gIds, "", "", accountIdx); // 以卖一价平掉空单 gEvt = "平空止赢"; gEvtPrice = lineA; gNeedPlot = True; // 记录标注 gState = 0; gNextDir = 2; // 切空仓; 下次仅允许做多 gTrackHigh = px; gTrackLow = px; // 重置跟踪高低点为当前价 } // 达到止损线 -> 平空@止损价, 反手开多@止损价-1 Else If(px >= lineB) // 若最新价触及反手(止损)线 { stopPrice = lineB; // 止损价=反手线 A_BuyToCover(sym, lots, stopPrice, gIds, "", "", accountIdx); // 平空: 委托价=止损价 A_Buy(sym, lots, stopPrice - 1, gIds, "", "", accountIdx); // 反手开多: 委托价=止损价-1 gEvt = "平空转多"; gEvtPrice = stopPrice; gNeedPlot = True; // 记录标注 gState = 2; // 切多头 gDTOP = px; // 上沿基准=当前价 gNextDir = 0; gFirstOpen = 0; // 解除方向限制; 标记非首次 } } // ================== 多头持仓 ================== Else If(gState == 2) // 若当前持有多单 { If(px > gDTOP) gDTOP = px; // 实时更新最高价(上沿基准) lineA = IntPart(stopLongRatio * gDBOTTOM) + 1; lineB = IntPart(topRatioOpen * gDTOP); // 达到止赢线 -> 立即平多(对手价) If(px >= lineA) // 若最新价已涨到多头止赢线 { A_Sell(sym, lots, sellPx, gIds, "", "", accountIdx); // 以买一价平掉多单 gEvt = "平多止赢"; gEvtPrice = lineA; gNeedPlot = True; // 记录标注 gState = 0; gNextDir = 1; // 切空仓; 下次仅允许做空 gTrackHigh = px; gTrackLow = px; // 重置跟踪高低点为当前价 } // 达到止损线 -> 平多@止损价, 反手开空@止损价+1 Else If(px <= lineB) // 若最新价跌破反手(止损)线 { stopPrice = lineB; // 止损价=反手线 A_Sell(sym, lots, stopPrice, gIds, "", "", accountIdx); // 平多: 委托价=止损价 A_SellShort(sym, lots, stopPrice + 1, gIds, "", "", accountIdx); // 反手开空: 委托价=止损价+1 gEvt = "平多转空"; gEvtPrice = stopPrice; gNeedPlot = True; // 记录标注 gState = 1; // 切空头 gDBOTTOM = px; // 下沿基准=当前价 gNextDir = 0; gFirstOpen = 0; // 解除方向限制; 标记非首次 } } }