启动VN Station 加密策略文件成功了。
但尝试了一下,加密非策略文件,譬如加密回测的backtesting.py,报错,加密vnpy/app/cta_strategy/ 中的engine.py文件也报类似的错误。
请问是什么原因?
c:\vnstudio\lib\site-packages\Cython\Compiler\Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: C:\vnstudio\Lib\site-packages\vnpy\app\cta_strategy\backtesting.py
tree = Parsing.p_module(s, pxd, full_module_name)
Error compiling Cython file:
------------------------------------------------------------
...
def write_log(self, msg: str, strategy: CtaTemplate = None):
"""
Write log message.
"""
msg = f"{self.datetime}\t{msg}"
^
------------------------------------------------------------
Lib\site-packages\vnpy\app\cta_strategy\backtesting.py:1057:14: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
Traceback (most recent call last):
File "c:\vnstudio\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "c:\vnstudio\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "c:\vnstudio\Scripts\easycython.exe\__main__.py", line 9, in <module>
File "c:\vnstudio\lib\site-packages\begin\main.py", line 54, in start
collector=self._collector)
File "c:\vnstudio\lib\site-packages\begin\cmdline.py", line 253, in apply_options
return_value = call_function(func, signature(ext), opts)
File "c:\vnstudio\lib\site-packages\begin\cmdline.py", line 236, in call_function
return func(*pargs, **kwargs)
File "c:\vnstudio\lib\site-packages\easycython\easycython.py", line 77, in main
ext_modules = cythonize(ext_modules),
File "c:\vnstudio\lib\site-packages\Cython\Build\Dependencies.py", line 1102, in cythonize
cythonize_one(*args)
File "c:\vnstudio\lib\site-packages\Cython\Build\Dependencies.py", line 1225, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py
Compiling C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py because it changed.
[1/1] Cythonizing C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py
加密失败。
1、多人交易不同账户,运行多个vnpy,这个已经实现
2、多人使用同一个账户,rpcservice作为一个服务端,其他人运行vnpy通过连接rpcgateway来连接之前打开的服务端。请问,服务端可以放在阿里云上,其他人运行vnpy在本地不同的电脑上吗?
在本地机中,复制examples中的trader文件夹,可以实现在本地 登录不同账号的功能
请问 ,如果购买了阿里云
想几个人都利用这台阿里云,分别交易不同账户或者同一个账号(譬如在本地不同电脑下单),如何实现?
好像有个rpc功能,能阿里云拖几台本地机么?
能不能指导一下步骤,非常感谢
找到原因了,问题出在engine中的CtaTemplate的子类判断语句
engine中导入的是相对路径下的CtaTemplate
策略中导入的是绝对路径vnpy.app.cta_strategy路径下的CtaTemplate
两个CtaTemplate同名,但因为路径不一样,不是同一个类,因此在子类判断的时候没有通过
解决办法就是把engine中的CtaTemplate路径也改成绝对路径就能成功了
版本号 2.1.9
目的是想将修改后的cta_strategy组件放置在run.py对应的路径下,不影响site-packages中的原文件
但是,启动后,发现策略没有了,不知道哪个路径还需要修改一下
实施步骤:
1、建立examples文件夹
2、examples文件下新建vn_trader 文件夹
3、vn_trader 文件夹中拷贝.vtrader , cta_strategy , gateway , strategies 文件夹, demo_script.py , run.py 文件
4、修改 run.py 中的启动接口
在run.py路径下,shift+右键,输入python run.py启动
但是启动结果是,找不到策略了,还需要修改cta_strategy中的哪个文件才能实现将cta_strategy迁移至run.py所在的路径下?
大连品种,开多一张,再开空一张,保证金是双边收取。
快期V2 软件 有个组合保证金功能, 进入——大商所组合,选自动组合,这样多一张、空一张下单之后(快期要一直开启),锁仓是按单边来收取保证金的。
请问vnpy如何实现 实时组合保证金?(这样就不用再开快期V2软件了)
快期功能说明地址:
https://www.shinnytech.com/blog/dashangsuo-zuhe/
发送订单
第1 发单 cover_vt_orderid = self.cover(cover_price, abs(order_volume))
发单之后INFO信息会返回一个Order Object
第2 打印 self.write_log(f'买入平仓 , pos:{self.pos}, local_pos:{self.local_pos}, \
orderid:{cover_vt_orderid}, symbol:{self.vt_symbol}, price:{cover_price}, volume:{order_volume}')
返回信息 和打印信息如下:
2021-07-02 09:03:05,599 INFO: original_req:OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')
2021-07-02 09:03:05,599 INFO: req_list:[OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')]
2021-07-02 09:03:05,617 INFO: req:OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')
2021-07-02 09:03:05,617 INFO: ex_long jm2108&jm2110: 买入平仓 , pos:50, local_pos:0, orderid:['CTP.6_1679360163_1'], symbol:SP jm2108&jm2110.DCE, price:116.5, volume:1
请问,怎么才能第一时间在策略的内部主动获取这个Order Object的信息
cover_vt_orderid = self.cover(cover_price, abs(order_volume))
譬如在上述发单命令之后,在策略的内部调用self.cta_engine.main_engine.get_order(cover_vt_orderid),获取不到这个order Object,得到的是 None
提交一个挂单,然后再撤单,收到的订单回报正确顺序应该为: 提交中,未成交,已撤单。
但是,发现在收到已撤单前一瞬间,会收到上一个未成交信息的重复推送,变成了:提交中,未成交,未成交,已撤单
请问是我改代码的原因,还是版本的原因? 2.1.1版本。
不知道部分成交撤单会不会出现类似情况
2021-06-25 10:12:48,083 INFO: 行情服务器连接成功
2021-06-25 10:12:48,083 INFO: 交易服务器连接成功
2021-06-25 10:12:48,349 INFO: 交易服务器授权验证成功
2021-06-25 10:12:48,349 INFO: 行情服务器登录成功
2021-06-25 10:12:48,364 INFO: 交易服务器登录成功
2021-06-25 10:12:49,833 INFO: 结算信息确认成功
2021-06-25 10:12:56,552 INFO: 合约信息查询成功
2021-06-25 10:13:01,521 INFO: CTA策略引擎初始化成功
2021-06-25 10:13:05,755 INFO: in_mark_long pp2109开始执行初始化
2021-06-25 10:13:05,755 INFO: in_mark_long pp2109: 策略初始化
2021-06-25 10:13:05,755 INFO: in_mark_long pp2109初始化完成
2021-06-25 10:13:06,224 INFO: in_mark_long pp2109: 策略启动
2021-06-25 10:13:23,786 INFO: cta_engine strategy.name:in_mark_long pp2109
2021-06-25 10:13:23,786 INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 23, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:23,786 INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:23,786 INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[], short_orderids:[], cover_orderids:[]
2021-06-25 10:13:23,864 INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:23,864 INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:23,873 INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[], short_orderids:[], cover_orderids:[]
2021-06-25 10:13:46,114 INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:46,114 INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:46,114 INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[], short_orderids:[], cover_orderids:[]
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.CANCELLED: '已撤销'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: ask_price:8508.0, bid_price:8507.0, ask_volume:59, bid_volume:12
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: on_order算法补单
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: buy_orderids:[], sell_orderids:[], short_orderids:[], cover_orderids:[]
可以显示了,输入合约代码,要敲回车,敲完回车就出来了
关于手动交易组件里面的实时价格显示,代码中有实时价格的定义,控件也在布局中定义了,为什么手动交易控件中没有显示实时价格呢? 印象中1.9版本的能显示,现在用的是2.1.1版本,目前没有看到显示。 是不是打开方式不对?能看到实时价格显示的正确步骤应该是怎样的?
复制 C:\vnstudio\Lib\site-packages\vnstation\下的 run.py 底层接口和上层应用加载的比较全
一共有三个文件需要复制拷贝,run.py文件,strategies文件夹和.vntrader 文件夹
文件夹.vntrader 和strategies可能在C:\Users\Administrator 路径下
个人理解的新建账户的过程:
1、新建文件夹 traders
2、在traders中拷贝进run.py文件,strategies文件夹和.vntrader夹
3、在traders中启动run.py文件
找到原因了,正常的情况,其他软件下的单,也都能进入到cta_engine,收到第一个单就卡住了,是因为自己写了一个处理函数,函数有点问题,但是vnstudio里面没有报错,也没死机。删除自己写的这个函数之后,推送恢复正常
收到其他软件下单后,用order.vtorderid,它也能实现本地订单号,譬如生成:CTP.21-647510950_000000000056,请问为什么这个其他软件下单生成的本地订单号对应的事件在事件引擎中,不会被get取出来呢(如果能提取,就不会阻塞队列了)?
尝试了一下跟踪其他软件手动下单,订单在vnpy中的处理过程,cta_gateway.py -->gateway.py-->eventengine,这三个位置都用log打印出来,看看发生了什么。
cta_gateway.py中,添加打印如下:
def onRtnOrder(self, data: dict):
"""
Callback of order status update.
"""
symbol = data["InstrumentID"]
exchange = symbol_exchange_map.get(symbol, "")
if not exchange:
self.order_data.append(data)
return
frontid = data["FrontID"]
sessionid = data["SessionID"]
order_ref = data["OrderRef"]
orderid = f"{frontid}_{sessionid}_{order_ref}"
order = OrderData(
symbol=symbol,
exchange=exchange,
orderid=orderid,
type=ORDERTYPE_CTP2VT[data["OrderPriceType"]],
direction=DIRECTION_CTP2VT[data["Direction"]],
offset=OFFSET_CTP2VT[data["CombOffsetFlag"]],
price=data["LimitPrice"],
volume=data["VolumeTotalOriginal"],
traded=data["VolumeTraded"],
status=STATUS_CTP2VT[data["OrderStatus"]],
time=data["InsertTime"],
gateway_name=self.gateway_name
)
self.gateway.on_order(order)
self.sysid_orderid_map[data["OrderSysID"]] = orderid
# 无问西东
logger.info(f"gateway.on_order:{order}")
logger.info(f"data["OrderSysID"]:{data["OrderSysID"]}")
gateway.py中 on_event ,添加打印如下:
def on_event(self, type: str, data: Any = None) -> None:
"""
General event push.
"""
event = Event(type, data)
self.event_engine.put(event)
# 无问西东
logger.info(f"gateway.py on_event event.type:{event.type}")
logger.info(f"gateway.py on_event event.data:{event.data}")
eventengine中,添加打印如下:
def _run(self) -> None:
"""
Get event from queue and then process it.
"""
while self._active:
try:
event = self._queue.get(block=True, timeout=1)
# 无问西东
logger.info(f"_run event_engine event.type:{event.type}")
logger.info(f"_run event_engine event.data:{event.data}")
self._process(event)
except Empty:
pass
1、请问在gateway.on_order函数中,为什么要推送两次?一次是EVENT_ORDER,一次是EVENT_ORDER + order.vt_orderid,两个的作用分别是什么?
def on_order(self, order: OrderData) -> None:
"""
Order event push.
Order event of a specific vt_orderid is also pushed.
"""
self.on_event(EVENT_ORDER, order)
self.on_event(EVENT_ORDER + order.vt_orderid, order)
2、打印出来的结果如下,会发现EVENT_ORDER的event在eventengine中的_run中的队列中被提取掉,并被后续的mainengine处理,而EVENT_ORDER + order.vt_orderid对应的事件在_run函数中没有被提取,也就是没有被打印出来,导致后续所有的下单(包括vnpy自带的下单控件下的单就没有响应,可能是跟队列中,有没被提取的事件导致阻塞有关)。请问为什么平时vnpy自带的下单控件下单对应的EVENT_ORDER + order.vt_orderid事件能被处理,而用其他软件下单对应的EVENT_ORDER + order.vt_orderid事件不能被提取?:
2021-03-10 22:58:33.213 | INFO | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.
2021-03-10 22:58:33.213 | INFO | vnpy.event.engine:_run:66 - _run event_engine event.type:eOrder.
2021-03-10 22:58:33.227 | INFO | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.227 | INFO | vnpy.event.engine:_run:67 - _run event_engine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.227 | INFO | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.CTP.21_-647510950_000000000056
2021-03-10 22:58:33.227 | INFO | vnpy.trader.engine:process_order_event:400 - mainengine event.type:eOrder.
2021-03-10 22:58:33.227 | INFO | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.227 | INFO | vnpy.trader.engine:process_order_event:401 - mainengine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.243 | INFO | vnpy.app.cta_strategy.engine:process_order_event:178 - cta_engine event.type:eOrder.
2021-03-10 22:58:33.243 | INFO | vnpy.app.cta_strategy.engine:process_order_event:179 - cta_engine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.259 | INFO | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.
2021-03-10 22:58:33.259 | INFO | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 3, 11, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.259 | INFO | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.CTP.21_-647510950_000000000056
2021-03-10 22:58:33.259 | INFO | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 3, 11, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
mark 其他交易软件下的单,能否也能区分一下?
日线合成注意事项
1 import datetime 原文的所有time函数, 譬如time(14, 59), 改为datetime.time(14, 59)
2 from vnpy.trader.constant import Interval, 导入后,才能调用Interval.DAILY
3 策略中初始化 self.bg_day = BarGenerator(self.on_bar, 1, self.on_day_bar, Interval.DAILY)
4 原文 if bar.exchange == Exchange.CFFEX and not bar.symbol.startswith("I"):
改为 if bar.exchange == Exchange.CFFEX and bar.symbol.startswith("T"): 国债以T字母开头
请问一下,如果是其他交易软件手动下的单,如何通过vnpy获取该手动订单的订单信息以及成交回报信息?想实现手动开仓,vnpy自动风控