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
马俊 wrote:
我输入vt_symbol是JD88.DCE这样的指数合约时就会报上面的错,我改成单个合约不报上面的错啦,但还是会报如下错
如下
马俊 wrote:
老大 参数修改了还是不行,是不是那里的数据转换有问题?
马俊 wrote:
代码没改动,报这个错
你是直接执行的trade_hour.py中的测试代码的吧?
必须把
rq.init('xxxxx','*****',("rqdatad-pro.ricequant.com",16011))
中的前两个参数替换成你自己的米筐账户的用户名和密码,一点都不改是不可以的。
晴空 wrote:
楼主,点个赞。
只是显示信息的小窗口,现在是固定在左上角,如果数据开始就有交易信号,就会被遮挡住了,能否改成可自动找最合适显示位置的?
想法不错,你自己试试改下吧,从ChartWidget的代码入手。
这涉及到主图中哪个区域有K线,哪个区域没有K线的计算。这样做出来的效果是,只要主图K线一动,指标提示子窗口就会不停移动,那样会造成你更加不舒服。
比较好的方法可能是,增加一个设置:增加显示/隐藏指标提示子窗口的开关和快捷键,如果觉得有遮挡主图K线就隐藏上面的指标提示子窗口,如果想看具体的指标值就显示指标提示子窗口。
import rqdatac as rq
>>> rq.init('xxxxx','*****',("rqdatad-pro.ricequant.com",16011)) # 其中的xxxxx是用户名称,*****是账户米筐
>>> rq.get_price("AG2101")
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个连接。
当我的策略中使用到米筐接口获取诸如合约的交易时段之类的时候,然后使用了CTA回测研究模块。当进行多线程优化的时候,发现提示connection number exceeds的错误。
主要是多线程优化的时候,vnpy根据电脑的CPU核数同时启动多个线程,使用多个不同的步进回测参数同时运行同一个策略。这时,如果策略中有用到读取rqdatac接口中的函数,就出现了连接数超额的错误,回测就出错停止了。
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节的图中有个“交易”组件,在其中输入合约代码、价格、数量、选择多/空和类型,确定就可以了。
注意不同交易所支持的价格类型可能不同。