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

On_stop_order里面分成两步骤做了一些处理,但是感觉第一个步骤处理完的变量并没有被缓存下来,第二个步骤条件不可能被满足。能否解答?

`

def on_stop_order(self, stop_order: StopOrder):

    # 只处理撤销或者触发的停止单委托
    if stop_order.status == StopOrderStatus.WAITING:
        return

    # 移除已经结束的停止单委托号
    for buf_orderids in [
        self.buy_vt_orderids,
        self.sell_vt_orderids,
        self.short_vt_orderids,
        self.cover_vt_orderids
    ]:
        if stop_order.stop_orderid in buf_orderids:
            buf_orderids.remove(stop_order.stop_orderid)  # 为什么是在这个临时list中remove,没有去各个orderids的list中remove?


    # 发出新的委托
    # Q:这部分代码真的会被执行吗?
    if self.pos == 0:
        if not self.buy_vt_orderids:
            if self.buy_price:
                self.buy_vt_orderids = self.buy(self.buy_price, self.fixed_size, True)
                self.buy_price = 0
            # 没有再做遍历撤单了,因为锁仓交易可能把一笔拆成好几笔,不做额外的撤单操作

        if not self.short_vt_orderids:
            if self.short_price:
                self.short_vt_orderids = self.short(self.short_price, self.fixed_size, True)
                self.short_price = 0

    elif self.pos > 0:
        if not self.sell_vt_orderids:
            if self.sell_price:
                self.sell_vt_orderids = self.sell(self.sell_price, abs(self.pos), True)
                self.sell_price = 0

    else:
        if not self.cover_vt_orderids:
            if self.cover_price:
                self.cover_vt_orderids = self.cover(self.cover_price, abs(self.pos), True)
                self.cover_price = 0`
Member
avatar
加入于:
帖子: 1631
声望: 117

没看明白,是指你写Q那里的self.pos不会为0?

Member
avatar
加入于:
帖子: 7
声望: 0

是这样一部分条件不会满足。因为我的理解中,4个orderids对象在on_15min_bar被例子中收到的全部是stop order, 收到on_stop_order

if not self.buy_vt_orderids
if not self.short_vt_orderids
if not self.sell_vt_orderids
if not self.cover_vt_orderids
if self.buy_price
if self.sell_price

多头停止单为例,假设信号触发,之前self.buy_vt_orderids为空,那么进入多头停止单下单逻辑,然后self.buy_price = 0。那么往后到on_stop_order所有的if self.buy_price都无法满足,无论是被拒单被撤单,都无法再发新单,因为这个信号归零不是按照是否成交而是是否发单来判断。

而self.buy_vt_orderids对象本身on_15min_bar信号触发之后不为空,回调函数进行成交回报核对的时候也没有再去self.buy_vt_orderids里面删除这个orderid,是去“buf_orderids”这个临时变量里面删,self.buy_vt_orderids本身不变(除非本地变量内存依然指向了它)。那么此时无论被拒单还是被成交,if not self.buy_vt_orderids都是False. 即便内存指针导致self.buy_vt_orderids,应该是用回报的状态来判断是被撤还是被成交,而不是self.buy_price = 0,因为信号触发之后自动就被还原了

Member
avatar
加入于:
帖子: 1631
声望: 117
    for buf_orderids in [
        self.buy_vt_orderids,
        self.sell_vt_orderids,
        self.short_vt_orderids,
        self.cover_vt_orderids
    ]:
        if stop_order.stop_orderid in buf_orderids:
            buf_orderids.remove(stop_order.stop_orderid)  # 为什么是在这个临时list中remove,没有去各个orderids的list中remove?

这里的buf_orderids,就是指的self.buy_vt_orderids/self.short_vt_orderids这些列表对象,所以这行代码里移除了成交后的停止单委托号。

建议了解下Python语言中的【可变/不可变对象】概念,这里循环时的buf_orderids可以视作指向原有列表的引用,而非复制

Member
avatar
加入于:
帖子: 7
声望: 0

以下两段代码,执行下理解下
a = 1
b = 2
for x in [a, b]:
x = x + 1
print(a)
print(b)
这里的x是你理解的临时变量,x+1,加到x上,不会加到a,b上

a = [1,2]
b = [1,3]
for x in [a, b]:
x.remove(1)
print(a)
print(b)
这里的x,并没有复制a b出来,而是指向了a b

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

沪公网安备 31011502017034号

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