通用常见问题
on_bar和on_schedule(on_calculate)有什么区别
答: K线闭合的时候会触发on_bar,on_schedule(on_calculate)只在CTA引擎和SEL引擎下会触发。对于CTA引擎来说,主K线闭合并且其他已订阅的K线都正常闭合,才会触发on_schedule;对于SEL引擎来说,当设定的重算时间到了才会触发on_schedule。on_schedule触发前,底层都会确保应该闭合的K线已经触发了on_bar
WonderTrader中标的代码规则
答: WonderTrader内部采用统一的合约代码标准:
期货合约为“交易所.品种.月份”,如CFFEX.IF.2306,郑商所也同样需要扩充到4位月份
商品期权合约为“交易所.品种月份.方向.行权价”,如CFFEX.IO2007.C.4000,郑商所也同样需要扩种到4位月份
股票代码为如SSE.STK.600000或者SZSE.STK.000001
股票指数代码SSE.IDX.000001
ETF代码SSE.ETF.510050
ETF期权代码SSE.ETFO.10003961
如何选择交易引擎
答: WonderTrader一共有四种交易引擎:
CTA引擎,主要针对CTA策略的需求来设计,主要适用于少量标的(单策略50个标的以内)时序策略的引擎,采用M+1+N执行架构,信号执行剥离,可以配置多路执行器实现多账户统一交易
SEL引擎,和CTA引擎类似,也采用M+1+N执行架构,支持多账户统一交易。底层采用异步驱动机制,适合大量计算的场景(策略计算时长超过1分钟)
HFT引擎,高频交易引擎,支持wtpy开发策略,适用于高频交易场景
UFT引擎,极速交易引擎,只支持C++开发策略,适用于超高频超低延迟场景
如何理解策略组合
答: 在WonderTrader中,无论使用什么引擎,都绕不开策略组合的概念。组合,全称是策略组合,顾名思义,就是若干个策略形成的一组策略。
对于HFT引擎和UFT引擎来说,组合就只是单纯的将策略统一管理起来。
而对于CTA引擎和SEL引擎来说,组合层面会有一层持仓、资金、成交的概念。组合的成交遵循以下流程:
首先不同策略生成自己的目标头寸
每分钟组合会汇总每个子策略的目标头寸,并将相反的头寸做一个轧平,得到组合的净头寸
然后将组合的净头寸,提交给执行器来执行
从形式上来说,一个交易进程中有且只有一个组合。组合在代码上存在的形式,可以等同于engine,也就是说一个engine就是一个组合。
从功能上来说,尤其对于CTA引擎和SEL引擎,组合延伸了持仓、成交、资金等概念,还可以基于组合做一层理论上的风控。
这里要注意区分一下:多个子策略并不是共享了组合的持仓数据,而是组合汇总了子策略的持仓数据。
如何使用openctp
答: openctp主要提供了行情接口和交易接口,要使用openctp,主要是修改parsers和traders的配置。
openctp的环境,可以参考此页面: http://121.37.80.177:50080/detail.html
parsers的配置可以参考以下配置:
parsers:
- active: true
broker: '9999'
code: ''
front: tcp://210.14.72.14:4402
id: parser
module: ParserCTP
pass: test
user: test
# 如果要使用openctp,启用该配置项即可
ctpmodule: tts_thostmduserapi_se
traders的配置可以参考以下配置:
traders:
- active: true
id: openctp # id
module: TraderCTP # 模块文件名,win下会自动转成xxx.dll,linux会自动转成libxxx.so
savedata: true # 是否保存数据,如果为true,会将接口拉取到的成交、订单、资金和持仓都写到本地文件中
front: tcp://210.14.72.14:4400 #VIP
broker: '9000'
appid: empty
authcode: empty
pass: test
user: test
quick: true # 是否订阅快速私有流,如果为true,则不会接受上次之前的私有流,这个一定要为true!!!
ctpmodule: tts_thosttraderapi_se # ctp模块名,如果需要使用其他仿制CTP模块,使用该配置项直接将仿制的CTP模块传给TraderCTP即可
CTA仿真(实盘)配置流程指引
答: 详细流程可以参考文档实盘完整攻略。这里以期货CTA为例,梳理一下流程步骤:
1、配置CTPLoader,并拉取最新的合约列表和品种列表,参考demo: wtpy/demos/ctp_loader
2、配置HotPicker,并拉取最新的主力换月规则,参考demo: wtpy/demos/test_hotpicker。(如果不需要使用主力合约如CFFEX.IF.HOT,可以跳过该步骤)
3、配置datakit并运行,参考demo: datakit_fut
4、配置交易组合,运行策略,参考demo: wtpy/demos/cta_fut
注意事项:
1、datakit的配置文件dtcfg.yaml中的broadcaster配置的端口必须要和交易组合中的tdparsers.yaml中的端口一致
2、交易组合中config.yaml配置的storage的数据目录必须要和datakit中的一致
如何理解CTA引擎中的下单接口
答: CTA引擎的下单接口,汇总起来包含以下几个接口:
def stra_enter_long(self, stdCode:str, qty:float, usertag:str = "", limitprice:float = 0.0, stopprice:float = 0.0):
def stra_exit_long(self, stdCode:str, qty:float, usertag:str = "", limitprice:float = 0.0, stopprice:float = 0.0):
def stra_enter_short(self, stdCode:str, qty:float, usertag:str = "", limitprice:float = 0.0, stopprice:float = 0.0):
def stra_exit_short(self, stdCode:str, qty:float, usertag:str = "", limitprice:float = 0.0, stopprice:float = 0.0):
四个接口分别开多、平多、开空、平空四种操作。接口的实现,接口用法和MultiCharts的buy/sell/sellShort/butToCover相同,可以概括如下:
开多N手——当持仓大于等于0时,则直接开多N手;当持仓小于0(持有空头)时,则先平掉空头持仓,再开多N手
平多N手——当持仓大于等于N时,则平掉N手多头;当持仓小于N时,则平掉全部多头持仓
开空N手——当持仓小于等于0(持有空头)时,则直接开空N手;当持仓大于0时,则先平掉多头持仓,再开空N手
平空N手——当空持仓大于等于N时,则平掉N手空头;当空头持仓小于N时,则平掉全部空头持仓
如果设置了limitprice和stopprice,则下单指令变成了条件单。所谓条件单,即需要满足条件才会触发信号。CTA引擎的条件单,每次on_calc调用之前,都会清除掉之前设置的条件单,即条件单的声明周期仅在下一根主K线的bar闭合之前。这样的机制,可以将策略简化到只需要实现on_calc就可以了,这个机制也是参考了MultiCharts来实现的。
限价limitprice和止价stopprice从某种角度来说,更像是交易信号的二次确认。以买入(开多或者平空)为例,当最新价小于等于limitprice,或者当最新价大于等于stopprice,才会触发买入信号。如果一个条件单同时设置了limitprice和stopprice,只有limitprice会生效。