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

用Python的交易员 wrote:

非常详细,给你加个精华!
期望在下一版的系统自带该功能!!!

这的确是个大问题,实盘自动交易不可能手工的

👏🏻👏🏻👏🏻👏🏻👏🏻👏🏻👏🏻👏🏻👏🏻👏🏻

xiaohe wrote:

  1. 你需要的是连接simnow,那是需要推进来新的tick和之前本地的数据当然不一样了;
  2. 你图形界面是能看到simnow的tick推进来显示在图形界面上吗?如果是,说明你是连上了simnow收到了数据的,那就可能是你no_ui脚本有问题;
  3. 我看你no_ui也是输出了合约信息查询成功的,那说明你是收到了数据的,可以print一下看看;
  4. 你说的没有收到数据具体是怎样呢?
  5. 我看你的代码和no_ui脚本有点出入,建议可以先用原始的no_ui脚本看看出不出错,然后再进行个性化修改

这个周末再试了一次,能够收到数据,就是simnow抽风

大力支持!!!!

xiaohe wrote:

图形界面收得到吗?要是收得到可能是simnow抽风

图形界面没问题,刚才再次确认过,还是收不到数据。CTA策略以前是基于本地数据库测试的,有关系吗?

ouzhongliang wrote:

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

运行 run.py 进行无界面测试。
显示如下:

description

但CTA策略中就是收不到数据,因为是周日,选的第三套simnow账号,
run.py完整代码如下:

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 = {
"用户名": "XXXXX",
"密码": "XXXXX",
"经纪商代码": "9999",
"交易服务器": "180.168.146.187:10130",
"行情服务器": "180.168.146.187:10131",
"产品名称": "simnow_client_test",
"授权编码": "0000000000000000",
"产品信息": ""
}

CTA策略信息

class_name = "DualThrustStrategy"
strategy_name = "DT_p2009"
vt_symbol = "p2009.DCE"

strategy_setting = {
"risk_percent": 0.02,
"long_window": 21,
"mobile_stop": 0
}

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_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(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)
    main_engine.write_log(f"更新{strategy_name}策略")

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

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

# 启动刚创建的策略
cta_engine.start_strategy(strategy_name)
main_engine.write_log(f"启动{strategy_name}策略")

sleep(20)  # Leave enough time to complete strategy initialization

main_engine.write_log(f"启动{strategy_name}策略成功")

sleep(2)  # Leave enough time

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

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, 10)

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()

CTA策略在 jupyter notebook 回测能收到数据。

重启机器,修改 DAY_START时间都不管用。

请问各位大神帮我看看,哪儿出问题了?

基于tick的回测,不想加载历史数据,接收到tick就开始回测计算,不调用load_tick函数会报错,调用时把load_tick中的initdays设置为0,但策略中还是会有一天的数据进行了初始化,相当于引擎默认将initdays设置为了1,请教各位大神,怎么解决这个问题啊。

xiaohe wrote:

  1. K线回测模式下,只会调用on_bar,因为没有tick数据
  2. Tick回测模式下,只会调用on_tick,然后由策略自行合成K线调用on_bar(BarGenerator)
  3. Tick回测理论上会更精准些,但是耗时也会长的多,所以对大部分人来说得不偿失

谢谢!!!!

你好,请问你解决了吗?我进行tick级回测也遇到了这个问题?

从2020-07-23 23:50左右打开VN Trader Pro 就报错,进不去了,具体如下:
Traceback (most recent call last):
File "c:\vnstudio\lib\site-packages\vnstation\cli.py", line 90, in run_trader
module = importlib.import_module(d["module"])
File "c:\vnstudio\lib\importlib__init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "c:\vnstudio\lib\site-packages\vnpy\app\portfolio_strategy\
init.py", line 11, in <module>
from .backtesting import BacktestingEngine
File "c:\vnstudio\lib\site-packages\vnpy\app\portfolio_strategy\backtesting.py", line 8, in <module>
import matplotlib.pyplot as plt
File "c:\vnstudio\lib\site-packages\matplotlib\
init.py", line 207, in <module>
_check_versions()
File "c:\vnstudio\lib\site-packages\matplotlib\
init.py", line 192, in _check_versions
from . import ft2font
ImportError: cannot import name 'ft2font' from 'matplotlib' (c:\vnstudio\lib\site-packages\matplotlib\
init__.py)

有大神能帮忙看看嘛?

我可能表达的不清楚,我是不理解在tick模式下,on_bar中逻辑是否执行,以及bar模式下,on_tick中的逻辑是否执行?
因为我觉得,回测在bar模式下和实盘相差很大,只有tick模式下才能尽可能接近实盘。

已经有tick数据,并且导入到数据库了。
但对这种逻辑不太清楚,所以想请教大神!!

提示如下
Traceback (most recent call last):
File "c:\vnstudio\lib\site-packages\vnpy\trader\ui\mainwindow.py", line 281, in open_widget
widget = widget_class(self.main_engine, self.event_engine)
File "c:\vnstudio\lib\site-packages\vnpy\app\cta_backtester\ui\widget.py", line 51, in init
self.init_strategy_settings()
File "c:\vnstudio\lib\site-packages\vnpy\app\cta_backtester\ui\widget.py", line 59, in init_strategy_settings
setting = self.backtester_engine.get_default_setting(class_name)
File "c:\vnstudio\lib\site-packages\vnpy\app\cta_backtester\engine.py", line 237, in get_default_setting
return strategy_class.get_class_parameters()
File "c:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\template.py", line 60, in get_class_parameters
class_parameters[name] = getattr(cls, name)
AttributeError: type object 'DemoStrategy' has no attribute 'slowa_window'

目前的策略是突破型的,主要是基于前几个K线的收盘价和当前K线的开盘价决定是否开仓。
想请教这种模式该选tick回测还是bar回测?
如果选择tick回测,这种模式下on bar还会执行吗,可以在onbar里读取前几个K线,然后在下一个tick(即当前K线的开盘价)里进行开仓吗?
如果选择onbar,读取前几个K线肯定没问题,ontick还执行吗?能否在ontick里获取当前K线的开盘价,并进行开仓吗?

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

沪公网安备 31011502017034号

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