金融软件开发:交易程序化
量化交易是最近几年国内逐渐兴起并蓬勃发展的金融软件领域。目前国外成熟市场中交易中大约70%为量化交易,2011年美国量化投资和对冲基金的规模就达到两万多亿美元规模,,如果国内某天放开股票T+0,那市场估计很庞大。现在国内量化主要在期货交易上(不要只迷恋股票,期货也有其独特个性,日持仓几千亿资金的股指期货也是期货之一)。
前景就不多描述了,一个东西让大家为之侧目时,就已经很难进入了,所以了解一下很必要。也许你很适合做一个策略师,而不是一个程序员呢?要知道开发一个策略很容易(当然开发一个能赚钱的策略不容易),利用开发平台,几十行脚本代码就行,多则几百行,也许在你空闲的某个周末就能创造出来。
进入正题,要开发量化交易软件,有两种方式:
1.采用国内外已有的开发平台,例如国内的交易开拓者、国外的MultiChart,在上面用脚本语言编写交易策略,开发测试简单,,但运行效率不是很高,特别不适合高频率交易。适合策略师。
2.采用API接口,用c++、JAVA、(C#也可以通过调用C++实现)调用(例如上期CTP期货接口),入门要求比较高,适合开发各种简单或复杂策略或交易软件。适合软件程序开发者。
第一种方式入门简单,程序员可以考虑下找资料试试看,也许会产生一大批交易高手呢。不过据说交易需要艺术家的思维,逻辑性不太适应。唉,我就是逻辑性太强了点^_^。下面具体介绍第二种开发方式。
下图是一个交易软件:
功能主要有3个部分:
1.行情显示,需要继承CTP的行情接口,行情数据回报订阅与处理
2.交易下单,需要继承CTP的交易接口,包括下单、撤单、合约查询
3.账户信息,也是继承交易接口,包括成交记录、持仓、订单记录、资金状况
1 2 3 4 5 6 7 8 9 10 11 12 13 | 接口继承范例(C++)<br> 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#调用,基于这个封装组件,我开发了几个应用,例如交易客户端工具、跟单工具、信号执行工具等。
看一下这个组件的接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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); } |
其实内容也不多是不是?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库