vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 19
声望: 1

各位大佬:
有人在ubuntu 系统下实盘vnpy的经验吗?
有的话,能不能分享一下经验
我运行的是是examples/no_ui/run.py, 在windows下可以跑通,而且我还通过该程序直接实盘跑了一天
但是同一个程序在lilnux 下确找不到合约(BTC200410.HUOBI,我确定该合约肯定存在)

def run_child():
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_gateway(HbdmGateway)
cta_engine = main_engine.add_app(CtaStrategyApp)
main_engine.write_log("主引擎创建成功")

log_engine = main_engine.get_engine("log")
event_engine.register(EVENT_CTA_LOG, log_engine.process_log_event)
main_engine.write_log("注册日志事件监听")

main_engine.connect(hbdm_setting, "HBDM")
main_engine.write_log("连接CTP接口")
Administrator
avatar
加入于:
帖子: 4028
声望: 221

connect后,加一个sleep(10),等待10秒获取合约数据。

数字货币接口的初始化速度比较慢,要多等一会。

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

不行,我在後面加了sleep(40)都找不到合約

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

import multiprocessing
from time import sleep
from datetime import datetime, time
from logging import INFO

from vnpy.event import EventEngine
from vnpy.trader.setting import SETTINGS
from vnpy.trader.engine import MainEngine
from vnpy.gateway.ctp import CtpGateway
from vnpy.gateway.hbdm import HbdmGateway
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.cta_strategy.base import EVENT_CTA_LOG

SETTINGS["log.active"] = True
SETTINGS["log.level"] = INFO
SETTINGS["log.console"] = True

ctp_setting = {
"用户名": "",
"密码": "",
"经纪商代码": "",
"交易服务器": "",
"行情服务器": "",
"产品名称": "",
"授权编码": "",
"产品信息": ""
}
hbdm_setting = {
"API Key": "",
"Secret Key": "",
"会话数": 3,
"代理地址": "",
"代理端口": "",
}

def run_child():
"""
Running in the child process.
"""
SETTINGS["log.file"] = True

event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_gateway(HbdmGateway)
cta_engine = main_engine.add_app(CtaStrategyApp)
main_engine.write_log("主引擎创建成功")
gateway_names = main_engine.get_all_gateway_names()
print('gateway_names:{0}'.format(gateway_names))
log_engine = main_engine.get_engine("log")
event_engine.register(EVENT_CTA_LOG, log_engine.process_log_event)
main_engine.write_log("注册日志事件监听")

main_engine.connect(hbdm_setting, "HBDM")
main_engine.write_log("连接CTP接口")

sleep(10)

cta_engine.init_engine()
main_engine.write_log("CTA策略初始化完成")

cta_engine.init_all_strategies()
sleep(60)   # Leave enough time to complete strategy initialization
main_engine.write_log("CTA策略全部初始化")
cta_engine.start_all_strategies()
main_engine.write_log("CTA策略全部启动")

while True:
    sleep(1)


def run_parent():
"""
Running in the parent process.
"""
print("启动CTA策略守护父进程")

# Chinese futures market trading period (day/night)
DAY_START = time(8, 45)
DAY_END = time(15, 30)

NIGHT_START = time(20, 45)
NIGHT_END = time(2, 45)

child_process = None

while True:
    current_time = datetime.now().time()
    trading = False

    # Check whether in trading period
    # if (
    #     (current_time >= DAY_START and current_time <= DAY_END)
    #     or (current_time >= NIGHT_START)
    #     or (current_time <= NIGHT_END)
    # ):
    trading = True

    # Start child process in trading period
    if trading and child_process is None:
        print("启动子进程")
        child_process = multiprocessing.Process(target=run_child)
        child_process.start()
        print("子进程启动成功")

    # 非记录时间则退出子进程
    if not trading and child_process is not None:
        print("关闭子进程")
        child_process.terminate()
        child_process.join()
        child_process = None
        print("子进程关闭成功")

    sleep(5)


if name == "main":
run_parent()

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

同一个程序在windows vn stutio prompt环境下可以跑通,但是在linux 下确跑不通
显示找不到合约BTC200410.HUOBI
description

Administrator
avatar
加入于:
帖子: 4028
声望: 221

确实少了个查询合约信息成功的日志输出,你的这个Ubuntu服务器是在海外吗?或者配置翻墙工具了?

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

一开始我以为是vpn 的问题,于是我把vnpy 部署到了东京的的亚马逊服务器,但是结果是一样的.
在本地跑的时候,如果是有界面的话可以查询到该合约的信息,并且可以下载数据,但是在无界面的情况下就不行了

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

@用python的交易员,大佬,我还在等待您的回答呢

Administrator
avatar
加入于:
帖子: 4028
声望: 221

我在Windows上测了下没问题啊:

description

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

我在windows下测试也没有问题,只是在Linux 下测试存在问题,而且在两台不同的Linux下都存在这个问题

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

我也遇到了相同的问题,对源代码进行了分析,问题出现在vnpy使用了multiprocessing来做多进程的运行,不知道是不是window和ubuntu对进程的处理不同,no_ui/run.py中的守护父进程导致了D:\vnstudio\Lib\site-packages\vnpy\api\rest\rest_client.py中 278 pool.apply_async()进程卡死。临时的解决方案是把no_ui/run.py中的守护父进程先去掉,直接运行run_child()

if __name__ == "__main__":
    run_child()
Member
avatar
加入于:
帖子: 3
声望: 0

我还有一个猜想,我的window电脑是4核处理器,而服务器是2核的,不知道是不是进程池再等待守护进程释放cpu,准备再找台4核cpu的服务器测试一下,multiprocessing文档和代码在研究,要弄懂可能需要一段时间,但感觉这是解决这个问题的根本方法。

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

我刚刚测试了你的方法,直接运行run_child是可以获取合约信息的。我在本地和云端都试了没有问题,系统是ubuntu。

description

謝謝!

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

dongyun wrote:

我还有一个猜想,我的window电脑是4核处理器,而服务器是2核的,不知道是不是进程池再等待守护进程释放cpu,准备再找台4核cpu的服务器测试一下,multiprocessing文档和代码在研究,要弄懂可能需要一段时间,但感觉这是解决这个问题的根本方法。

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

非常感谢,这个方法ok,我试过了

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

rick wrote:

dongyun wrote:

我还有一个猜想,我的window电脑是4核处理器,而服务器是2核的,不知道是不是进程池再等待守护进程释放cpu,准备再找台4核cpu的服务器测试一下,multiprocessing文档和代码在研究,要弄懂可能需要一段时间,但感觉这是解决这个问题的根本方法。
如果这里成立的话,vnpy因为引进多进程而对服务器要求那么高,就大大限制了它的使用了。不过反过来,可能他们更多是想给那些不太懂程序,只要界面操作就能用的人使用的。有一定代码基础的,还是建议多研究几个开源项目,搭建一个适合自己交易策略的系统。

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

方便加个微信吗?

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

xjh749241148

Administrator
avatar
加入于:
帖子: 4028
声望: 221

dongyun wrote:

我也遇到了相同的问题,对源代码进行了分析,问题出现在vnpy使用了multiprocessing来做多进程的运行,不知道是不是window和ubuntu对进程的处理不同,no_ui/run.py中的守护父进程导致了D:\vnstudio\Lib\site-packages\vnpy\api\rest\rest_client.py中 278 pool.apply_async()进程卡死。临时的解决方案是把no_ui/run.py中的守护父进程先去掉,直接运行run_child()

if __name__ == "__main__":
    run_child()

数字货币是24小时交易,没有定时启停的需求,确实直接运行run_child就行了。

另外这个apply_async的问题,我们2.1.2版本已经替换掉了,也有用户反映过存在别的问题。

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

好的,谢谢,大佬

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