vn.py量化社区
By Traders, For Traders.
Member
加入于:
帖子: 29
声望: 0

一个是仓位问题,各策略如何维护自己的仓位?

另一个是下单成交情况,对于order而言,全部成交,撤单是稳定态,挂单和部分成交是中间态,不稳定,我看到处理的时候却是处理trade信息,这部分信息其实不稳定,我记得以前是不处理的, 另外查询仓位又太慢,以前用c++开发时候,只在开始时候查一下仓位,然后只根据order信息去计算仓位才是最准的 官方怎么看?

举一个例子,以前真实遇见过,一次下单5手 收到成交回报 成交3手, 如果这时候 这时候如果利用这个信息去计算仓位,会认为有pos=3 剩余2手 那么撤单后再去下单2手,如果撤单过程中又成交了1手 ,就会出现多下单1手的情况,
所以过往的经验就是成交回报不需要处理,只看order信息,只处理终止态(即是稳定态)的信息

Administrator
avatar
加入于:
帖子: 3840
声望: 202

CTA模块中,每个策略是基于自己发出的委托的成交回报,来计算当前该策略的逻辑仓位,和底层的账户仓位无关。

vn.py中的所有TradeData,都是增量成交部分的信息,所以是稳定数据,另外实盘不会依赖查询持仓来实时更新状态,最多用于定时同步。

最后的这个逻辑,在特定情境下是一种简化方案(超价下单,大概率都会最终全部成交),但是不具有普适性(下比当前价格低的买入限价单,可能很长时间才成交)。

撤单后再去下单2手,这个操作只要在收到撤单回报后再去下新的2收,就不可能出错。

Member
加入于:
帖子: 29
声望: 0

用Python的交易员 wrote:

CTA模块中,每个策略是基于自己发出的委托的成交回报,来计算当前该策略的逻辑仓位,和底层的账户仓位无关。

vn.py中的所有TradeData,都是增量成交部分的信息,所以是稳定数据,另外实盘不会依赖查询持仓来实时更新状态,最多用于定时同步。

最后的这个逻辑,在特定情境下是一种简化方案(超价下单,大概率都会最终全部成交),但是不具有普适性(下比当前价格低的买入限价单,可能很长时间才成交)。

撤单后再去下单2手,这个操作只要在收到撤单回报后再去下新的2收,就不可能出错。

----------------------------------------------------------------------

def processTradeEvent(self, event):
    """处理成交推送"""
    trade = event.dict_['data']

    # 过滤已经收到过的成交回报
    if trade.vtTradeID in self.tradeSet:
        return
    self.tradeSet.add(trade.vtTradeID)

    # 将成交推送到策略对象中
    if trade.vtOrderID in self.orderStrategyDict:
        strategy = self.orderStrategyDict[trade.vtOrderID]

        # 计算策略持仓
        if trade.direction == DIRECTION_LONG:
            strategy.pos += trade.volume
        else:
            strategy.pos -= trade.volume

        self.callStrategyFunc(strategy, strategy.onTrade, trade)

        # 保存策略持仓到数据库
        self.saveSyncData(strategy)              


是这段逻辑吧? 计算策略的仓位,但有一个问题就是我还没理解trade是如何保证是确认成交的 因为名字有点歧义,ctp本身的ontrade 不能用来处理 是不是在c++那部分 你增加了冗余的逻辑 保证了一定没有未成交单子飘在外面时候的成交 才会被推送回来?

Member
加入于:
帖子: 29
声望: 0

我又看了一下 真个代码 ontrade的信息 是直接从ctp那边过来的 没有额外逻辑处理 所以还是得策略端去自己保证没有未成交的单子 我看到cta策略里有一个cancelAll的动作

在TargetPosTemplate里有这么一段 是有问题的, cancel后信息未确认,就开始计算poschange (这等于是假定了 挂单价格远离市场盘口,没有成交)
事实上,我之前说的部分成交的问题,非常容易出现。

def trade(self):
    """"""
    self.cancel_all()

    pos_change = self.target_pos - self.pos
    if not pos_change:
        return

正确的做法应该是cancel的order回调里去计算poschange

我在github也提了一个issue ,请版主确认一下是否是一个问题: https://github.com/vnpy/vnpy/issues/2234

Member
加入于:
帖子: 14
声望: 2

自己写个了仓位管理器,map存储。每次下单前去交易所查询当前仓位,记录下来,然后和目标仓位比较。定时去查,可能下单前刚好上次查询后,有新订单成交了,值就不对了。一起http请求挺快的,不搞高频,延迟足够

Member
加入于:
帖子: 29
声望: 0

feivirus wrote:

自己写个了仓位管理器,map存储。每次下单前去交易所查询当前仓位,记录下来,然后和目标仓位比较。定时去查,可能下单前刚好上次查询后,有新订单成交了,值就不对了。一起http请求挺快的,不搞高频,延迟足够

这种靠查询的 更不准了 连ontrade有可能出错 更何况1秒才能调用一次的query呢 反正我们以前利用trade信息算仓位 实盘是交过学费的 如果你交易频率特别低 那可能是无所谓 但有的时候要求几秒内不成交 需要撤单再追单的执行逻辑 根本等不及去查 只有确认了没有未成交单子在外的时候 的订单信息和查询结果才有效

Member
加入于:
帖子: 29
声望: 0

feivirus wrote:

自己写个了仓位管理器,map存储。每次下单前去交易所查询当前仓位,记录下来,然后和目标仓位比较。定时去查,可能下单前刚好上次查询后,有新订单成交了,值就不对了。一起http请求挺快的,不搞高频,延迟足够

才注意到你写的http请求 所以你是在做数字币的交易吧? 和我说的ctp期货不太一样 有的数字币交易所 连ws都不支持 全部靠轮询机制 但是ctp期货是回调函数的机制 有点类似数字币里面websocket那种方式 ’

Administrator
avatar
加入于:
帖子: 3840
声望: 202

TargetPosTemplate只适合开发比较低频的策略,给初学者用来降低上手难度的工具,我们后续改进下吧

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