VeighNa量化社区
你的开源社区量化交易平台
hxxjava's Avatar
Member
离线
419 帖子
声望: 155

例子代码

from dataclasses import dataclass,field
from typing import List,Dict,Tuple
from copy import copy,deepcopy

@dataclass
class Item:
    x: int
    y: int
    z: int = field(init=False) # 为生成字段

    def __post_init__(self):
        self.z = self.x * self.y

@dataclass
class Item1:
    x: int
    y: int
    z: int = field(init=False,compare=False)    # z不参加比较

    def __post_init__(self):
        self.z = self.x * self.y

@dataclass
class DC:
    a: int
    b: int
    c: int = field(init=False)

    items: List[Item] = field(default_factory=list)

    def __post_init__(self):
        self.c = self.a + self.b

    def cur_item(self):
        return deepcopy(self.items[-1]) if self.items else None



if __name__ == "__main__":
    # dataclasses 的类型演示
    item1 = Item(1,2)
    item2 = Item(10,20)
    item3 = Item(100,200)

    c1 = DC(3,4)

    c1.items += [item1,item2,item3]

    cur_item = c1.cur_item()

    c2 = deepcopy(c1)
    print(f"\nc1==c2 = {c1==c2}")

    print(f"\nitem1={item1},item2={item2},item3={item3}")
    print(f"c1={c1}")
    print(f"cur_item={cur_item}")
    print(f"item3==cur_item = {item3==cur_item}")
    cur_item.x = 66
    print(f"\nitem3==cur_item={item3==cur_item}")
    print(f"cur_item={cur_item}")
    print(f"c1={c1}")
    print(f"item1={item1},item2={item2},item3={item3}")


    # z参加比较的演示
    # 创建a,b两个Item类
    a = Item(1,2)
    b = Item(1,2)

    print(f"z参加比较的演示")
    print(f"a={a},b={b} a==b = {a==b}")
    b.z = 10    # 字段z也是可以被改变的
    print(f"a={a},b={b} a==b = {a==b}")
    b.__post_init__()
    print(f"a={a},b={b} a==b = {a==b}")

    # z不参加比较的演示
    # 创建a,b两个Item类
    a = Item1(1,2)
    b = Item1(1,2)
    print(f"z不参加比较的演示")
    print(f"a={a},b={b} a==b = {a==b}")
    b.z = 10
    print(f"a={a},b={b} a==b = {a==b}")
    b.__post_init__()
    print(f"a={a},b={b} a==b = {a==b}")

运行结果

c1==c2 = True

item1=Item(x=1, y=2, z=2),item2=Item(x=10, y=20, z=200),item3=Item(x=100, y=200, z=20000)
c1=DC(a=3, b=4, c=7, items=[Item(x=1, y=2, z=2), Item(x=10, y=20, z=200), Item(x=100, y=200, z=20000)])
cur_item=Item(x=100, y=200, z=20000)
item3==cur_item = True

item3==cur_item=False
cur_item=Item(x=66, y=200, z=20000)
c1=DC(a=3, b=4, c=7, items=[Item(x=1, y=2, z=2), Item(x=10, y=20, z=200), Item(x=100, y=200, z=20000)])
item1=Item(x=1, y=2, z=2),item2=Item(x=10, y=20, z=200),item3=Item(x=100, y=200, z=20000)
z参加比较的演示
a=Item(x=1, y=2, z=2),b=Item(x=1, y=2, z=2) a==b = True
a=Item(x=1, y=2, z=2),b=Item(x=1, y=2, z=10) a==b = False
a=Item(x=1, y=2, z=2),b=Item(x=1, y=2, z=2) a==b = True
z不参加比较的演示
a=Item1(x=1, y=2, z=2),b=Item1(x=1, y=2, z=2) a==b = True
a=Item1(x=1, y=2, z=2),b=Item1(x=1, y=2, z=10) a==b = True
a=Item1(x=1, y=2, z=2),b=Item1(x=1, y=2, z=2) a==b = True

summerkey wrote:

老师您好。
这个文件 中的 from vnpy.trader.object import OrderData 有一个 'reference' 原来的程序里面没有,运行会报错,浏览你之前的帖子也没有找到这个修改的源码,再次求助一下,谢谢
OrderData(gateway_name='CTP', symbol='ag2012', exchange=Exchange.SHFE, orderid='3_753490688_1', type=OrderType.LIMIT, direction=Direction.LONG, offset=Offset.OPEN, price=6494.0, volume=3.0, traded=0, status=Status.SUBMITTING, datetime=None, reference='TTS-ag2012'

查看这个帖子:https://www.vnpy.com/forum/topic/4733-ru-he-qu-fen-ctace-lue-wei-tuo-dan-cheng-jiao-dan-shi-shu-yu-na-ge-ce-lue-de
不过要注意我这个帖子是在这次升级之前发的,其中的reference的被官方采纳了以后,它的含义已经比我原来定义的外延更广,我目前还没有升级到最新版,如果有问题自己尝试解决。

summerkey wrote:

楼主,你好。我用的是2.1.4版本的vnstudio,运行这个程序的时候下面这一部分import在源程序是没有的
from vnpy.app.cta_strategy.base import (
EVENT_CTA_TICK,
EVENT_CTA_BAR,
EVENT_CTA_ORDER,
EVENT_CTA_TRADE,
EVENT_CTA_HISTORY_BAR
)

ImportError: cannot import name 'EVENT_CTA_TICK' from 'vnpy.app.cta_strategy.base'
是base文件做过修改吗?

是的,在base.py中增加了这些消息:

EVENT_CTA_TICK = "eCtaTick"                     # hxxjava add
EVENT_CTA_HISTORY_BAR = "eCtaHistoryBar"        # hxxjava add
EVENT_CTA_BAR = "eCtaBar"                       # hxxjava add
EVENT_CTA_ORDER = "eCtaOrder"                   # hxxjava add  
EVENT_CTA_TRADE = "eCtaTrade"                   # hxxjava add

1. 我刚才回测ag2012.SHFE的结果:

description

2. 这里用的RBreakStrategy2策略和我在帖子里分享的代码是一样的,你可能是哪里搞错了,自己查查吧。

马俊 wrote:

如图我输入的是AP101.CZCE,其他策略都跑的没问题
description

答复:

  1. 你是在回测,这个会有问题的,因为trade_hour类使用了米筐接口rqdatac中函数。
  2. 如果你启动了多线程优化测试是有问题的,因为米筐接口允许的最大线程限额是3,超额了接口函数就不返回数据啦。
  3. 这个问题我已经在论坛上提出来了,想法是通过共享接口的方式,来避免最大线程数超额的问题,不过现在没有引起vnpy官方的重视,可能是官方没有用到我所使用的的米筐接口功能吧。
  4. 实盘cta_engine下应该是没有问题的。
  5. 看看这个帖子你可能就知道原因了:点击这里,这个帖子里就提到了回测时米筐接口可能出错的问题。

马俊 wrote:

我输入vt_symbol是JD88.DCE这样的指数合约时就会报上面的错,我改成单个合约不报上面的错啦,但还是会报如下错
description
如下

  1. 如果使用苹果合约的话,需要输入AP101.CZCE。
  2. 输入合约之前最好到主界面中的查找功能,输入下全部或者部分合约名称,如AP,AP101之类的,然后查询,查找到了,使用查询结果的 vt_symbol才是准确可靠的。
  1. on_bar()或者on_xmin_bar()函数都是由tick数据推动的,15:00开始就没有tick推送了,当然不会结束K线
  2. 15:00开始就休市了,就算是刷新了,你又有能够怎么样呢?
  3. 实在是想要就用定时器吧,14:59:01启动,60秒后执行策略里增加的on_time()函数,把最后一根bar给结束了。不过要有伪造一个假的tick,时间是日期+15:00:00,成交量为0,来驱动self.bg之类的。这样干,搞不好还会出错:假如15:00:00不是你的xmin bar的结束时刻呢?就算是的,下一个bar的开始时间又变成15:00:00,而不是21:00:00了。总之麻烦着呢!还是老老实实地等下一个tick吧。

马俊 wrote:

老大 参数修改了还是不行,是不是那里的数据转换有问题?

答复:

  1. 仔细看了你的出错信息,感觉加是初始化RB2策略时候出的问题。
  2. 你选择的vt_symbol是什么?必须是类似"ag2012.SHFE"或者"SR101.CZCE"之类的,你在创建策略RBreaker时否把合约名称输错了?
  3. 出错信息你截屏的不完整,让别人分析错误,应该给出完整的错误提示。

马俊 wrote:

description代码没改动,报这个错

答复:

你是直接执行的trade_hour.py中的测试代码的吧?
必须把

rq.init('xxxxx','*****',("rqdatad-pro.ricequant.com",16011))

中的前两个参数替换成你自己的米筐账户的用户名和密码,一点都不改是不可以的。

晴空 wrote:

楼主,点个赞。
只是显示信息的小窗口,现在是固定在左上角,如果数据开始就有交易信号,就会被遮挡住了,能否改成可自动找最合适显示位置的?

想法不错,你自己试试改下吧,从ChartWidget的代码入手。
这涉及到主图中哪个区域有K线,哪个区域没有K线的计算。这样做出来的效果是,只要主图K线一动,指标提示子窗口就会不停移动,那样会造成你更加不舒服。
比较好的方法可能是,增加一个设置:增加显示/隐藏指标提示子窗口的开关和快捷键,如果觉得有遮挡主图K线就隐藏上面的指标提示子窗口,如果想看具体的指标值就显示指标提示子窗口。

1 我刚才测试了米筐的rqdatac:分别开了4个cmd窗口,每个都输入如下命令:

import rqdatac as rq
>>> rq.init('xxxxx','*****',("rqdatad-pro.ricequant.com",16011))   # 其中的xxxxx是用户名称,*****是账户米筐
>>> rq.get_price("AG2101")

前3个窗口都可以正常读取ag2101的日线数据,到了第4个窗口时发出了出错提示:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\decorators.py", line 131, in wrap
    return func(*args, **kwargs)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\services\get_price.py", line 103, in get_price
    order_book_ids, market
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\services\get_price.py", line 220, in classify_order_book_ids
    ins_list = ensure_instruments(order_book_ids, market=market)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\validators.py", line 168, in ensure_instruments
    all_instruments = _all_instruments_dict(market)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\decorators.py", line 111, in wrapper
    value = user_function(*args, **kwargs)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\services\basic.py", line 120, in _all_instruments_dict
    ins = _all_cached_instruments_list(market)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\decorators.py", line 111, in wrapper
    value = user_function(*args, **kwargs)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\services\basic.py", line 115, in _all_cached_instruments_list
    return _all_instruments_list(market)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\services\basic.py", line 110, in _all_instruments_list
    return [Instrument(i) for i in get_client().execute("all_instruments", market=market)]
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\decorators.py", line 59, in wrap
    return func(*args, **kwargs)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\thread_local.py", line 42, in execute
    return self._execute(self._get_connection(), method, args, kwargs)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\thread_local.py", line 38, in _execute
    raise e
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\thread_local.py", line 33, in _execute
    return conn.execute(method, *args, **kwargs)
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\connection.py", line 117, in execute
    msg_type, body = self._read_one_packet()
  File "D:\ProgramFiles\VnStudio\lib\site-packages\rqdatac\connection.py", line 87, in _read_one_packet
    raise get_error(code)(msg)
rqdatac.share.errors.QuotaExceeded: connection number exceeds

结果显示是连接数量超额了。说明确实是给了3个连接。

2 我出错的地方在哪里?

当我的策略中使用到米筐接口获取诸如合约的交易时段之类的时候,然后使用了CTA回测研究模块。当进行多线程优化的时候,发现提示connection number exceeds的错误。
主要是多线程优化的时候,vnpy根据电脑的CPU核数同时启动多个线程,使用多个不同的步进回测参数同时运行同一个策略。这时,如果策略中有用到读取rqdatac接口中的函数,就出现了连接数超额的错误,回测就出错停止了。

3 解决问题的想法

3.1 如果使用一个模块接口管理对象,将vnpy系统中对模块接口的访问进行统一排队,使得不同的线程可以分时共享访问rqdatac,这样应该能够解决此问题。
3.2 就算你不是遇到与我同样的访问米筐接口的情况,分时访问也是很有意义的,因为接口就一个,线程配额不可以超过三个。你可能在运行策略的时候,同时运行数据下载模块什么的,也是可能遇到系统对模块接口的连接超额的错误问题。

3.3 米筐数据现在也是vnpy的战略合作伙伴,官方推荐大家使用米筐数据。挖掘米筐数据的更多使用价值对vnpy系统也是锦上添花,有很多意想不到的的好处。可是这样增加了连接接口的线程额度超标的可能性。所以有必要考虑米筐接口共享使用的问题。这个问题的解决应该不难!

用Python的交易员 wrote:

已在2.1.7中加入这块功能,非常感谢hxxjava同学

能够得到您的表扬,非常高兴!
能够为系统奉献一点微薄之力,荣幸之至!
感谢你们为大家带来这么棒的开源交易平台!

购买了米筐的数据后,开始正式实盘。如果此时再想同时启动例外一台PC去回测或者调试,会提示rqdata连接出问题。
如何利用RpcService实现米筐数据共享,可行吗 ?请有经验的分享下经验吧,先谢谢了!!!

zw289212182 wrote:

hxxjava wrote:

这些都是本地停止单,已撤单的意思是停止单的条件没有没有满足,而且都是被你的策略主动撤单的。看看你的策略的代码就知道了。

哥,我用的就是CTA策略里的示例代码啊。。没有改动, 为啥是这样 不应该是下停止单啊

停止单的是CtaEngine维护的,你先看看代码,了解下什么是停止单就知道为什么会撤单了。

在策略中直接使用sleep()是非常坏的方法!
应该考虑在创建定时器的方法:
1 在策略中添加类似on_time()的成员函数
2 创建定时器,参数为self.on_time()和你后续的下单参数:OrderReq之类的(含有数量、价格、方向、开平等),并且启动定时器
3 定时器事件发生时,在策略的类似on_time()时间进行交易。

zw289212182 wrote:

xiaohe wrote:

实盘应该不会,实盘接入的是实盘行情。

好的谢谢啦! 想起来了实盘好像不是接的上期技术端口吧?
应该是接入期货公司给的帐号端口?
(还是小白,一直在跑模拟,求教实盘大神!)

看了你的图片,感觉你所谓的实盘是文华6模拟版吧?
simnow的数据是不延迟的
文华6模拟版行情延迟15分钟,
所以二者即时行情数据不一样。
在我看来,这是文华故意这样做的,目的是对付长期利用文华6模拟版免费看行情的人的。

这些都是本地停止单,已撤单的意思是停止单的条件没有没有满足,而且都是被你的策略主动撤单的。看看你的策略的代码就知道了。

欢乐马1618 wrote:

小白求教,手动下单具体如何步骤实现操作?

在 1楼的2.5节的图中有个“交易”组件,在其中输入合约代码、价格、数量、选择多/空和类型,确定就可以了。
注意不同交易所支持的价格类型可能不同。

yinzcreal wrote:

请问这个可以用于期权接口SoptGateway吗?

正在研究期权OptionMaster,目前还不知道是否可以用于SoptGateway

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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