金融软件开发:交易程序化

  量化交易是最近几年国内逐渐兴起并蓬勃发展的金融软件领域。目前国外成熟市场中交易中大约70%为量化交易,2011年美国量化投资和对冲基金的规模就达到两万多亿美元规模,,如果国内某天放开股票T+0,那市场估计很庞大。现在国内量化主要在期货交易上(不要只迷恋股票,期货也有其独特个性,日持仓几千亿资金的股指期货也是期货之一)。

     前景就不多描述了,一个东西让大家为之侧目时,就已经很难进入了,所以了解一下很必要。也许你很适合做一个策略师,而不是一个程序员呢?要知道开发一个策略很容易(当然开发一个能赚钱的策略不容易),利用开发平台,几十行脚本代码就行,多则几百行,也许在你空闲的某个周末就能创造出来。

     进入正题,要开发量化交易软件,有两种方式:

1.采用国内外已有的开发平台,例如国内的交易开拓者、国外的MultiChart,在上面用脚本语言编写交易策略,开发测试简单,,但运行效率不是很高,特别不适合高频率交易。适合策略师。

2.采用API接口,用c++、JAVA、(C#也可以通过调用C++实现)调用(例如上期CTP期货接口),入门要求比较高,适合开发各种简单或复杂策略或交易软件。适合软件程序开发者。

第一种方式入门简单,程序员可以考虑下找资料试试看,也许会产生一大批交易高手呢。不过据说交易需要艺术家的思维,逻辑性不太适应。唉,我就是逻辑性太强了点^_^。下面具体介绍第二种开发方式。

     下图是一个交易软件:

  

      功能主要有3个部分:

      1.行情显示,需要继承CTP的行情接口,行情数据回报订阅与处理

      2.交易下单,需要继承CTP的交易接口,包括下单、撤单、合约查询

      3.账户信息,也是继承交易接口,包括成交记录、持仓、订单记录、资金状况

接口继承范例(C++)
class CMd :public CThostFtdcMdSpi { public: CMd(CThostFtdcMdApi* pMdApi) : m_pMdApi(pMdApi) { ..... class CTd :public CThostFtdcTraderSpi { public: CTd(CThostFtdcTraderApi *pTradeApi,char* broker_id,char* user_id,char* user_pw) : m_pUserApi(pTradeApi) {

     

       开发CTP需要解决2个重要问题:

1.用户持仓、挂单计算,订单、成交处理

2.回报数据处理(行情、订单、成交等)

持仓的计算需要本地通过结合成交查询和成交回报处理,挂单则需要接口订单查询和订单回报处理,这是API开发入门的一个门槛;回报数据比较好处理,要保持高速,避免读写内存冲突,需要引入消息队列。

 

      用C++开发应用软件开发效率远不如C#,但是API并不支持C#,所以要么你一直用C++开发,但是C++程序界面定制很难,各种功能组件也少(例如你要引入加密、数据排序等),只用于开发策略软件可能是够了,但开发交易相关应用则远远不够,开发极费时间,你能找到C++库也许存在各种编译问题。所以我采用第二种方式:将CTP核心功能用C++封装成DLL,供C#调用,基于这个封装组件,我开发了几个应用,例如交易客户端工具、跟单工具、信号执行工具等。

     看一下这个组件的接口:

public class ICtp
    {
        private const string path = @"C2Order.dll";// @"E:\Project\C2Order\Debug\C2Order.dll";// // "C2Order.dll";// 

        [DllImport(path, EntryPoint = "Add")]
        public extern static int Add(int a, int b);//测试

        /***************************** MD行情 ***********************************/
        [DllImport(path, EntryPoint = "LoginMd")]
        public extern static int LoginMd(string brokerid, string addr);
        [DllImport(path, EntryPoint = "SubscribeMd")]
        public extern static int SubscribeMd(string inst,bool bUnSub=false);
        [DllImport(path, EntryPoint = "IsZZInstId")]
        public extern static int IsZZInstId(string inst, string inst2);

        [DllImport(path, EntryPoint = "GetPrice")]
        public extern static double GetPrice(string inst, int type, int nslop);//type:1买价,-1卖价,0最新价;nslop:滑点数
        [DllImport(path, EntryPoint = "GetPriceTick")]
        public extern static double GetPriceTick(string inst);
        [DllImport(path, EntryPoint = "WriteInstFile")]
        public extern static int WriteInstFile(string path);

        /***************************** TD交易 ***********************************/
        [DllImport(path, EntryPoint = "LoginTd")]
        public extern static int LoginTd(string userid, string pw, string brokerid, string addr);//主要必须先登录行情

        [DllImport(path, EntryPoint = "StopTd")]
        public extern static int StopTd(string userid, string brokerid);
        [DllImport(path, EntryPoint = "ReqAmount")]
        public extern static int ReqAmount(string userid, string brokerid);//查询账户资金

        [DllImport(path, EntryPoint = "DoOrder")]
        public extern static int DoOrder(string userid, string brokerid, string instrument, char dc, char offset, double price, int volume, char CombHedgeFlag,string refid="");
        [DllImport(path, EntryPoint = "DoCancel")]
        public extern static int CancelOrder(string userid, string brokerid, string instrument, char dc, char offset);
        [DllImport(path, EntryPoint = "CancelOrder")]
        public extern static int CancelOrder(string userid, string brokerid, string orderRef, string sysRef);

        [DllImport(path, EntryPoint = "StartMainThread")]
        public extern static void StartMainThread(string dir);
        [DllImport(path, EntryPoint = "StopMainThread")]
        public extern static void StopMainThread();
        /****************** 行情、订单、成交、持仓、资金回报 **********************/
        public delegate void PriceCallback(ref CThostFtdcDepthMarketDataField pDepthMarketData);
        public delegate void OrderCallback(StringBuilder UserId,ref OrderInfo orderInfo);
        public delegate void TradedCallback(StringBuilder UserId, ref TradedInfo tradedInfo);
        public delegate void PositionCallback(StringBuilder UserId, ref DCTradingInfo tradingInfo);
        public delegate void AmountCallback(StringBuilder UserId, ref AmountInfo amountInfo);

        [DllImport(path, EntryPoint = "SetPriceCallback",CallingConvention = CallingConvention.Cdecl)]
        public extern static void SetPriceCallback(PriceCallback callback);       
        [DllImport(path, EntryPoint = "SetTdCallBack", CallingConvention = CallingConvention.Cdecl)]
        public extern static void SetTdCallBack(string userid, OrderCallback callback, TradedCallback callback2, PositionCallback callback3, AmountCallback callback4);
    }

  其实内容也不多是不是?

      

     

posted @ 2015-03-13 13:20  11ge  阅读(2007)  评论(1编辑  收藏  举报