典型策略场景
阅读 29527
更新 2022-12-20 13:19:26
定时事件驱动
- 初始化策略时设定策略的执行时间
- 到达设定时间时,自动执行策略
- 可以指定多个定时任务,通过任务名进行区分
function [Context] = main(Context,Event)
% 初始化
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
end
订阅数据驱动
function [Context] = main(Context,Event)
% 初始化
if Event.Init.flag==1
set_symbols({'SZSE.000001','SHSE.600000'});
subscribe({}, '900s',60);
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
成交回报事件驱动
- 委托执行后,当委托状态发生变化,如,部分成交或者委托被拒绝时,会触发委托事件
function [Context] = main(Context,Event)
%% 编写策略
% 初始化操作
if Event.Init.flag==1%第一次启动仅执行初始化部分
% 设置股票池和订阅的数据,如果订阅数据不指定,默认订阅股票池的所有数据
set_symbols({'SZSE.000001','SZSE.000009'});
subscribe({}, '900s',10);
%设置启用的事件,启用委托状态变更事件
set_event({'OrderStatus'})
return
end
% 定时任务处理逻辑
if Event.Bar.frequency_900s.flag==1
[order]=order_volume('SZSE.000001', 100, OrderSide.OrderSide_Buy, OrderType.OrderType_Market,PositionEffect.PositionEffect_Open,0); %标的,委托量,买入,市价,开仓,价格
end
% 委托状态变化事件
if Event.OrderStatus.flag ==1
disp(Event.OrderStatus.data)
end
end
指定账户交易
- 在多账户场景下交易,用指定账户的ID来进行不同账户的下单
- 如果策略是单账户则不需要指定账户ID
function [Context] = main(Context,Event)
% 初始化
if Event.Init.flag==1
schedule('algo01', '1d', '09:30:00');
return
end
%% 定时任务处理逻辑
if Event.algo01.flag==1
%标的,资金,买入,市价,开仓,价格,仅在实盘可以指定账户
[order]=order_volume({'SHSE.600000'}, 100, OrderSide.OrderSide_Buy, OrderType.OrderType_Market,PositionEffect.PositionEffect_Open,0,'account1');
end
end
end
获取资金持仓信息交易策略
- 获取资金和持仓信息
- 在定时任务中使用资金和持仓信息决策,并进行交易
function [Context] = main(Context,Event)
%% 编写策略
% 开盘如果没有持仓,则买入0.8倍可用资金的平安银行股票
% 收盘检查可用持仓,如果有可用仓,则全部卖出
% 初始化操作
if Event.Init.flag==1
schedule('algo01', '1d', '09:30:00');
schedule('algo02', '1d', '14:55:00');
Context.userdata.symbol = 'SZSE.000001'; %userdata,设定用户自定义的全局变量
return
end
%% 定时任务处理逻辑
symbol = Context.userdata.symbol;
[position] = get_position(); %position字段和info说明一一对应
ind = strcmp(position(:,3),symbol);
if Event.algo01.flag==1
% 查询资金,买入当前资金的0.1的平安银行股票
[cash]= get_cash(); %cash字段和info说明一一对应
if sum(ind)==0 %没有仓位则开仓
[order]=order_value(symbol, 0.1*cash{2,9}, 1, 2,1,0); %标的,资金,买入,市价,开仓,价格
end
end
if Event.algo02.flag==1
% 查询持仓,持有平安银行,且为亏损的则清仓
if sum(ind)>0&&position{ind,15}==0
[order]=order_volume(symbol, position{ind,14}, 2, 2,2,0); %标的,数量,卖出,市价,平仓,价格
end
end
end
设定策略运行参数
- 策略运行必要参数:登录身份信息(token),策略身份信息(strategy_id)为必填信息,可由终端自动生成
- 回测参数用于控制回测方式运行的起止时间、复权方式、资金、交易信息、缓存等,有默认值
- 服务器地址默认本机地址,需要分机器部署时才需要指定填写
%% 设置策略运行参数
strategy_set.strategy_id = '';
strategy_set.token = '';
strategy_set.mode = 'MODE_BACKTEST'; % MODE_LIVE(实时)=1,MODE_BACKTEST(回测) =2
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
仅提取数据
- 设置token信息,用于登录身份认证
- 使用提数接口提取数据
set_token('xxxxx')
% 获取财务数据(表名,标的名,开始时间,结束时间,表字段)
get_fundamentals('trading_derivative_indicator',{ 'SHSE.600000','SZSE.000001'}, '2018-04-01', '2018-08-01', {'TCLOSE','NEGOTIABLEMV','TOTMKTCAP','TURNRATE'})