策略配置文件

使用不同引擎的策略需要的策略配置文件不同,回测与仿真/实盘也有所区别,可以在对应的demo中,获取对应的配置文件信息

策略配置文件可以采用yaml格式或者json格式,由于json格式无法添加注释,因此现在已经逐渐替换为yaml格式了

yaml基本语法

Tip

策略配置文件一般与策略可执行程序或run.py位于同级目录中

configbt.yaml

策略回测的相关配置,包括以下部分

replayer:                           # 数据回放设置
    basefiles:                      # 各个基础配置文件所在目录
        commodity: ../common/commodities.json
        contract: ../common/contracts.json
        holiday: ../common/holidays.json
        hot: ../common/hots.json
        second: ../common/seconds.json
        session: ../common/sessions.json
    fees: ../common/fees.json
    stime: 202101040900             # 回测开始时间
    etime: 202101061500             # 回测结束时间
    mode: csv                       # 数据回放模式,包括csv与bin
                                    # 不管是何种模式,首先回去his目录下查找
                                    # 如果his没有的话,csv模式会去csv模式下查找对应的csv文件,
                                    # 并转换为his目录下的dsb文件。
    path: ../storage/               # 数据存放路径
    tick: true                      # 是否开启tick回测,HFT回测时必须开启
env:
    mocker: cta                     # 回测引擎,cta/hft/sel/uft
    slippage: 1                     # 滑点,仅cta sel引擎的滑点有效

# CTA策略配置,当mocker为cta时会读取该配置项
cta:
    module: WtCtaStraFact.dll       # 模块名,linux下为xxxx.so
    strategy:                       # 策略信息
        id: dt_if                   # 策略ID,自定义的
        name: DualThrust            # 策略名,要和factory中的匹配
        params:                     # 策略初始化参数,这个根据策略的需要提供,不要被示例中所限制
            code: CFFEX.IF.HOT
            count: 50
            days: 30
            k1: 0.6
            k2: 0.6
            period: m5
            stock: false

# HFT策略配置,当mocker为hft时会读取该配置项
hft:
    module: WtHftStraFact.dll       # 模块名,linux下为xxxx.so
    use_newpx: true                # hft与uft中特有的选项,是否仅用最新价撮合,为false则会采用盘口撮合
    agent: true                     # 允许hft想cta一样记录成交信息
    strategy:                       # 策略信息
        id: hft_if                  # 策略ID,自定义的
        name: SimpleHft             # 策略名,要和factory中的匹配
        params:                     # 策略初始化参数,这个根据策略的需要提供
            code: CFFEX.IF.HOT
            second: 5
            freq: 10
            offset: 0
            stock: false

# UFT策略配置,当mocker为uft时会读取该配置项
uft:
    module: WtUftStraFact.dll       # 模块名,linux下为xxxx.so
    use_newpx: true                # hft与uft中特有的选项,是否仅用最新价撮合,为false则会采用盘口撮合
    strategy:                       # 策略信息
        id: uft_if                  # 策略ID,自定义的
        name: SimpleUft             # 策略名,要和factory中的匹配
        params:                     # 策略初始化参数,这个根据策略的需要提供
            code: CFFEX.IF.HOT
            second: 5
            freq: 10
            offset: 0
            lots: 1

config.yaml

实盘相关的配置

replayer:                           # 数据回放设置
    basefiles:                      # 各个基础配置文件所在目录
        commodity: ../common/commodities.json
        contract: ../common/contracts.json
        holiday: ../common/holidays.json
        hot: ../common/hots.json
        second: ../common/seconds.json
        session: ../common/sessions.json
    bspolicy: actpolicy.yaml        # 执行配置文件名
    data:                       
        store: 
            path: ../storage/       # 数据存放目录
            his_path: ./storage/his # 历史数据存放路径,如果历史数据单独存放,可以设置该选项
env:
    fees: \\WIN-52AMQLH0TIA\WonderTrader\common\fees.json
    filters: filters.json
    mode: product                   # 模式
    name: hft
    product:
        session: TRADING            # 交易时段,TRADING能够覆盖国内主要的交易时段
    mocker: cta                     # 回测引擎,cta/hft/sel/uft
    slippage: 1                     # 滑点,仅cta sel引擎的滑点有效

# CTA策略配置,当mocker为cta时会读取该配置项
cta:
    module: WtCtaStraFact.dll       # 模块名,linux下为xxxx.so
    strategy:                       # 策略信息
        id: dt_if                   # 策略ID,自定义的
        name: DualThrust            # 策略名,要和factory中的匹配
        params:                     # 策略初始化参数,这个根据策略的需要提供,不要被示例中所限制
            code: CFFEX.IF.HOT
            count: 50
            days: 30
            k1: 0.6
            k2: 0.6
            period: m5
            stock: false

# HFT策略配置,当mocker为hft时会读取该配置项
hft:
    module: WtHftStraFact.dll       # 模块名,linux下为xxxx.so
    use_newpx: true                # hft与uft中特有的选项,是否仅用最新价撮合,为false则会采用盘口撮合
    strategy:                       # 策略信息
        id: hft_if                  # 策略ID,自定义的
        name: SimpleHft             # 策略名,要和factory中的匹配
        params:                     # 策略初始化参数,这个根据策略的需要提供
            code: CFFEX.IF.HOT
            second: 5
            freq: 10
            offset: 0
            stock: false

# UFT策略配置,当mocker为uft时会读取该配置项
uft:
    module: WtUftStraFact.dll       # 模块名,linux下为xxxx.so
    use_newpx: true                # hft与uft中特有的选项,是否仅用最新价撮合,为false则会采用盘口撮合
    strategy:                       # 策略信息
        id: uft_if                  # 策略ID,自定义的
        name: SimpleUft             # 策略名,要和factory中的匹配
        params:                     # 策略初始化参数,这个根据策略的需要提供
            code: CFFEX.IF.HOT
            second: 5
            freq: 10
            offset: 0
            lots: 1

actpolicy.yaml

WT的一个重要优势,就是净持仓交易,对于期货这种交易流程较为复杂的品种来说尤其方便。策略将生成多或空信号后,交给执行器转换为实际的开平指令,发给交易所。而开平指令的生成就是根据actpolicy.yaml文件中一个个执行策略产生的。

actpolicy配置包含多个执行策略

stockindex:                     # 执行策略名,自定义,但要求同一个actpolicy中不重复
    filters:                    # 适用该执行策略的品种
    - CFFEX.IF
    - CFFEX.IC
    - CFFEX.IH
    order:                      # 订单顺序
                                # 比如股指因为监管的原因,日内手续费很高,所以顺序为:平昨->开仓->平今
    -   action: closeyestoday   # 平昨
        limit: 0                # 当日开仓次数限制,为0表示没有限制,达到限制后跳过该步骤
        pure: True              # 是否检查净值仓,
                                # 主要针对平昨和平今,如果为true,则只有持仓全部为昨仓或今仓,才
                                # 也就是说,如果当天有开新仓的话,则不再平昨,转为下一个执行动作。
    -   action: open            # 开仓
        limit: 500              # 如果当天开仓超过500次,则跳过该动作,转为下一个
    -   action: closetoday      # 平今
        limit: 0
        pure: false             
Tip

如果使用的品种不支持平今平昨,wt内部会自动转为普通的平仓

executers.yaml

执行器,主要用于cta引擎,通过配置执行器,将信号的执行细节从策略中剥离出来,同时可以将同一个策略的信号,分发到多个交易通道(账户)中,实现多账户。

#一个组合可以配置多个执行器,所以executers是一个list
executers:
-   active: false           # 是否启用
    id: exec                # 执行器id,不可重复
    trader: simnow          # 执行器绑定的交易通道id,如果不存在,无法执行
    scale: 1                # 数量放大倍数,即该执行器的目标仓位,是组合理论目标仓位的多少倍,可以为小数 

    policy:                 # 执行单元分配策略,系统根据该策略创建对一个的执行单元
        default:            # 默认策略,根据品种ID设置,如SHFE.rb,如果没有针对品种设置,则使用默认策略
            name: WtExeFact.WtMinImpactExeUnit  #执行单元名称
            offset: 0       # 委托价偏移跳数
            expire: 5       # 订单超时没秒数
            pricemode: 1    # 基础价格模式,-1-己方最优,0-最新价,1-对手价
            span: 500       # 下单时间间隔(tick驱动的)
            byrate: false   # 是否按对手盘挂单量的比例挂单,配合rate使用
            lots: 1         # 固定数量
            rate: 0         # 挂单比例,配合byrate使用

    clear:                  # 过期主力自动清理配置
        active: false       # 是否启用
        excludes:           # 排除列表
        - CFFEX.IF
        - CFFEX.IC
        includes:           # 包含列表
        - SHFE.rb

filters.yaml

当盘中或策略出现突发情况时,有时需要针对某个策略,甚至品种进行人工干预,这就需要暂时过滤掉这个品种或者策略的信号,这一功能是由filters.yaml实现的。

code_filters:               # 品种过滤
    CFFEX.IF0:              # 过滤的品种代码
        action: ignore      # 过滤标志
        target: 0
strategy_filters:
    Q3LS00_if0:
        action: ignore
        target: 0

logcfg.yaml

logcfg.yaml中规定了各类日志的输出格式以及目录,包括以下几类日志

  • executer 执行器日志
  • parser 行情服务日志
  • trader 交易服务日志
  • strategy 策略日志
  • risk 风控日志
  • root 根日志

每个日志配置需包括是否异步、日志等级、槽设置。槽设置包括日志保存路径、格式、是否截断保存、日志类型等

dyn_pattern:
    executer:
        async: false
        level: debug
        sinks:
        -   filename: Logs/Executer/%s.log
            pattern: '[%Y.%m.%d %H:%M:%S - %-5l] %v'
            truncate: true
            type: daily_file_sink
    parser:
        async: false
        level: debug
        sinks:
        -   filename: Logs/Parser/%s.log
            pattern: '[%Y.%m.%d %H:%M:%S - %-5l] %v'
            truncate: true
            type: daily_file_sink
    strategy:
        async: false
        level: debug
        sinks:
        -   filename: Logs/Strategy/%s.log
            pattern: '[%Y.%m.%d %H:%M:%S - %-5l] %v'
            truncate: true
            type: daily_file_sink
    trader:
        async: false
        level: debug
        sinks:
        -   filename: Logs/Trader/%s.log
            pattern: '[%Y.%m.%d %H:%M:%S - %-5l] %v'
            truncate: true
            type: daily_file_sink
risk:
    async: false
    level: debug
    sinks:
    -   filename: Logs/Riskmon/Riskmon.log
        pattern: '[%Y.%m.%d %H:%M:%S - %-5l] %v'
        truncate: true
        type: daily_file_sink
root:
    async: false
    level: debug
    sinks:
    -   filename: Logs/Runner.log
        pattern: '[%Y.%m.%d %H:%M:%S - %-5l] %v'
        truncate: true
        type: daily_file_sink
    -   pattern: '[%m.%d %H:%M:%S - %-5l] %v'
        type: ostream_sink

logcfgbt.yaml

与logcfg.yaml同样是配置日志文件,区别在于logcfgbt.yaml用于回测日志的输出

dyn_pattern:
    strategy:
        async: false
        level: debug
        sinks:
        -   filename: BtLogs/Strategy_%s.log
            pattern: '[%Y.%m.%d %H:%M:%S - %-5l] %v'
            truncate: false
            type: basic_file_sink
root:
    async: false
    level: debug
    sinks:
    -   filename: BtLogs/Runner.log
        pattern: '[%Y.%m.%d %H:%M:%S - %-5l] %v'
        truncate: true
        type: basic_file_sink
    -   pattern: '[%m.%d %H:%M:%S - %^%-5l%$] %v'
        type: console_sink

tdparsers.yaml

tdparsers.yaml用于配置行情服务,通常可以向自己所用的券商申请,或者通过simnow注册获取

parsers:
-   active: true
    bport: 9001
    filter: ''
    host: 127.0.0.1
    id: parser1
    module: ParserUDP
    sport: 3997

tdtraders.yaml

tdtraders.yaml用于配置交易服务,与tdparsers一样,通过券商或者simnow获取

traders:
-   active: true
    front: mocker://localhost
    id: mocker
    maxqty: 100
    minqty: 1
    mockerid: 9999
    module: TraderMocker
    newpx: true                 # 是否采用最新价撮合
    savedata: true              # 是否落地交易数据,即会在generated中落地成交情况等信息,有开销,自行决定是否开启
    span: 100
    udp_port: 9001
    user: mocker9999