策略编写m文件-main.m
- main函数为用户编写策略的主函数,策略逻辑需要按照事类型件分块编写,在main中可以获取数据和进行交易
- 当有效事件发生时,main行数将会被自动调用,通过if判断事件类型标识,执行指定类型事件的处理逻辑
- 首次调用为init初始化事件,作用是设定策略运行方式,包括订阅的数据范围,需要的监听的事件类型
[Context] = main(Context,Event)
if Event.Init.flag==1
subscribe()
end
end
参数 | 类型 | 说明 |
---|---|---|
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;
return
end
%% 定时任务处理逻辑
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)>0
if sum(ind)==0 %没有仓位则开仓
[order]=order_value(Context.symbols{i}, 0.15*cash{2,4}, OrderSide.OrderSide_Buy, OrderType.OrderType_Market,PositionEffect.PositionEffect_Open,0); %标的,资金,买入,市价,开仓,价格,市价场景下价格字段不生效
end
else
if sum(ind)~=0 %没有仓位则开仓
[order]=order_volume(Context.symbols{i}, position{ind,14}, OrderSide.OrderSide_Sell, OrderType.OrderType_Market,PositionEffect.PositionEffect_Close,0); %标的,资金,买入,市价,开仓,价格
end
end
end
end
策略运行文件—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用于启动运行策略,设置好策略运行的模式,并将策略初始化函数中订阅的数据和定时的任务设定到策略驱动中