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

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

  其实内容也不多是不是?

      

     

posted @   11ge  阅读(2054)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示