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