策略编写m文件-main.m
- main函数为用户编写策略的主函数,策略逻辑需要按照事类型件分块编写,在main中可以获取数据和进行交易
- 当有效事件发生时,main行数将会被自动调用,通过if判断事件类型标识,执行指定类型事件的处理逻辑
- 首次调用为init初始化事件,作用是设定策略运行方式,包括订阅的数据范围,需要的监听的事件类型
[Context] = main(Context,Event)if Event.Init.flag==1subscribe()endend
| 参数 | 类型 | 说明 |
|---|---|---|
| Event | struct | 存放事件内容,一个事件分为flag标志位和事件数据data,flag为1时表示该事件发生 |
| Context | struct | 全局变量,存放策略级的系统数据,也可以存放用户自定义的数据 |
示例
function [Context] = main(Context,Event)%% 均线突破策略% 设定交易股票池,分别针对个股做以下决策% 60分钟均线突破15分钟均线作为指标% 如果向上突破,且无持仓,则按一定资金比例买入% 如果向下突破,且有持仓,则卖出所有持仓if Event.Init.flag==1 % 初始化操作insurance = get_industry('J68');set_symbols(insurance); %提取保险行业成分股,设定股票池subscribe(insurance, '60s',60);subscribe(insurance, '900s',60);Context.userdata.len_60s = 30; %userdata,设定用户自定义的全局变量Context.userdata.len_15m = 20;returnend%% 定时任务处理逻辑len_1d=Context.userdata.len_60s;len_15m=Context.userdata.len_15m;cp_60s = Context.data.frequency_60s.close(:,end-len_1d:end);cp_15m = Context.data.frequency_900s.close(:,end-len_15m:end);if Event.Bar.frequency_900s.flag==1% 计算突破因子fact = mean(cp_60s,2)-mean(cp_15m,2);% 判断持仓,如果突破因子为正且持仓为空,则下单买入,否则清仓[cash]= get_cash(); %cash字段和info说明一一对应[position] = get_position();for i =1:length(Context.symbols)ind = strcmp(position(:,3),Context.symbols{i});ind = find(ind==1);if fact(i)>0if sum(ind)==0 %没有仓位则开仓[order]=order_value(Context.symbols{i}, 0.15*cash{2,4}, OrderSide.OrderSide_Buy, OrderType.OrderType_Market,PositionEffect.PositionEffect_Open,0); %标的,资金,买入,市价,开仓,价格,市价场景下价格字段不生效endelseif sum(ind)~=0 %没有仓位则开仓[order]=order_volume(Context.symbols{i}, position{ind,14}, OrderSide.OrderSide_Sell, OrderType.OrderType_Market,PositionEffect.PositionEffect_Close,0); %标的,资金,买入,市价,开仓,价格endendendend
策略运行文件—run.m
run函数用于运行策略,通过参数控制策略的运行模式、回测参数、身份信息等
参数说明:
| 参数名 | 是否必填 | 描述 |
|---|---|---|
| strategy_set.strategy_id | 必填 | 策略ID用于终端识别策略身份 |
| strategy_set.mode | 非必填 | 策略运行的时间模式,MODE_LIVE(实时),MODE_BACKTEST(回测) |
| strategy_set.token | 必填 | 账户身份信息 |
| strategy_set.backtest_start_time | 非必填 | 回测模式开始时间 |
| strategy_set.backtest_end_time | 非必填 | 回测模式结束时间 |
| strategy_set.backtest_initial_cash | 非必填 | 回测模式的初始资金 |
| strategy_set.backtest_transaction_ratio | 非必填 | 回测模式的成交比例,默认为1 |
| strategy_set.backtest_commission_ratio | 非必填 | 回测模式的手续费,默认为0.001 |
| strategy_set.backtest_slippage_ratio | 非必填 | 回测模式的滑点比率,默认为0 |
| strategy_set.backtest_adjust | 非必填 | 回测数据的复权方式,ADJUST_NONE(不复权)=0,ADJUST_PREV(前复权)=1,ADJUST_POST(后复权)=2 |
| strategy_set.backtest_check_cache | 非必填 | 回测模式使用缓存数据 默认使用缓存,1 - 使用, 0 - 不使用 |
| strategy_set.serv_addr | 非必填 | 默认为本地终端服务地址,可不填 |
函数原型:
%% 设置策略运行参数strategy_set.strategy_id = 'xxxxxxx';strategy_set.token = 'xxxxxx';strategy_set.mode = 'MODE_BACKTEST'; % MODE_LIVE(实时),MODE_BACKTEST(回测)strategy_set.backtest_start_time = '2018-08-01 10:40:00';strategy_set.backtest_end_time = '2018-08-10 10:50:00'; % 默认最近一个月strategy_set.backtest_initial_cash = 1000000; % 默认资金一百万% strategy_set.backtest_transaction_ratio = 0; % 默认成交比例1% strategy_set.backtest_commission_ratio = 0.001; % 默认手续费千一1% strategy_set.backtest_slippage_ratio = 0; % 默认滑点比率% strategy_set.backtest_adjust = ADJUST_NONE; % 默认复权方式不复权,ADJUST_NONE(不复权)=0,ADJUST_PREV(前复权)=1,ADJUST_POST(后复权)=2% strategy_set.backtest_check_cache = 1; % 默认使用缓存,1 - 使用, 0 - 不使用% strategy_set.serv_addr = ''; % 服务器地址可不填%% 运行策略run_strategy(strategy_set)global context % 显示全局变量内的信息
说明: run_strateg用于启动运行策略,设置好策略运行的模式,并将策略初始化函数中订阅的数据和定时的任务设定到策略驱动中