重复开仓

请问老师,我是多个策略单元a,b,c.....同时加载同一个品种。今天碰到一个问题,策略a和策略b在同一个品种、同一根k线、同一个时间一起发单,导致了重复开仓,仓位直接翻倍了,请问这种情况有没有好的解决办法?

好像可以用这个解决:用TradingEndDateTime - SystemTimestamp判断,将其中一个策略的交易信号延迟个几秒再发出。

回复:实测有两种方法可以解决:1、用单品种多策略有关联的组合方式,将多个策略放在一个策略单元里运行。2、将其中一个策略的交易信号延迟1秒后再开仓:Numeric sec_count = (TradingEndDateTime - SystemTimestamp) * 1000000;//放大到秒位 sec_count = Round(sec_count,0);//对秒位取整 if(sec_count > 0 And sec_count < 99)//当前bar开盘1秒后 { ...开仓... }

你是想达到什么效果?同一根K线,a开仓了,b和c就不要开仓吗?

回复:对。只要有一个开仓了,其它的就都不开仓,我想实现这个。

这个应该没什么好办法

回复:

回复:这样能不能行?我把两个策略单元的公式拿出来,合并起来加载到一个策略单元。这样相当于单个品种多个策略,这样能不能解决?

回复:说错了,相当于单品种单策略。

回复:图表策略合在一起 有些函数会互相影响 可能跟你三个公式分开加入策略单元实际产生的信号有差异

回复:好的,谢谢

下单前查询一下持仓

回复:A_TodayBuyPosition

回复:我代码里有用A_GetPosition查询持仓,但是好像不行。同一时间发单,反应不过来。

回复:Array<Integer> orderIds; Bool ret2 = A_GetUnFillOrderIDs(orderIds, "", 0);//获得所有合约未成交数组 Array<String> symbols; Array<String> symbols_act; Bool ret3 = A_GetPositionSymbols(symbols);//获取账户持仓的合约代码 If(GetArraySize(symbols) <> 0) { Integer i; For i=0 to GetArraySize(symbols)-1 { Position pos; A_GetPosition(Symbols[i], pos, ""); If((pos.shortCurrentVolume+pos.longCurrentVolume) != 0) { ArrayPushBack(symbols_act, Symbols[i]);//获得真正的持仓数组 } } } Numeric sum_position = GetArraySize(symbols_act); Numeric sum_order = GetArraySize(orderIds); //接管信号开仓 If(sum_order == 0 And sum_position == 0)//没有挂单、没有持仓 { ...开仓.. }

回复:你这个判断完了,没有立马开仓,放到数组里去了,导致你说的反应不过来

回复:ok,我再研究研究