订单流策略模型,不需要调用K线图表的数据,仅以读取盘口五档委托数据、已成交数据和期货账户的委托状态、资金头寸信息,自动完成分批、挂单、撤单等一系列交易步骤。
订单流策略的结构:根据订单流数据计算条件 -> 发出委托处理。
一、模型的机制
模型根据从上至下,从左至右的顺序计算;同时满足条件时,以先计算出来的条件优先;
模型计算频率:受盘口的行情数据与委托回报驱动,来一笔TICK或者收到一笔回报就计算一次,没有行情时每5秒驱动一次。
二、委托函数
通过下单委托函数A_SendOrder直接发委托:
A_SendOrder(BuyOrSell,EntryOrExit,Lot,Price,"AccountID") 针对当前公式应用的交易账户,对合约发送委托单。
注:委托函数直接发单,不经过任何确认,并会在每次计算公式时发送,一般需配合仓位头寸进行条件处理;
三、回测机制
订单流策略支持在Tick图表上动态回测;
软件提供仿真撮合机制,采用交易所的行情数据作为撮合基础,虚拟真实的交易过程;
仿真撮合机制:
成交条件:买委托价>最新价 或 卖委托价<最新价,全部成交;
委托价=最新价=买一价 或 委托价=最新价=卖一价,部分成交;
成交价格:最新价;
注:部分成交手数=委托手数*成交比例(买成交比例=现手/买一量,卖成交比例=现手/卖一量,成交手数向上取整);
四、编写示例
订单流策略的编写重在各类数据的获取,列举几种常见的数据获取需求写法示例:
1、Def_TickData定义数据区
用盘口数据编写订单流策略,首先要把用多少数据定义出来,否则只能使用当笔数据计算,当需要获取历史数据时就要定义Tick数据区。
编写示例1:定义数据区为最近5秒钟的tick数据,并取第一笔tick的卖一价
Vars Var_TickData data0;//定义数据区变量 Begin data0=Def_TickData("rb2501",0,5,1); //data0中装有5秒钟rb2501的tick数据 IF(data0.State == 1)//判断数据区是否达到设置的Tick容量 { data0[0].Ask1; // 取第一笔tick数据的卖一价。 } End
编写示例2:定义数据区为最近5笔tick数据,并取第一笔tick的卖一价
Vars Var_TickData data0;//定义数据区变量 Begin data0=Def_TickData("rb2501",1,5,1); //data0中装有5笔rb2501的tick数据 IF(data0.State == 1)//判断数据区是否达到设置的Tick容量 { data0[0].Ask1; // 取第一笔tick数据的卖一价。 } End
注:
① 定义数据区前必须先用Var_TickData定义数据区变量,再用Def_TickData定义tick数据区,并搭配State函数判断当前数据区是否已经满足设置的tick容量;
② Def_TickData(Code,Type,Num,SetBigVol);第二个参数用于设置数据容量的形式:
Type为0时,表示定义Num秒数据(最大60秒);
Type为1时,表示定义Num笔数据(最大200笔);
③ Def_TickData定义数据区后,data0[0].为取第一笔数据,data0[Num-1].为取最后一笔数据。
2、Price函数获取盘口数据
在订单流模型中,可通过data0.Price("Data")写法取指定合约的盘口数据,可调用的数据包括:
基础数据如:开盘价、最高价、最低价、最新价、成交量、持仓量...
盘口数据如:买1价~买5价、买1量~买5量、总买/总卖价、总买/总卖量...
抬头数据如:沉淀资金、资金流向、60秒速涨、投机度、趋势度...
期权相关数据如:隐含波动率、历史波动率、溢价率、杠杆比率、内在价值...
编写示例:
Data data0:"rb2501";//定义合约1 data1:"rb2502";//定义合约2 Begin If (data0.Price("New")>data1.Price("New")) { Commentary("rb2501:" + Text(data0.Price("New")));//输出合约1的最新价 Commentary("rb2502:" + Text(data1.Price("New")));//输出合约2的最新价 } End
注:
① 订单流策略,使用该函数时必须在Data区定义合约;
② 若Data区只定义了一个合约,可以不使用data0.的形式来调用,默认定义的唯一合约。若Data区定义了多个合约,则必须使用data0. 的形式来调用。
3、获取期权相关数据
订单流策略支持期权组合策略的编写,提供一系列函数获取期权数据,构建模型。
使用GetOptionChain函数获取标的期权列表
期权组合策略一般通过标的行情判断交易机会,不同策略需要筛选不同标的下的不同月份、不同虚实度、不同风参的合约进行组合。如果事先将所有期权合约都写入代码在计算时进行申请,会耗费大量资源造成卡顿,合约有调整还需要经常手动修改模型。
软件提供GetOptionChain函数获取标的对应的期权合约列表,在订单流模型中根据某个条件交易标的合约下的某个期权合约,大大简化模型代码。
使用ApplyDynamicQuote函数获取期权动态行情
通过ApplyDynamicQuote函数检测指定的合约在对应的模型中是否已经申请过动态行情,未申请过则申请,已经申请则不再处理,当出现断线重连等情况,会再次申请行情。
可用ApplyDynamicQuote + QuotState判断合约是否收到动态行情,不过期权合约往往不活跃,有时不必等所有合约都取到行情,需根据策略思路灵活调整语句;
使用Price函数获取期权抬头数据
Price("Data")支持获取期权相关数据,Data位置支持的期权参数如下:
PremiumRate溢价率、ActualLeverage真实杠杆率、Leverage杠杆比率、StrikePrice行权价、CallPut涨/跌、Stdderiation隐含波动率、InternalValue内在价值、TimeValue时间价值、HistoricalVolatility历史波动率、TheoryPrice理论价格、Rho Rho值、Theta Theta值、Vega Vega值、Gamma Gamma值、Delta Delta值、ExpirationDate到期日、ExeMode期权执行类型。
*以上函数使用详情请参考函数说明进行了解。
编写示例:获取期货标的对应的期权合约及其隐含波动率值
Vars String COD; //标的合约 StringArray OCD; //看涨期权 StringArray OPD; //看跌期权 Numeric X; //循环变量 Numeric IVC; //看涨期权隐含波动率 Numeric IVP; //看跌期权隐含波动率 Numeric SIZE; //期权数量 Begin COD = "m2501"; //合约编码 GetOptionChain(COD,0,OCD); //获取m2501对应的看涨期权 GetOptionChain(COD,1,OPD); //获取m2501对应的看跌期权 SIZE = GetStringArraySize(OCD); Commentary("SIZE = " + Text(SIZE) ); For X=0 To SIZE-1 { ApplyDynamicQuote(OCD[X]); //申请动态行情 ApplyDynamicQuote(OPD[X]); //申请动态行情 If(OCD[X].QuotState()==1&&OPD[X].QuotState()==1) { IVC = OCD[X].Price("Stdderiation"); //看涨期权隐含波动率 IVP = OPD[X].Price("Stdderiation"); //看跌期权隐含波动率 Commentary("看涨期权:"+OCD[X]+",隐含波动率="+Text(IVC)); Commentary("看跌期权:"+OPD[X]+",隐含波动率="+Text(IVP)); } } End