我的策略逻辑很简单,就是每天对A股所有股票进行市值排序,由策略给出市值排名最小的10只股票作为交易标的,每天盘中实时更新股票市值排名,排名小于10的就调入,大于10的就调出,另外在期货市场买入1手股指期货合约进行对冲,到期交割后重新买入1手新的合约。
portfolil strategy给出的sample都是需要事先指定若干交易合约标的代码才能进行交易,如何能够不事先指定而由策略给出信号后确定交易标的呢?
对于新手,当然是通过VN Trader的界面操作是最直观和方便的,具体过程我就不做介绍了,入门系列教程讲的很详细。
如果想通过无界面启动模拟交易或者实盘交易,需要找到***\vnpy-2.1.1\examples\no_ui\文件夹下的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 = {
"用户名": "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界面操作中可以通过下拉菜单选择'空'进行委托下单。