OnSignal事件域不能成交,如何映射到主力合约?

// 新增:OnSignal事件,处理所有信号并反向 OnSignal(ArrayRef<Signal> sigs) { Integer i = 0; For i = 0 To GetArraySize(sigs) - 1 { SignalRef sig = sigs[i]; // 确保是实时行情且信号没有被其他条件过滤(如我们主动加的 Enum_Signal_NotSend 标记) // 注:所有信号都带有 Enum_Signal_NotSend,这里检查该标记以确保我们只处理我们产生的信号 If(BitHas(sig.flag, Enum_Signal_NotSend) && QuoteStatus == Enum_QuoteStatus_RealTime) { // 准备反向订单的参数 Array<Integer> orders; Bool ret = False; // 根据原信号的 side 和 combOffset 进行反向 // 反向规则:买卖方向互换,开平类型保持不变 If(sig.side == Enum_Buy) { // 原买入(开多或平空) -> 变为卖出(开空或平多) A_SendOrderEx(Enum_Sell, sig.combOffset, sig.volume, sig.price, orders); } Else If(sig.side == Enum_Sell) { // 原卖出(开空或平多) -> 变为买入(开多或平空) A_SendOrderEx(Enum_Buy, sig.combOffset, sig.volume, sig.price, orders); } Else { // 其他未知方向,可忽略或按原方向发单 A_SendOrderEx(sig.side, sig.combOffset, sig.volume, sig.price, orders); } Print("反向发单: 原side=" + IIfString(sig.side==Enum_Buy,"Buy","Sell") + " 新side=" + IIfString(sig.side==Enum_Buy,"Sell","Buy") + " 结果=" + IIfString(ret,"成功","失败")); } } }在策略中加上这段代码,我使用的是888连续合约,模拟盘中可以发出订单,但总是显示订单废单,原因为“申报失败,cs888.DCE,卖出,开仓,委托量1,委托价2688.00,成交量0,TEST38_MR@TEST38_MR@TEST36@cs888_M30,合约不可交易。” 我已在策略单元设置中映射到主力合约,在不用OnSignal事件域,可以正常交易到主力合约。我需要在哪里设置,通过OnSignal事件域能自动映射到主力合约进行交易。

第一个参数 合约填 mainsymbol 或 relativesymbol

回复:谢谢。我写入mainsymbol后,开仓可以交易了,但是平仓时还是报废单。

回复:我一直有个疑问,这样映射,如果买入后(平仓前),遇到主力合约换月了,还能被平掉吗?

回复:我写入mainsymbol后,开、平仓都可以交易了。CHAN的问题,我也很想知道如何解决?

回复:不能的A函数的自由化很高 所以都要自己考虑到的平仓的时候,get Position ,取持仓数据如果SymbolType一致,但 Position.symbol 不等于 mainsymbol,就用 Position.symbol 不仅是合约 还有持仓,限于真实资金量都不一定能开到策略那么多手,平仓也要取真实持仓数据,不然平不掉或者本身每根baropen的时候 检查 rollover数据变了,就是换月了,整体仓位调整到主力上,或者用监控自动同步

回复:哦 好像不用单独判断 symboltypemainsymbol第二个参数可以填代码那就直接mainsymbol(Position.symbol ) != Position.symbol

回复:A_SendOrderEx(mainsymbol,Enum_Sell, sig.combOffset, sig.volume, sig.price, orders);持仓换月,这里怎么修改,能自动平以前的合约,并换持新的主力合约呢?