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

答复:

问题分析

  1. 目前simnow调试,停止服务。我猜你现在使用的实盘账户在运作策略。所以你才可以继续使用CTP网关行情的。
  2. 你目前应该是连接到你的期货经纪商给提供的连接地址和端口号上的,也就是说,你可能是从你的期货经纪商的行情服务器获取的行情转发。
  3. 行情数据错误可能是两个方面造成的:①期货经纪商的行情转发错误;②本地行情接收成为

解决思路:

  1. 检查期货经纪商的行情使用的CTP版本,看看他们是否对CZCE的品种行情转发的毫秒数是错误的。(需要和你的期货经纪商沟通)
  2. 更换本地的CTP网关版本,最简单的时恢复到vnpy 3.0,订阅一个CZCE的合约,然后在onRtnDepthMarketData()中直接答应data看看。

这样就可以定位到问题了。

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

MTF wrote:

郑商所合约,行情推送里时间戳不带毫秒信息的,要在业务层自己处理下
大佬可以详细说下吗?业务层是指?多谢了

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

hxxjava wrote:

答复:

问题分析

  1. 目前simnow调试,停止服务。我猜你现在使用的实盘账户在运作策略。所以你才可以继续使用CTP网关行情的。
  2. 你目前应该是连接到你的期货经纪商给提供的连接地址和端口号上的,也就是说,你可能是从你的期货经纪商的行情服务器获取的行情转发。
  3. 行情数据错误可能是两个方面造成的:①期货经纪商的行情转发错误;②本地行情接收成为

解决思路:

  1. 检查期货经纪商的行情使用的CTP版本,看看他们是否对CZCE的品种行情转发的毫秒数是错误的。(需要和你的期货经纪商沟通)
  2. 更换本地的CTP网关版本,最简单的时恢复到vnpy 3.0,订阅一个CZCE的合约,然后在onRtnDepthMarketData()中直接答应data看看。

这样就可以定位到问题了。

多谢hxx大佬,我的情况完全符合您问题分析中的1和2,目前我正在联系经纪商确认以及升级ctp网关再次进行测试,感谢耐心回复

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

经过和经纪商联系,经纪商的落地数据中郑商所就没有tick数据的毫秒标识,所以应该是经纪商的转发问题了,可能他们使用的ctp版本较老吧,只能再去找一个经纪商开户了,各位大佬有没有推荐的经纪商,只要能满足如下就好

  1. 手续费可以调成加1分
  2. 保证金比率可调成跟随交易所
  3. 郑商所tick数据有毫秒标识

我之前使用的国金期货只满足1和2.

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

hxxjava wrote:

答复:

问题分析

  1. 目前simnow调试,停止服务。我猜你现在使用的实盘账户在运作策略。所以你才可以继续使用CTP网关行情的。
  2. 你目前应该是连接到你的期货经纪商给提供的连接地址和端口号上的,也就是说,你可能是从你的期货经纪商的行情服务器获取的行情转发。
  3. 行情数据错误可能是两个方面造成的:①期货经纪商的行情转发错误;②本地行情接收成为

解决思路:

  1. 检查期货经纪商的行情使用的CTP版本,看看他们是否对CZCE的品种行情转发的毫秒数是错误的。(需要和你的期货经纪商沟通)
  2. 更换本地的CTP网关版本,最简单的时恢复到vnpy 3.0,订阅一个CZCE的合约,然后在onRtnDepthMarketData()中直接答应data看看。

这样就可以定位到问题了。

还有请问下哪个ctp版本可以获取到郑商所的毫秒数据

Member
avatar
加入于:
帖子: 419
声望: 170

c787297017 wrote:

hxxjava wrote:

答复:

问题分析

  1. 目前simnow调试,停止服务。我猜你现在使用的实盘账户在运作策略。所以你才可以继续使用CTP网关行情的。
  2. 你目前应该是连接到你的期货经纪商给提供的连接地址和端口号上的,也就是说,你可能是从你的期货经纪商的行情服务器获取的行情转发。
  3. 行情数据错误可能是两个方面造成的:①期货经纪商的行情转发错误;②本地行情接收成为

解决思路:

  1. 检查期货经纪商的行情使用的CTP版本,看看他们是否对CZCE的品种行情转发的毫秒数是错误的。(需要和你的期货经纪商沟通)
  2. 更换本地的CTP网关版本,最简单的时恢复到vnpy 3.0,订阅一个CZCE的合约,然后在onRtnDepthMarketData()中直接答应data看看。

这样就可以定位到问题了。

还有请问下哪个ctp版本可以获取到郑商所的毫秒数据

至少vnpy 3.0中的那个是没有问题。

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

还有确定一下,不是说要开五档行情才有毫秒字段吧?普通的二档就可以吧?因为刚刚国金经纪商去问了郑商所是这么答复的

“您好,刚刚问了郑州所负责行情老师,郑州所技术中心组播行情,五档的精度高,有毫秒级的字段,需要收费24w一年;郑商所为每家期货公司转发的席位行情目前精度只到秒级别,精度没有这么高,没有毫秒级别的字段。”

我是怀疑他们没搞清楚。。。

Member
avatar
加入于:
帖子: 419
声望: 170

下周simnow就可以恢复正常服务了,到时候你可以再连接simnow,如果没有问题,就是国金转发行情的时候出问题了。

Member
avatar
加入于:
帖子: 60
声望: 2

TradeStatusManager是被弃用了吗? 现在的代码是完全用TickFilter来过滤tick数据了。

但是在新代码里,好像少了DbContractData类的定义, 是下面这个定义吗:

description

Member
avatar
加入于:
帖子: 60
声望: 2

vnpy真的应该把这个功能整合到正式版本里头去,因为不这样做的话,必须收盘后关闭vnpy,防止接受错误数据。

但是这根本是做不到的,因为每个品种的收盘时间不一样。你运行一个portfolio strategy,这个品种已经收盘了,那个品种还没结束呢,这就导致这个策略停不了。但是已经收盘了的品种是可能这个时候发错误tick过来的。。。。所以所谓的“收盘后立刻停止策略”,这根本就是做不到的事

Member
avatar
加入于:
帖子: 60
声望: 2

另外想请教大神一个问题

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

这段代码我看了很久,如果我的理解没错的话, 判断一个tick是否有效,是用的上一个该品种的tick的 StatusData, 为什么要这样做呢?为什么不能直接用这个tick的状态信息呢?

Member
avatar
加入于:
帖子: 419
声望: 170

dmz wrote:

另外想请教大神一个问题

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

这段代码我看了很久,如果我的理解没错的话, 判断一个tick是否有效,是用的上一个该品种的tick的 StatusData, 为什么要这样做呢?为什么不能直接用这个tick的状态信息呢?

答复:

  • 因为历史收到的StatusData可能是一个品种 的,也可能是单独一个合约的。如:一个RB.SHFE当前是连续交易时段,但是RB2210.SHFE可能因为激烈的交易行情,超过当时最大涨跌幅度,停盘了,但是该品种的其他合约却正常交易,此时交易所会单独发送RB2210.SHFE停盘3分钟的StatusData,之后再发送RB2210.SHFE恢复连续交易状态的StatusData。
  • 过滤tick数据的时候,第一步就需要看该合约或品种是否有交易状态数据,如果没有就无法判断,只能直接放弃该tick啦。
Member
avatar
加入于:
帖子: 26
声望: 1

description

description

将大神的tick_filter应用到实盘后发现存在如上datetime为10:15:00和15:00:00的tick,首先不知道他们还属于有效tick吗?它们的状态是属于VALID_TRADE_STATUSES的,否则会被tick_filter过滤掉,那可能是什么原因导致的这种情况呢?是否考虑增加时间过滤?

Member
avatar
加入于:
帖子: 419
声望: 170

c787297017 wrote:

description

description

将大神的tick_filter应用到实盘后发现存在如上datetime为10:15:00和15:00:00的tick,首先不知道他们还属于有效tick吗?它们的状态是属于VALID_TRADE_STATUSES的,否则会被tick_filter过滤掉,那可能是什么原因导致的这种情况呢?是否考虑增加时间过滤?

答复:

以国内期货为例:

  1. 通常一个交易日的是由非交易时间段、集合竞价时间段、连续竞价时间段构成,连续竞价时间段之间会有休市时间
  2. 用户只能在VALID_TRADE_STATUSES(集合竞价状态、连续竞价状态)下才能够提交委托
  3. 被接受的委托,经过交易所撮合成功之后才会成交,盘口的价格会因此而发生变化。
  4. 变化的tick行情会被推送到所有用户。
  5. 多数合约会在收市时准时停止tick推送,而然也有部分tick数据延迟数秒乃至20多分钟,且这种延迟没有太多规律可循。有时收市后20多分钟了然后会有因为结算问题而更新的tick推送。

上述过程的第3步是需要时间的,有时也会因为一些结算及审查机制,使得用户在已经收到休市和收盘状态,仍然能够收到tick数据推送。
就是说——用户委托必须是在有效交易时间段内,但行情推送可能会超出连续交易时间段的结束时间!

tickfilter是抛弃这些tick,为什么这么设计?

  1. 如果不抛弃这些tick,你要如何使用这些tick呢?难道你要在15:00之后再生成一个5分钟K线吗?
  2. 假如你使用这些tick来驱动你的策略,同时还生成了交易信号,你的策略是执行委托还是不产生委托呢?
  3. 无论在10:15:00还是15:00:00之后,只要你的策略发生了委托,交易接口一定会返回拒单的,此时你的策略对此又该如何处理呢?
  4. 你可以看看其他世面上的成熟软件,你能够找到历史K线起始时间在休市后吗?答案是:找不到。是它们不会收到这种tick吗?不是,它们一样会收到,只是这些tick也是被丢弃处理了。

综上所述:抛弃这些tick是比较好的做法。

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

多谢大佬深夜耐心回复,那果断在您的TickFilter的基础上增加时间校验,抛弃掉这些虽然有效但处于交易时间外的tick,以防产生额外的k线

Member
avatar
加入于:
帖子: 419
声望: 170

c787297017 wrote:

多谢大佬深夜耐心回复,那果断在您的TickFilter的基础上增加时间校验,抛弃掉这些虽然有效但处于交易时间外的tick,以防产生额外的k线

顺便问下:你之前遇到的PTA合约在一秒内收到的tick时间戳均没有秒以下毫秒数的情况,现在还是这样吗?

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

hxxjava wrote:

c787297017 wrote:

多谢大佬深夜耐心回复,那果断在您的TickFilter的基础上增加时间校验,抛弃掉这些虽然有效但处于交易时间外的tick,以防产生额外的k线

顺便问下:你之前遇到的PTA合约在一秒内收到的tick时间戳均没有秒以下毫秒数的情况,现在还是这样吗?

我目前的实盘很不幸还是郑商所没有毫秒数据,simnow前两天恢复之后,我连接simnow的确可以在郑商所合约上得到毫秒标识,然后我就拿对比运行结果去问了国金期货的技术,同样是ctp柜台,为啥simnow有毫秒标识,然后他们给我的回复是“经过咨询上期技术,simnow自己处理过,所以是有的”

目前我只能在TickFilter针对郑商所修改为tick.datetime >= oldtick.datetime,等于的情况也认为是有效tick

另外和您同步一个信息,10:15:00还是15:00:00之后推过来的tick我同样也咨询了国金期货的技术,他们帮忙问了快期那边对于这种非交易时间有效tick的处理方式,回复如下,总结下就是要么抛弃要么强行加回上一分钟

description

Member
avatar
加入于:
帖子: 419
声望: 170

对于10:15:00还是15:00:00之后推过来的tick强行加回上一分钟,倒也是一种处理方法,也可以办到。只是tick的时间戳在休市或收盘之后一分钟后也是存在的,杜绝不完的。而且采用这种方式策略必须考虑处理休市或收盘之后可能发出委托的问题了。
如果生成的K先只是用来显示,不用考虑交易,怎么做都很自由。

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

执行的时候 default_name找不到 请问这个是哪里定义的
description

Member
avatar
加入于:
帖子: 419
声望: 170

逆火 wrote:

执行的时候 default_name找不到 请问这个是哪里定义的
description

答复

在vnpy_ctp\gateway\ctp_gateway.py中:

class CtpGateway(BaseGateway):
    """
    vn.py用于对接期货CTP柜台的交易接口。
    """

    default_name: str = "CTP"

    default_setting: Dict[str, str] = {
        "用户名": "",
        "密码": "",
        "经纪商代码": "",
        "交易服务器": "",
        "行情服务器": "",
        "产品名称": "",
        "授权编码": ""
    }

    exchanges: List[str] = list(EXCHANGE_CTP2VT.values())

    def __init__(self, event_engine: EventEngine, gateway_name: str) -> None:
        """构造函数"""
        super().__init__(event_engine, gateway_name)

        self.td_api: "CtpTdApi" = CtpTdApi(self)
        self.md_api: "CtpMdApi" = CtpMdApi(self)
© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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