龙听期货论坛's Archiver

龙听 发表于 2017-11-1 16:26

使用Matlab进行国内期货交易 作者:伍侃 part2

[code]下单接口比较复杂,我们这在登录后立即发送一单

状态为已确认后,开始可以下单。



第一个参数是合约名,区分大小写,如果不清楚合约名可以查看快期软件中的“合约列表”。

第二个参数是买卖标记,只有两种选择,买/卖。

第三个参数是组合开平标记,第四个参数是组合投机套保标记。

组合开平标记和组合投机套保标记的写法有些特别,CTP支持组合单,组合单至少由两腿组成,如何区分每腿的开平与投保呢?那就是用的组合开平与组合投保了,第一个字符就标记的第一腿,第二个字符标示的第二腿,以此类推。



/////////////////////////////////////////////////////////////////////////
///TFtdcOffsetFlagType是一个开平标志类型
/////////////////////////////////////////////////////////////////////////
///开仓
#define THOST_FTDC_OF_Open '0'
///平仓
#define THOST_FTDC_OF_Close '1'
///强平
#define THOST_FTDC_OF_ForceClose '2'
///平今
#define THOST_FTDC_OF_CloseToday '3'
///平昨
#define THOST_FTDC_OF_CloseYesterday '4'
///强减
#define THOST_FTDC_OF_ForceOff '5'
///本地强平
#define THOST_FTDC_OF_LocalForceClose '6'

typedef char TThostFtdcOffsetFlagType;


/////////////////////////////////////////////////////////////////////////
///TFtdcHedgeFlagType是一个投机套保标志类型
/////////////////////////////////////////////////////////////////////////
///投机
#define THOST_FTDC_HF_Speculation '1'
///套利
#define THOST_FTDC_HF_Arbitrage '2'
///套保
#define THOST_FTDC_HF_Hedge '3'

typedef char TThostFtdcHedgeFlagType;


目前普通客户开通的账户只能下投机,所以第四个参数直接使用"11"最省事。

而第三个参数使用起来比较麻烦,因为上交所专门区分了平今与平昨,使用错了会提示平仓数不足。

第六个参数是价格,价格必需是最小价格变动单位的整数倍,不能超过涨跌停价

第七个参数是价格类型,接口预留了大量的类型,但交易所只部分支持,目前仅使用两种价格类型即可,限价与市价,上海不支持市价单,中金股指两个远月不支持市价。



/////////////////////////////////////////////////////////////////////////
///TFtdcOrderPriceTypeType是一个报单价格条件类型
/////////////////////////////////////////////////////////////////////////
///任意价
#define THOST_FTDC_OPT_AnyPrice '1'
///限价
#define THOST_FTDC_OPT_LimitPrice '2'
///最优价
#define THOST_FTDC_OPT_BestPrice '3'
///最新价
#define THOST_FTDC_OPT_LastPrice '4'
///最新价浮动上浮1个ticks
#define THOST_FTDC_OPT_LastPricePlusOneTicks '5'
///最新价浮动上浮2个ticks
#define THOST_FTDC_OPT_LastPricePlusTwoTicks '6'
///最新价浮动上浮3个ticks
#define THOST_FTDC_OPT_LastPricePlusThreeTicks '7'
///卖一价
#define THOST_FTDC_OPT_AskPrice1 '8'
///卖一价浮动上浮1个ticks
#define THOST_FTDC_OPT_AskPrice1PlusOneTicks '9'
///卖一价浮动上浮2个ticks
#define THOST_FTDC_OPT_AskPrice1PlusTwoTicks 'A'
///卖一价浮动上浮3个ticks
#define THOST_FTDC_OPT_AskPrice1PlusThreeTicks 'B'
///买一价
#define THOST_FTDC_OPT_BidPrice1 'C'
///买一价浮动上浮1个ticks
#define THOST_FTDC_OPT_BidPrice1PlusOneTicks 'D'
///买一价浮动上浮2个ticks
#define THOST_FTDC_OPT_BidPrice1PlusTwoTicks 'E'
///买一价浮动上浮3个ticks
#define THOST_FTDC_OPT_BidPrice1PlusThreeTicks 'F'

typedef char TThostFtdcOrderPriceTypeType;


第八个参数是时间类型,根据国内交易所的情况,目前支持GFD,IOC

第九、十参数是条件单使用,首先大商所支持止盈止损单,郑商所支持止损单。

/////////////////////////////////////////////////////////////////////////
///TFtdcContingentConditionType是一个触发条件类型
/////////////////////////////////////////////////////////////////////////
///立即
#define THOST_FTDC_CC_Immediately '1'
///止损
#define THOST_FTDC_CC_Touch '2'
///止赢
#define THOST_FTDC_CC_TouchProfit '3'
///预埋单
#define THOST_FTDC_CC_ParkedOrder '4'
///最新价大于条件价
#define THOST_FTDC_CC_LastPriceGreaterThanStopPrice '5'
///最新价大于等于条件价
#define THOST_FTDC_CC_LastPriceGreaterEqualStopPrice '6'
///最新价小于条件价
#define THOST_FTDC_CC_LastPriceLesserThanStopPrice '7'
///最新价小于等于条件价
#define THOST_FTDC_CC_LastPriceLesserEqualStopPrice '8'
///卖一价大于条件价
#define THOST_FTDC_CC_AskPriceGreaterThanStopPrice '9'
///卖一价大于等于条件价
#define THOST_FTDC_CC_AskPriceGreaterEqualStopPrice 'A'
///卖一价小于条件价
#define THOST_FTDC_CC_AskPriceLesserThanStopPrice 'B'
///卖一价小于等于条件价
#define THOST_FTDC_CC_AskPriceLesserEqualStopPrice 'C'
///买一价大于条件价
#define THOST_FTDC_CC_BidPriceGreaterThanStopPrice 'D'
///买一价大于等于条件价
#define THOST_FTDC_CC_BidPriceGreaterEqualStopPrice 'E'
///买一价小于条件价
#define THOST_FTDC_CC_BidPriceLesserThanStopPrice 'F'
///买一价小于等于条件价
#define THOST_FTDC_CC_BidPriceLesserEqualStopPrice 'H'

typedef char TThostFtdcContingentConditionType;


使用Immediately时即普通报单,使用LastPriceGreaterThanStopPrice一类的将按第十个参数的止损价进行触发。



SendOrder是有返回值的,就是当前会话的第几个委托。



此报单指令还是很复杂,实盘中使用肯定过于繁琐,

建议用户在Matlab层再封一次,可行的封装方式有:

Buy/Sell,仅记录净持仓
OpenLong/CloseLong、OpenShort/CloseShort,区分了双向持仓
SetPostion,不管操作,只在乎最后持仓
……


每个单子在报出后都会有委托回报,在OnRtnOrder中将单子记录下来,就可以进行撤单了

function OnRtnOrder(sender,arg)
% 委托回报

% 打印内容
disp(arg)

% 在某种情况下撤单,自己考虑各条件
%if arg.pOrder.VolumeTotal>2
    global td;
    % 撤单
    td.CancelOrder(arg.pOrder);
%end

end


实际上,实盘中还有更多的工作要做

OnRspOrderInsert:当报单在期货公司前置机参数检测出错时返回,如资金不足等

OnErrRspOrderInset:交易所报单出错时返回,如不支持的交易指令等

OnRspOrderAction:当撤单在期货公司前置机参数校验出错时返回,如找不到报单

OnErrRspOrderAction:交易所撤单出错时返回,如报单已经成交等

第九节 Matlab对接证券
证券接口开放性就有些不够了,金证、金仕达、恒生、根网、顶点都有证券柜台,但接口都不向外公开。只有国信证券向公众提供了FIX接口.2012年下半年,上期技术又打破平静,推出了CTP证券接口,特别是证券与期货接口仅仅是类型定义有所区别。直接可以将期货的代码略做修改移动到证券。

直接看项目https://github.com/QuantBox/CTPZQ/tree/master/CSharp-CTPZQ即可。[/code]

页: [1]