在on_trade函数下,判断self.pos>0,且没有挂止损单,发出止损self.sell(stop_price,abs(self.pos),stop=True),最后发现发出去的止损单和仓位不一致;观察了下,可能是一个仓位分了多次成交,on_trade只收到第一单成交的仓位,这个如何解决?
在on_trade函数下,判断self.pos>0,且没有挂止损单,发出止损self.sell(stop_price,abs(self.pos),stop=True),最后发现发出去的止损单和仓位不一致;观察了下,可能是一个仓位分了多次成交,on_trade只收到第一单成交的仓位,这个如何解决?
挂止损单不用在on_trade函数下面回调,在每根k来的时候都挂即可。
可以在每次on_trade下查看仓位,如果大于0,用trade.volume来下停止单。就只下每次成交量的停止单数量。
alvinli512 wrote:
可以在每次on_trade下查看仓位,如果大于0,用trade.volume来下停止单。就只下每次成交量的停止单数量。
就是说我在仓位不等于0时候,缓存trade.volume,来替换止损单中的self.pos?
ahren wrote:
alvinli512 wrote:
可以在每次on_trade下查看仓位,如果大于0,用trade.volume来下停止单。就只下每次成交量的停止单数量。
就是说我在仓位不等于0时候,缓存trade.volume,来替换止损单中的self.pos?
是的。这样的话,比如一个订单买10;被分成三次成交,分别成交334。on_trade会被调用三次,三次的trade.volume分别也就是334。
如果只成交了33,那就只下了两个停止单,量分别是33,因为on_trade只被调用了两次。
alvinli512 wrote:
ahren wrote:
alvinli512 wrote:
如果只成交了33,那就只下了两个停止单,量分别是33,因为on_trade只被调用了两次。
这样依然不行,用trade.volume 发出的止损,也是首次成交的单子,也就是您讲的只发出了3;
正常分次成交情况下,应该每一次都会收到on_trade推送,应该首先在on_trade下打印排查这个问题
不清楚你策略的具体逻辑,如果想开仓后立即挂单,可以在on_trade下进行委托
xiaohe wrote:
正常分次成交情况下,应该每一次都会收到on_trade推送,应该首先在on_trade下打印排查这个问题
不清楚你策略的具体逻辑,如果想开仓后立即挂单,可以在on_trade下进行委托
on_trade里面就是仓位大于0,判断没有挂止损单就发出trade.volume量的止损单,self.sell(self.long_stop,abs(trade.volume),stop=True)(仓位小于0,判断没挂止损,发trade.volume量的止损);
我怀疑是因为在on_tick里面 把tick数据推送到on_bar,导致on_bar时时刻刻都在接受tick数据,而不是每分钟合成好k线才有数据
on_trade/on_tick都可以自己打印看看是否符合你的猜想
xiaohe wrote:
on_trade/on_tick都可以自己打印看看是否符合你的猜想
on_trade 里面打印trade.volume ,1单被拆成2笔成交,trade.volume回报的是2笔,时间戳毫秒有点区别;第一笔成交后,立即就发出了第一笔的止损单;因为在发出止损单前,有先判断没发出止损单,才计算止损价格发出止损单,导致第二笔止损单发不出去;目前不清楚删掉判断有没有发止损单这个条件,会不会影响其他部分
“先判断没发出止损单”这个判断是通过之前的order id吗。或许可以用trade id来判断?
alvinli512 wrote:
“先判断没发出止损单”这个判断是通过之前的order id吗。或许可以用trade id来判断?
是的,之前按照orderid来判断的,想了下tradeid 可以,你看看这么实现有没有漏洞
on_trade()里面先long_tradeid = [],short_tradeid = []缓存tradeid,接着
self.pos != 0时候获取trade.price,不同的方向上把trade.tradeid 分别加入对应的tradeid 列表,即:long_tradeid.extend(trade.tradeid)
self.pos > 0 时候 判断有long_tradeid,计算long_stop,然后遍历long_tradeid,发出止损单
即:self.sell(self.long_stop,abs(trade.volume),stop=True);反之,self.pos<0同样;
这样的话,就是循环成交笔次数挂止损单,没有剔除tradeid list ;
ahren wrote:
alvinli512 wrote:
“先判断没发出止损单”这个判断是通过之前的order id吗。或许可以用trade id来判断?
是的,之前按照orderid来判断的,想了下tradeid 可以,你看看这么实现有没有漏洞
on_trade()里面先long_tradeid = [],short_tradeid = []缓存tradeid,接着
self.pos != 0时候获取trade.price,不同的方向上把trade.tradeid 分别加入对应的tradeid 列表,即:long_tradeid.extend(trade.tradeid)
self.pos > 0 时候 判断有long_tradeid,计算long_stop,然后遍历long_tradeid,发出止损单
即:self.sell(self.long_stop,abs(trade.volume),stop=True);反之,self.pos<0同样;
这样的话,就是循环成交笔次数挂止损单,没有剔除tradeid list ;
on_trade是每一次trade触发一次,所以这样的话两个id的list是存不了大于一个id的,每次on_trade都会被初始化一次。
这样是不是复杂了啊?或许试试,在每一次on_trade里关注trade的开平状态,只要是开仓的话就发出止损单。不需要查看之前是否发出止损单,只要是最新on_trade的开仓,之前一定是没有发过的。
alvinli512 wrote:
ahren wrote:
alvinli512 wrote:
“先判断没发出止损单”这个判断是通过之前的order id吗。或许可以用trade id来判断?
是的,之前按照orderid来判断的,想了下tradeid 可以,你看看这么实现有没有漏洞
on_trade()里面先long_tradeid = [],short_tradeid = []缓存tradeid,接着
self.pos != 0时候获取trade.price,不同的方向上把trade.tradeid 分别加入对应的tradeid 列表,即:long_tradeid.extend(trade.tradeid)
self.pos > 0 时候 判断有long_tradeid,计算long_stop,然后遍历long_tradeid,发出止损单
即:self.sell(self.long_stop,abs(trade.volume),stop=True);反之,self.pos<0同样;
这样的话,就是循环成交笔次数挂止损单,没有剔除tradeid list ;
on_trade是每一次trade触发一次,所以这样的话两个id的list是存不了大于一个id的,每次on_trade都会被初始化一次。这样是不是复杂了啊?或许试试,在每一次on_trade里关注trade的开平状态,只要是开仓的话就发出止损单。不需要查看之前是否发出止损单,只要是最新on_trade的开仓,之前一定是没有发过的。
这块取决于你的策略逻辑,如果像海龟这种会分批建仓的情况就不符合
这样是不是复杂了啊?或许试试,在每一次on_trade里关注trade的开平状态,只要是开仓的话就发出止损单。不需要查看之前是否发出止损单,只要是最新on_trade的开仓,之前一定是没有发过的。
按照你的方法,可以的,不用判断直接发止损单,谢啦