PDF下载 下载

策略编写m文件-main.m

  • main函数为用户编写策略的主函数,策略逻辑需要按照事类型件分块编写,在main中可以获取数据和进行交易
  • 当有效事件发生时,main行数将会被自动调用,通过if判断事件类型标识,执行指定类型事件的处理逻辑
  • 首次调用为init初始化事件,作用是设定策略运行方式,包括订阅的数据范围,需要的监听的事件类型
  1. [Context] = main(Context,Event)
  2. if Event.Init.flag==1
  3. subscribe()
  4. end
  5. end
参数 类型 说明
Event struct 存放事件内容,一个事件分为flag标志位和事件数据data,flag为1时表示该事件发生
Context struct 全局变量,存放策略级的系统数据,也可以存放用户自定义的数据

示例

  1. function [Context] = main(Context,Event)
  2. %% 均线突破策略
  3. % 设定交易股票池,分别针对个股做以下决策
  4. % 60分钟均线突破15分钟均线作为指标
  5. % 如果向上突破,且无持仓,则按一定资金比例买入
  6. % 如果向下突破,且有持仓,则卖出所有持仓
  7. if Event.Init.flag==1 % 初始化操作
  8. insurance = get_industry('J68');
  9. set_symbols(insurance); %提取保险行业成分股,设定股票池
  10. subscribe(insurance, '60s',60);
  11. subscribe(insurance, '900s',60);
  12. Context.userdata.len_60s = 30; %userdata,设定用户自定义的全局变量
  13. Context.userdata.len_15m = 20;
  14. return
  15. end
  16. %% 定时任务处理逻辑
  17. len_1d=Context.userdata.len_60s;
  18. len_15m=Context.userdata.len_15m;
  19. cp_60s = Context.data.frequency_60s.close(:,end-len_1d:end);
  20. cp_15m = Context.data.frequency_900s.close(:,end-len_15m:end);
  21. if Event.Bar.frequency_900s.flag==1
  22. % 计算突破因子
  23. fact = mean(cp_60s,2)-mean(cp_15m,2);
  24. % 判断持仓,如果突破因子为正且持仓为空,则下单买入,否则清仓
  25. [cash]= get_cash(); %cash字段和info说明一一对应
  26. [position] = get_position();
  27. for i =1:length(Context.symbols)
  28. ind = strcmp(position(:,3),Context.symbols{i});
  29. ind = find(ind==1);
  30. if fact(i)>0
  31. if sum(ind)==0 %没有仓位则开仓
  32. [order]=order_value(Context.symbols{i}, 0.15*cash{2,4}, OrderSide.OrderSide_Buy, OrderType.OrderType_Market,PositionEffect.PositionEffect_Open,0); %标的,资金,买入,市价,开仓,价格,市价场景下价格字段不生效
  33. end
  34. else
  35. if sum(ind)~=0 %没有仓位则开仓
  36. [order]=order_volume(Context.symbols{i}, position{ind,14}, OrderSide.OrderSide_Sell, OrderType.OrderType_Market,PositionEffect.PositionEffect_Close,0); %标的,资金,买入,市价,开仓,价格
  37. end
  38. end
  39. end
  40. 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 非必填 默认为本地终端服务地址,可不填

函数原型:

  1. %% 设置策略运行参数
  2. strategy_set.strategy_id = 'xxxxxxx';
  3. strategy_set.token = 'xxxxxx';
  4. strategy_set.mode = 'MODE_BACKTEST'; % MODE_LIVE(实时),MODE_BACKTEST(回测)
  5. strategy_set.backtest_start_time = '2018-08-01 10:40:00';
  6. strategy_set.backtest_end_time = '2018-08-10 10:50:00'; % 默认最近一个月
  7. strategy_set.backtest_initial_cash = 1000000; % 默认资金一百万
  8. % strategy_set.backtest_transaction_ratio = 0; % 默认成交比例1
  9. % strategy_set.backtest_commission_ratio = 0.001; % 默认手续费千一1
  10. % strategy_set.backtest_slippage_ratio = 0; % 默认滑点比率
  11. % strategy_set.backtest_adjust = ADJUST_NONE; % 默认复权方式不复权,ADJUST_NONE(不复权)=0ADJUST_PREV(前复权)=1ADJUST_POST(后复权)=2
  12. % strategy_set.backtest_check_cache = 1; % 默认使用缓存,1 - 使用, 0 - 不使用
  13. % strategy_set.serv_addr = ''; % 服务器地址可不填
  14. %% 运行策略
  15. run_strategy(strategy_set)
  16. global context % 显示全局变量内的信息

说明: run_strateg用于启动运行策略,设置好策略运行的模式,并将策略初始化函数中订阅的数据和定时的任务设定到策略驱动中

0 篇笔记