main函数内主要由事件驱动、全局变量、数据接口和交易接口组成的策略编基本接口,用户根据这些基本接口来组织策略的结构
全局变量
全局变量存放了系统变量,包括订阅数据滑窗、策略运行时间、标的、事件等
也用于存放用户自定义的全局变量
函数原型:
% 全局变量直接赋值即可
symbols = Context.symbols;
nowtime = Context.now;
data_15close = Context.data.frequency_900s.close;
说明:
变量名 | 类型 | 描述 |
---|---|---|
symbols | cell | 滑窗数据的标的列表,通过set_symbols进行设定,必须在订阅数据前设定,否则可能导致数据滑窗数据缺失 |
now | cell | 字符格式的当前时间点 |
data | struct | 订阅数据滑窗,按照频率、字段、数据矩阵结构存储,如Context.data.frequency_900s.close, 行索引为symbols,列索引eob |
event | struct | 存放系统使用事件的标识和参数 |
userdata | struct | 用户保存的全局变量,可在后续周期中调用 |
初始化事件
初始化事件是策略逻辑启动前,初始化策略运行条件
策略的运行方式采用事件触发的方式,当检测到事件发生时则启动对应的事件逻辑,初始化一般用于设定策略需要的驱动方式,如定时驱动,订阅滑窗数据驱动,成交回报驱动等
原型
if Event.Init.flag==1
% 编写初始化内容
end
参数说明
变量名 | 类型 | 描述 |
---|---|---|
Event.Init.flag | mat | 初始化事件的标识,当初始化调用main时,Event.Init.flag==1 |
注意
Init事件是启动策略必须执行事件,一般执行一次,在其条件内进行数据订阅、定时任务的启动
设置滑窗标的序列
set_symbols(symbols);
说明:symbols集合用于生成统一的滑窗数据,保证滑窗数据矩阵行索引和symbols对齐,便于数据的矩阵运算
设置驱动事件
原型
set_event( event_name ,bool);
说明:具体事件名称查看后续事件说明内容
定时运行函数和定时事件
定时功能的使用由两部分组成
- 定时任务设置函数
- 定时任务接收函数
% 定时任务设置函数
schedule(schedule_func, date_rule, time_rule);
% 定时任务接收函数
if Event.schedule_func.flag==1
% 定时任务处理逻辑
end
参数说明
变量名 | 类型 | 描述 |
---|---|---|
schedule_func | char | 策略定时执行的事件名称 |
date_rule | char | 定时日期,格式为’n’+’d/w/m’,目前仅支持数字1,字母分别代表日,周,月 |
time_rule | char | 定时事件,格式为’hh:mm:ss’ |
示例
% 每个交易日定时启动两个不同的定时任务,在任务中查看任务启动的时间点
if Event.Init.flag==1
schedule('algo01', '1d', '09:30:00');
schedule('algo02', '1d', '14:55:00');
return
end
%% 定时任务处理逻辑
if Event.algo01.flag==1
disp (Context.now);
end
if Event.algo02.flag==1
disp (Context.now);
end
注意
在使用定时函数schedule定时成功后,会在Event事件集中自动生成定时函数中的同名标识;
定时任务可以启动多个
订阅数据滑窗和数据事件
数据事件驱动的使用由两部分组成
- 订阅数据函数
- 数据事件接收函数
订阅行情数据
函数原型:
% 设置数据滑窗的标的列表
set_symbols(symbols)
% 订阅函数
subscribe(symbols, frequency, count,is_event)
% 接收函数
if Event.Bar.flag==1%
end
参数说明
变量名 | 类型 | 描述 |
---|---|---|
symbols | cell | 策略定时执行的事件名称 |
frequency | mat | 订阅数据的频率,支持支持 ‘tick’, ‘1d’, ‘Ns’ |
count | mat | 订阅的滑窗数据的长度 |
is_event | mat | 是否作为事件方式进行驱动,1表示数据到达时驱动,0表示不驱动(暂只针对tick数据订阅生效) |
示例
function [Context] = main(Context,Event)
% 初始化
if Event.Init.flag==1
set_symbols({'SZSE.000001','SHSE.600000'});
subscribe({}, '900s',60,1,{});
return
end
if Event.Bar.frequency_900s.flag==1
disp(Context.data.frequency_900s.eob); %打印滑窗数据
disp(Context.data.frequency_900s.symbols);
disp(Context.data.frequency_900s.close);
end
说明
滑窗标的列表设置的作用是规定滑窗数据的以相同的标的行进行数据对齐
订阅函数subscribe中,symbols不填默认使用滑窗标的列表的全部标的进行订阅
行情字段参数暂时不生效
数据滑窗时间判断表示为Event.Bar.flag,支持独立的频率时间驱动,使用Event.Bar.frequency_900s.flag
交易事件驱动
交易事件的使用由三部分组成
- 使用set_event启动交易事件类型
- 接收交易事件驱动
- 获取交易事件信息
交易事件类型
交易事件 | 说明 |
---|---|
OrderStatus | 委托状态更新事件,响应委托状态更新事情,下单后及委托状态更新时被触发。 |
ExecutionReport | 委托执行回报事件,响应委托被执行事件,委托成交后被触发。 |
AccountStatus | 交易账户状态更新事件 |
函数原型
%设置启用的事件,启用委托状态变更事件
set_event({'OrderStatus'})
% 委托状态变化事件
if Event.OrderStatus.flag ==1
disp(Event.OrderStatus.data); %打印事件内容
end
说明:
事件数据格式参照交易对象说明
在回测模式下,交易事件和下单执行函数是同步生效的,即下单后会立刻获取交易事件
其他事件驱动
其他需要策略处理的事件使用方式
- 使用set_event启动事件类型
- 接收事件驱动
- 获取事件内容
其他事件类型
事件名称 | 说明 |
---|---|
BacktestFinished | 回测结束事件 |
Error | 错误事件 |
MarketDataConnected | 实时行情网络连接成功事件 |
MarketDataDisconnected | 实时行情网络连接断开事件 |
TradeDataConnected | 交易通道网络连接成功事件 |
TradeDataDisconnected | 交易通道网络连接断开事件 |
函数原型
% 开启回报事件
set_event({'BacktestFinished','Error','MarketDataConnected','TradeDataConnected',...
'MarketDataDisconnected','TradeDataDisconnected'})
% 回测结束事件
if Event.BacktestFinished.flag ==1
% 回测结束事件
data = Event.BacktestFinished.data
end
% 错误事件
if Event.Error.flag ==1
end
% 行情连接事件
if Event.MarketDataConnected.flag ==1
end
存储自定义全局变量
策略中用于下次决策使用或多周期使用的数据可以保存在自定义全局变量中
函数原型
% 本次保存
Context.userdata = user_data;
% 下次使用
user_data = Context.userdata;
说明
Context.userdata 可以用作结构体存储多个变量
策略停止函数—stop_strategy
用于停止策略,可用在仿真的断点调试,连续回测是无法停止策略,需要关闭matlab程序
函数原型
stop_strategy()