zoukankan      html  css  js  c++  java
  • 金融软件开发:交易程序化

      量化交易是最近几年国内逐渐兴起并蓬勃发展的金融软件领域。目前国外成熟市场中交易中大约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:ProjectC2OrderDebugC2Order.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);
        }
    

      其实内容也不多是不是?

          

         

  • 相关阅读:
    ajax专题
    luogu P1346 电车 最短路
    luogu P1462 通往奥格瑞玛的道路 最短路
    luogu P1328 生活大爆炸版石头剪刀布
    luogu P1315 联合权值 枚举
    luogu P1156 垃圾陷阱 背包问题
    luogu P1217 回文质数 枚举
    luogu P3650 滑雪课程设计 枚举
    luogu1209 修理牛棚 贪心
    luogu P1223 排队接水 贪心
  • 原文地址:https://www.cnblogs.com/ninestates/p/4334652.html
Copyright © 2011-2022 走看看