VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 104
声望: 5

在on_trade函数下,判断self.pos>0,且没有挂止损单,发出止损self.sell(stop_price,abs(self.pos),stop=True),最后发现发出去的止损单和仓位不一致;观察了下,可能是一个仓位分了多次成交,on_trade只收到第一单成交的仓位,这个如何解决?

Member
avatar
加入于:
帖子: 54
声望: 1

挂止损单不用在on_trade函数下面回调,在每根k来的时候都挂即可。

Member
avatar
加入于:
帖子: 104
声望: 5

连龙八卦 wrote:

挂止损单不用在on_trade函数下面回调,在每根k来的时候都挂即可。

我是要开仓立即发止损单

Member
avatar
加入于:
帖子: 20
声望: 4

可以在每次on_trade下查看仓位,如果大于0,用trade.volume来下停止单。就只下每次成交量的停止单数量。

Member
avatar
加入于:
帖子: 104
声望: 5

alvinli512 wrote:

可以在每次on_trade下查看仓位,如果大于0,用trade.volume来下停止单。就只下每次成交量的停止单数量。

就是说我在仓位不等于0时候,缓存trade.volume,来替换止损单中的self.pos?

Member
avatar
加入于:
帖子: 20
声望: 4

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只被调用了两次。

Member
avatar
加入于:
帖子: 104
声望: 5

alvinli512 wrote:

ahren wrote:

alvinli512 wrote:
如果只成交了33,那就只下了两个停止单,量分别是33,因为on_trade只被调用了两次。

这样依然不行,用trade.volume 发出的止损,也是首次成交的单子,也就是您讲的只发出了3;

Member
avatar
加入于:
帖子: 5005
声望: 301

正常分次成交情况下,应该每一次都会收到on_trade推送,应该首先在on_trade下打印排查这个问题
不清楚你策略的具体逻辑,如果想开仓后立即挂单,可以在on_trade下进行委托

Member
avatar
加入于:
帖子: 104
声望: 5

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线才有数据

Member
avatar
加入于:
帖子: 5005
声望: 301

on_trade/on_tick都可以自己打印看看是否符合你的猜想

Member
avatar
加入于:
帖子: 104
声望: 5

xiaohe wrote:

on_trade/on_tick都可以自己打印看看是否符合你的猜想

on_trade 里面打印trade.volume ,1单被拆成2笔成交,trade.volume回报的是2笔,时间戳毫秒有点区别;第一笔成交后,立即就发出了第一笔的止损单;因为在发出止损单前,有先判断没发出止损单,才计算止损价格发出止损单,导致第二笔止损单发不出去;目前不清楚删掉判断有没有发止损单这个条件,会不会影响其他部分

Member
avatar
加入于:
帖子: 20
声望: 4

“先判断没发出止损单”这个判断是通过之前的order id吗。或许可以用trade id来判断?

Member
avatar
加入于:
帖子: 104
声望: 5

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 ;

Member
avatar
加入于:
帖子: 20
声望: 4

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的开仓,之前一定是没有发过的。

Member
avatar
加入于:
帖子: 1627
声望: 117

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的开仓,之前一定是没有发过的。

这块取决于你的策略逻辑,如果像海龟这种会分批建仓的情况就不符合

Member
avatar
加入于:
帖子: 104
声望: 5

这样是不是复杂了啊?或许试试,在每一次on_trade里关注trade的开平状态,只要是开仓的话就发出止损单。不需要查看之前是否发出止损单,只要是最新on_trade的开仓,之前一定是没有发过的。

按照你的方法,可以的,不用判断直接发止损单,谢啦

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】