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

对于新手,当然是通过VN Trader的界面操作是最直观和方便的,具体过程我就不做介绍了,入门系列教程讲的很详细。
如果想通过无界面启动模拟交易或者实盘交易,需要找到***\vnpy-2.1.1\examples\no_ui\文件夹下的run.py文件:

  1. 需要配置CTP、XTP或者其他接口的连接信息;
  2. 设置需要运行的CTA策略参数;
  3. run_child()子程序,在main_engine中增加相应接口;
  4. 创建CTA策略引擎;
  5. 创建自己的CTA策略;
  6. 初始化策略;
  7. 启动策略。

具体的示例如下:

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.xtp import XtpGateway
from vnpy.app.cta_strategy import CtaEngine
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接口连接设置
ctp_setting = {
    "用户名": "161xxx",
    "密码": "****************",
    "经纪商代码": "9999",
    "交易服务器": "180.168.146.187:10101",
    "行情服务器": "180.168.146.187:10111",
    "产品名称": "simnow_client_test",
    "授权编码": "0000000000000000",
    "产品信息": ""
}

# XTP接口连接设置
xtp_setting = {
    "账号": "53191000xxx",
    "密码": "********",
    "客户号": "1",
    "行情地址": "120.27.164.138",
    "行情端口": "6002",
    "交易地址": "120.27.164.69",
    "交易端口": "6001",
    "行情协议": "TCP",
    "授权码": "*****************************************"
}

# CTA策略信息
class_name = "DemoMaStrategyCTP"
strategy_name = "DM_ru2009"
vt_symbol = "ru2009.SHFE"
"""
class_name = "DemoMaStrategy"
strategy_name = "DM_601990"
vt_symbol = "601990.SSE"
"""
strategy_setting = {
    "fast_window": 5,
    "slow_window": 10
}


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

    event_engine = EventEngine()
    main_engine = MainEngine(event_engine)
    main_engine.add_gateway(XtpGateway)
    main_engine.add_gateway(CtpGateway)
    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(xtp_setting, "XTP")
    main_engine.write_log("连接XTP接口")

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

    sleep(10)

    # 创建CTA策略引擎
    cta_engine = CtaEngine(main_engine, event_engine)

    # 初始化CTA策略引擎, 会依次调用init_rqdata(), load_strategy_class()等函数
    cta_engine.init_engine()

    # 创建属于我们自己的策略,首次创建成功后会将参数写入到C:\Users\Administrator\.vntrader文件夹下的cta_strategy_setting.json文件内
    if strategy_name not in cta_engine.strategies:
        main_engine.write_log(f"创建{strategy_name}策略")
        cta_engine.add_strategy(class_name, strategy_name, vt_symbol, strategy_setting)
    else:
        cta_engine.update_strategy_setting(strategy_name, strategy_setting)

    # 初始化刚创建的策略
    cta_engine.init_strategy(strategy_name)

    # 留有足够的时间来进行策略初始化
    sleep(10)

    # 启动刚创建的策略
    cta_engine.start_strategy(strategy_name)

    # cta_engine.init_all_strategies()

    # sleep(60)
    # main_engine.write_log("CTA策略全部初始化")

    # cta_engine.start_all_strategies()
    # main_engine.write_log("CTA策略全部启动")

    print("正在交易中...")

    while True:
        sleep(1)

我已经成功运行SimNow的CTP接口,采用最简单的双均线策略进行了ru2009的模拟交易测试,下单的情况与策略逻辑一致。
目前vnpy的XTP接口只支持期货期权等具有'开'、'平'、'平今'、'平昨'的买卖操作,暂不支持股票的下单操作,服务器会拒单。原因是股票下单的"开平"应该选择'空',而不是'开'或者其他,询问过版主,XTP接口需要升级后才支持,但是在VN Trader界面操作中可以通过下拉菜单选择'空'进行委托下单。

Member
加入于:
帖子: 18
声望: 0

好酷啊,大兄弟。 有个问题想请教一下,假如某个策略在运行中挂掉了,那该咋办啊? 只能将全部策略全部停止,然后再运行 run.py吗?

Member
avatar
加入于:
帖子: 36
声望: 7

Trader_ZCY wrote:

好酷啊,大兄弟。 有个问题想请教一下,假如某个策略在运行中挂掉了,那该咋办啊? 只能将全部策略全部停止,然后再运行 run.py吗?

可以使用这个命令cta_engine.stop_strategy(strategy_name),来停止挂掉的那个策略。

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

大佬,现在最新版的vnpy目录下一直没找到no_ui这个目录啊

Member
avatar
加入于:
帖子: 36
声望: 7

杨大鑫 wrote:

大佬,现在最新版的vnpy目录下一直没找到no_ui这个目录啊

在examples目录下的no_ui

Member
加入于:
帖子: 12
声望: 0

chwei2ch wrote:

杨大鑫 wrote:

大佬,现在最新版的vnpy目录下一直没找到no_ui这个目录啊

在examples目录下的no_ui
那样是不是要手动安装,而不能用vnstudio安装?

Member
avatar
加入于:
帖子: 36
声望: 7

鋕桦 wrote:

chwei2ch wrote:

杨大鑫 wrote:

大佬,现在最新版的vnpy目录下一直没找到no_ui这个目录啊

在examples目录下的no_ui
那样是不是要手动安装,而不能用vnstudio安装?

可以用vnstudio安装,然后直接运行那个run.py就可以了

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

class_name = "DemoMaStrategyCTP", 这里我自己写的策略类py文件放在哪个目录下呢

Member
avatar
加入于:
帖子: 36
声望: 7

KTer wrote:

class_name = "DemoMaStrategyCTP", 这里我自己写的策略类py文件放在哪个目录下呢

默认路径是:C:\Users\Administrator\strategies

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

chwei2ch wrote:

KTer wrote:

class_name = "DemoMaStrategyCTP", 这里我自己写的策略类py文件放在哪个目录下呢

默认路径是:C:\Users\Administrator\strategies

谢谢!!!

Member
加入于:
帖子: 10
声望: 0

python run.py 按照文章来运行无界面模式,出错
错误产生在 main_engine.connect(exchange_setting,exchange_name) 连接接口 这里。

错误内容: 个人理解是gateway产生的
gateway.connect(setting)
session_number, proxy_host, proxy_port)
self.start(session_number)
self._pool = Pool(n)
return ThreadPool(processes, initializer, initargs)
Pool.init(self, processes, initializer, initargs)
if processes < 1:
TypeError: '<' not supported between instances of 'str' and 'int'

这要怎么解决呢? 有界面模式是能正常运行的。

Member
avatar
加入于:
帖子: 36
声望: 7

Lucien wrote:

python run.py 按照文章来运行无界面模式,出错
错误产生在 main_engine.connect(exchange_setting,exchange_name) 连接接口 这里。

错误内容: 个人理解是gateway产生的
gateway.connect(setting)
session_number, proxy_host, proxy_port)
self.start(session_number)
self._pool = Pool(n)
return ThreadPool(processes, initializer, initargs)
Pool.init(self, processes, initializer, initargs)
if processes < 1:
TypeError: '<' not supported between instances of 'str' and 'int'

这要怎么解决呢? 有界面模式是能正常运行的。

你设置的问题吧

Member
加入于:
帖子: 10
声望: 0

发现问题了 解决了 多谢提示!

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

在C盘的用户目录下创建了.vntrader和strategies文件,策略类py放到了strategies文件下,但是运行的时候一直提示找不到策略类,参见下图
请问当前的路径有问题么?strategy_name和py的文件名是不是一致啊?

description

Member
avatar
加入于:
帖子: 4618
声望: 284

strategy_name应该是策略类的名字吧

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

2.1.4版本没有找到no_ui 这个目录,就自己创建了一个,然后添加了run.py。然后好像是运行环境的问题,

  1. Traceback (most recent call last):
    File "D:/vnstudio/Lib/site-packages/vnpy/app/no_ui/run.py", line 6, in <module>
    from vnpy.event import EventEngine
    ModuleNotFoundError: No module named 'vnpy'

接下来,如果 环境问题对了,怎么解决策略加载的问题?和上面的其他人一样的问题,我觉得依然有路径和环境的问题。

求解答,谢谢~!

Member
avatar
加入于:
帖子: 4618
声望: 284
  1. 在GitHub里的vnpy/examples/no_ui里有run.py(https://github.com/vnpy/vnpy/tree/master/examples/no_ui)
  2. 策略还是放在用户运行的文件内(推荐),如在c:\users\administrator.vntrader目录下创建strategies文件夹;可以放在根目录下vnpy\app\cta_strategy\strategies文件夹内。 注意:策略文件命名是以下划线模式,如boll_channel_strategy.py;而策略类命名采用的是驼峰式,如BollChannelStrategy。
Member
avatar
加入于:
帖子: 15
声望: 1

策略加载运行是正常了,可是它没有实时数据更新啊,没有实时数据它也就没法开仓了,这要怎么搞呢?求大佬指点。

Member
加入于:
帖子: 59
声望: 8

楼主,为甚么还要再初始化一个CtaEngine对象(cta_engine = CtaEngine(main_engine, event_engine)呢,CtaStrategyApp的class里面已经把CtaEngine传入了:engine_class = CtaEngine,MainEngine.add_app()方法里调用了add_engine()方法,而且add_engine()方法会返回一个引擎即CtaEngine,所以把main_engine.add_app(CtaStrategyApp)改成cta_engine = main_engine.add_app(CtaStrategyApp)就已经实例化了Cta_engine 了,不过按照你的写法能正常交易,就是初始化了两遍CtaEngine,目前不清楚会有什么影响

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

ouzhongliang wrote:

策略加载运行是正常了,可是它没有实时数据更新啊,没有实时数据它也就没法开仓了,这要怎么搞呢?求大佬指点。
兄弟,你的问题解决了吗?
我也碰到这个问题了。

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

沪公网安备 31011502017034号

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