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

请教大佬 tick过滤器的实例化在这里 ,没找到 在哪里调用tick数据的传输路径是什么样的

description

Member
avatar
加入于:
帖子: 420
声望: 175

逆火 wrote:

请教大佬 tick过滤器的实例化在这里 ,没找到 在哪里调用tick数据的传输路径是什么样的

description

答复

  1. 一个gateway对应一个TickFilter;
  2. 每个gateway实例都包含一个行情MdApi,它的onRtnDeepMarketData()函数都会推送tick数据,调用的是BaseGateway的on_tick()接口;
  3. 本设计对on_tick()的方法进行了改写:
    def on_tick(self, tick: TickData) -> None:
         """
         Tick event push.
         Tick event of a specific vt_symbol is also pushed.
         """
         self.on_event(EVENT_ORIGIN_TICK, tick)  # hxxjava add             
         # if tick.first_time:                     # hxxjava add
         #     return
         # self.on_event(EVENT_TICK, tick)                   
         # self.on_event(EVENT_TICK + tick.vt_symbol, tick)
    这里将EVENT_TICK消息类型替换为新定义的EVENT_ORIGIN_TICK消息。
  4. TickFilter都有注册了EVENT_ORIGIN_TICK消息,并且在其处理函数process_tick_event()中进行原始tick有效性判断和过滤,之后再将有效的tick转发到vnpy系统中供其他应用使用的,下面是TickFilter的tick过滤处理函数,其最后两句与原来的BaseGateway的on_tick()的作用是相同的。

     def process_tick_event(self,event:Event):
         """ 对原始tick进行过滤 """
         tick:TickData = event.data
    
         # 检查tick合约的经验状态是否位有效交易状态
         status:StatusData = self.statuses.get(tick.vt_symbol,None)
         if not status:
             vt_instrument = get_vt_instrument(tick.vt_symbol)
             status = self.statuses.get(vt_instrument,None)
             if not status:
                 # 未收到交易状态,返回
                 return
    
         if status.instrument_status not in VALID_TRADE_STATUSES:
             # 不在有效交易状态,返回
             return
    
         key = (tick.gateway_name,tick.vt_symbol)
         _,oldtick = self.last_ticks.get(key,(None,None))
         valid_tick = False
         if not oldtick:
             # 没有该合约的历史tick
             self.last_ticks[key] = (True,tick)
             valid_tick = True
    
         elif tick.datetime > oldtick.datetime:
             # 
             self.last_ticks[key] = (True,tick)
             valid_tick = True
    
         # else:
         #     print(f"【特别tick = {tick}】")
    
         if valid_tick == True:
             # 如果是有效的tick
             if status.instrument_status != InstrumentStatus.CONTINOUS:
                 # 发送集合竞价tic消息到系统中
                 self.event_engine.put(Event(EVENT_AUCTION_TICK,tick))
                 self.event_engine.put(Event(EVENT_AUCTION_TICK + tick.vt_symbol, tick))  
    
             else:
                 # 发送连续竞价tic消息到系统中
                 self.event_engine.put(Event(EVENT_TICK,tick))
                 self.event_engine.put(Event(EVENT_TICK + tick.vt_symbol, tick))
  5. 一句话:BaseGateway的on_tick()对原始tick进行拦截,转向到TickFilter去进行过滤处理,有效的放行,无效的抛弃。
Member
avatar
加入于:
帖子: 227
声望: 0

交易所推送status的时间是多久一次

Member
avatar
加入于:
帖子: 420
声望: 175

逆火 wrote:

交易所推送status的时间是多久一次

答复:

  1. 通常一个品种一个交易日有1个集合竞价时间段,n个连续竞价时间段的话,那么会收到:
    非交易时间状态——1个
    集合竞价开始状态——1个
    集合竞价匹配状态——1个
    第一个连续竞价状态——1个
    第一次休市状态——1个
    第二个连续竞价状态——1个
    第二次休市状态 ——1个
    ...
    第n个连续竞价状态——1个
    交易日收盘状态  ——1个
    所以正常情况下会收到2n+3个交易状态
  2. 如果某个合约盘中因为极端行情导致停盘,延迟一段时间后再次回复交易,则每停盘1次就又会多收到1个停盘交易状态+1个连续交易状态。如果一个交易日如果停盘m次,则整个交易日会收到2n+2m+3个交易状态。
  3. 交易所推送交易状态根据不同品种或合约分别推送的,例如你可能在交易日的晚21:00收到约60多个连续竞价交易状态信息,这其中大部分是品种,也可能还包含一些具体合约的交易状态信息。
Member
avatar
加入于:
帖子: 227
声望: 0

大佬 在用价差策略的时候,状态不对,请教
description

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

感谢分享,希望新版本可以加入这个功能

Member
avatar
加入于:
帖子: 420
声望: 175

逆火 wrote:

大佬 在用价差策略的时候,状态不对,请教
description

答复:

何以见得就不对呢?请描述错误及现象。

价差交易分两种:

  1. 交易所存在的价差合约,这时候交易价差合约就和CTA策略中的其他一般合约一样交易。TickFilter直接可以过来这种价差合约的tick。
  2. 交易所不存在的价差合约,这时候需要在vnpy的spreadtrading模块中自己创建一个本地价差合约,此时交易价差合约就会被分解为对价差合约的两个或多个腿合约的分别的交易。此时就需要对这些腿都合约进行订阅和过滤。TickFilter在spreadtrading的engine之前起过滤作用的,对spreadtrading合成的价差tick无需任何过滤。
Member
avatar
加入于:
帖子: 227
声望: 0

9:15分以后 状态为集合竞价报单,收不到bar信息 所以我在想是不是系统在过滤掉了

Member
avatar
加入于:
帖子: 420
声望: 175

感觉你的问题与TickFilter的过滤无关,因为:

  1. y2209-y2211合约是你自己创建的本地价差,它的tick是合成出来的,它只依赖y2209.DCE,y2211.DCE两个合约的tick是否能够被收到
  2. y2209.DCE,y2211.DCE的原始tick是否能够收到,与它们的tick时间戳是否是在它们各自的交易状态是否被正确地收到
  3. 只有ctp网关连接正常,ctp接口连接到的交易所的所有合约的交易状态都会被自动推送给TickFilter
  4. y2209-y2211合约的两个腿y2209.DCE,y2211.DCE会被spread_trading模块分别订阅,它们的tick会首先发送给TickFilter,当它们与当时的交易状态一致时,就会被放行到需要它们的spread_trading模块,之后的过程与vnpy系统以前的出来没有任何差别,最终合成出y2209-y2211合成价差tick。

由此可见:你的问题与TickFilter的过滤无关。

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

在add_gateway()中的这个语句跟哪里有联系没看出来,self.tick_filters 这个字典在哪里用到了??
description

Member
avatar
加入于:
帖子: 420
声望: 175

逆火 wrote:

在add_gateway()中的这个语句跟哪里有联系没看出来,self.tick_filters 这个字典在哪里用到了??
description

  1. self.tick_filters是main_engine的成员,为main_engine中的增加的每个gateway都配备一个TickFilter,目的是为了防止重复创建,如果创建过就不再创建了。
  2. 创建成功的TickFilter自己会接收该gateway的交易状态信息和原始tick
  3. TickFilter接收到gateway的原始tick时,会根据tick对应的交易状态信息进行有效性判断,有效则转发到vnpy系统中,无效的则抛弃。
Member
avatar
加入于:
帖子: 227
声望: 0

哈喽 大佬,请教一个 股指期货怎么过滤开盘集合竞价阶段的tick

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

沪公网安备 31011502017034号

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