[金字塔教程]基于金字塔平台下开发C++交易策略
(2014-02-16 13:32:07)
标签:
策略开发程序化交易金字塔程序化交易量化投资c开发财经 |
分类: 金字塔决策交易系统 |
很多专业投资者及一些投资机构都喜欢使用C++直接编写交易策略,C++语言无论是灵活性和安全性都是要比传统的一般意义上的脚本语言要强大许多,这也是大家所普遍采用的一个主要理由。但是直接使用C++开发需要3个主要组件,主要包括:
1、历史行情数据的管理和接收
2、交易策略的评估与实现
3、下单交易具体实施
实际上上述3点其实已经包含了一个程序化交易软件所具有的主要特点了,如果是全部都要重新开发一套这样的产品,我们的投资公司最后都要变成名副其实软件公司了,将耗费很大的精力与财力来组织和管理整个软件开发团队。
如果使用金字塔平台进行C++的策略编写,那么上述的多个难点就可以很好的得到解决,主要如下:
1、金字塔为C++接口提供了丰富完善的历史数据,包括盘中即时数据,1分,5分,15,30,日线等等多大十几种周期数据,这些数据都是金字塔软件统一管理,模型的开发者不必再来操心历史数据如何管理。
2、我们的交易策略在前期模型阶段可以利用金字塔平台PEL语言快速的进行评估,评估结束后,再集中精力来变成C++的具体交易算法,节省了大量的时间。
3、可以利用金字塔平台进行全球市场交易;虽然现在CTP平台开放了交易接口,但毕竟是只有这一个接口,如果交易者要对其他的交易接口例如金仕达、恒生接口等等时,都必须要去重新开发接口,同样是要花费很大的精力。但如果使用金字塔平台,开发者就不必再去关心不同的交易接口到底有哪些不同,我们都已经为客户封装好了统一的交易接口规范,你只要交易策略编写完毕后,就可以在金字塔所支持的国内期货公司,证券公司,外盘期货外汇等等平台上进行交易。
综上所述,实际上很多底层的服务模块金字塔都已经为客户开发好了,客户在金字塔上只需要关心如何用C++编写策略就可以,极大的加快了投资者的开发周期,并节省了大量的研发费用。
如何在金字塔上进行C++策略的开发呢
有关插件接口更详细的描述,在金字塔的安装目录AddinDemo.rar 压缩文件内包含了完整插件接口的接口示例以及在.H头文件里的接口使用信息描述。
最后说明一点,金字塔的进程是不允许被调试加载的,这对C++开发者来说增加调试难度,但是可以通过附加进程调试的方法来解决问题,比如VS2008等都有很好的这种支持,详情请GOOGLE搜索。
其中主要的部分都在.H头文件中,我们这里贴出来给大家
注意:金字塔下C++插件的扩展名是 *.ADI 文件名,实际上就是DLL程序改了扩展名放到金字塔的工作目录下,这么设计主要是为了与金字塔已有的DLL模块冲突,放倒金字塔工作目录后,重新启动金字塔软件,就会在 工具菜单-》扩展 里看到我们所开发出来的C++插件了。
接口说明
#if !defined(__ADDININTERFACE_H__)
#define __ADDININTERFACE_H__
#define
#define
#pragma pack (push ,1)
//动态行情数据结构
typedef struct
{
time_t m_time;
float m_fLastClose;
float m_fOpen;
float m_fHigh;
float m_fLow;
float m_fNewPrice;
float m_fOI;
float m_fLastOI;
float m_fVolume;
float m_fAmount;
float m_fLastOpen;
float m_fLastHigh;
float m_fLastLow;
float m_fBuyPrice[3];
float m_fBuyVolume[3];
float m_fSellPrice[3];
float m_fSellVolume[3];
float m_fBuyPrice4;
float m_fBuyVolume4;
float m_fSellPrice4;
float m_fSellVolume4;
float m_fBuyPrice5;
float m_fBuyVolume5;
float m_fSellPrice5;
float m_fSellVolume5;
float m_fVolumeNow;
float m_fBuyVol;
float m_fSellVol;
char m_szName[32];
char m_szNamePY[16];
char m_szLabel[10];
float
float m_fNext5DayVol;
time_t m_timeHardenSpeed;
float m_fHardenSpeed;
WORD m_wMarket;
}REPORT_STRUCT;
//日线数据
typedef struct
{
DATE m_timeDate;
float m_fOpen;
float m_fHigh;
float m_fLow;
float m_fClose;
float m_fOI;
float m_fVolume;
float m_fAmount;
WORD m_wAdvance;
WORD m_wDecline;
WORD m_wQT;
float m_fOpenVolume;
float m_fOpenAmount;
}HISTORY_STRUCTEx;
//分笔成交数据结构
typedef struct{
time_t m_time;
float m_fNewPrice;
float m_fOI;
float m_fVolume;
float m_fAmount;
unsigned m_bOrder : 1;
}SUBSECTION_REPORT;
//除权信息
typedef struct
{
DATE m_timeDate;
double m_fGive;
double m_fPei;
float
float
float m_fPeiPrice;
float m_fProfit;
float m_fZhiJieStock;
}POWER_STRUCTEx;
typedef struct
WORD m_nMarket;
char m_szLable[10];
}BLOCK_STRUCT;
////////////////////////////////////////////////////
//分析周期
////////////////////////////////////////////////////
enum CYC_DATA_TYPE
{
MIN1_DATA=0,
};
typedef struct
{
//////////////////////////////////////////////////////////////////////////
//调用数据信息
DWORD
DWORD
char
WORD
CYC_DATA_TYPE m_dataType;
BOOL
int
BOOL
//////////////////////////////////////////////////////////////////////////
//以下为返回的数据信息
int
HISTORY_STRUCTEx *
SUBSECTION_REPORT *
m_pSubsection;
int
REPORT_STRUCT*
float*
POWER_STRUCTEx*
m_pSplitData;
int
}PCALCINFO;
typedef struct tagRCV_REPORT_STRUCTExV3
{
WORD m_cbSize;
time_t m_time;
WORD m_wMarket;
char
m_szLabel[STKLABEL_LEN];
char m_szName[STKNAME_LEN];
float m_fLastClose;
float m_fOpen;
float m_fHigh;
float m_fLow;
float m_fNewPrice;
float m_fVolume;
float m_fAmount;
float m_fBuyPrice[3];
float m_fBuyVolume[3];
float m_fSellPrice[3];
float m_fSellVolume[3];
float m_fBuyPrice4;
float m_fBuyVolume4;
float m_fSellPrice4;
float m_fSellVolume4;
float m_fBuyPrice5;
float m_fBuyVolume5;
float m_fSellPrice5;
float m_fSellVolume5;
} RCV_REPORT_STRUCTExV3;
typedef struct
BLOCK_STRUCT m_stStock;
BYTE
WORD
}TAOLI_INFO;
//成交回报消息结构
typedef struct
long m_nOrderID;
CString m_strStatus; //状态(详见.CPP文件描述)
long m_nFilled;
long m_nRemaining;
float m_fPrice;
CString m_strCode;
CString m_strMarket; //市场
BYTE m_nKaiping;
BYTE m_nType;
BYTE m_nAspect;
CString m_strAccount; //操作账户
BYTE m_nAccountType; //账户类型 0IB 1CTP 2金仕达
}BARGAIN_NOTIFY_KSI;
//////////////////////////////////////////////////////////////////////////
//消息包结构
//////////////////////////////////////////////////////////////////////////
typedef struct
RCV_REPORT_STRUCTExV3 * m_pData;
int m_nDataCount;
}REPORT_UPDATE1;
typedef struct
RCV_REPORT_STRUCTExQH * m_pData;
int m_nDataCount;
}REPORT_UPDATE2;
#pragma pack (pop)
//主程序暴露给插件的接口
interface IMainFramework
{
public:
IMainFramework(){};
virtual ~IMainFramework(){};
//取得主窗口句柄
virtual HWND
//取主程序版本号
virtual DWORD GetVersion() = 0;
//取指定品种数据,成功取得数据返回TRUE,否则为FALSE
virtual BOOL
//取指定品种的动态及时报表
virtual REPORT_STRUCT * GetReportData(char * szLabel, WORD wMarket) = 0;
//取指定分类板块的品种数组
//szName为分类或者板块名称,如"上海A股"等,nMode为类别,0市场分组,1分类板块,2系统板块(品种栏对应)
virtual void GetReportData(CArray &arBlcok, char * szName, int nMode) = 0;
//注册品种到数据通知,例如RegReportNotify("CL05",'MN');将合约注册到数据通知,当CL05有最新数据到达时触发ReportNotify事件。
virtual BOOL RegReportNotify(char * szLabel, WORD wMarket) = 0;
//取消品种数据注册,例如UnRegReportNotify("CL05",'MN'),CL05数据到达时不会再收到通知。
virtual void UnRegReportNotify(char * szLabel, WORD wMarket) = 0;
//下单委托交易
// nType
// fLmtPrice 委托限价
// fStopLmtPrice限价停损单(仅限IB外盘品种使用)
// nVol
// nAspect
// lpszLabel
// wMarket
// bMustOK
// lpszAccount
// nKaiPing
// nTouBao
// bOrderQueue
// 返回值 :
virtual long PlaceOrder(BYTE nType, float fLmtPrice, float fStopLmtPrice, UINT nVol, BYTE nAspact, LPCSTR lpszLabel, WORD wMarket,
//撤单
virtual void OrderCancel(long nOrderID, BYTE bOrderQueue) = 0;
//注册WINDOWS窗口消息,金字塔将以事件方式通知各种
virtual void RegisterMsg(HWND hMsgWnd, DWORD dwMsg) = 0;
//得到套利合约信息
//返回TRUE表示成功 ,返回套利指数内定义的套利品种信息
virtual BOOL GetTaoliInfo(char * szTaoliLabel, CArray &m_arTaoliInfo) = 0;
//得到IB品种持仓数量
virtual int GetHolding() = 0;
//得到国内期货的持仓数量
virtual int GetHolding2(char * szAccount) = 0;
//到所有IB帐户当前有效的未成交合约品种数量
virtual int GetOrderNum() = 0;
//得到所有国内期货当前有效的未成交合约品种数量
virtual int GetOrderNum2() = 0;
//得到IB帐户的成交明细数量
virtual int GetTradeCount() = 0;
//得到指定帐户的国内期货帐户的成交明细数量
virtual int GetTradeCount2(CString Account) = 0;
//当前已经登陆IB顾问帐户子帐户数量,若登陆的是IB普通帐户此属性为1
virtual int GetIBACCount() = 0;
//当前已经登陆国内期货帐户数量(包含无效登陆等情况在内的)
virtual int GetCTPAcCount() = 0;
//得到当前默认帐户信息
virtual VARIANT GetAccount(short nType) = 0;
//得到指定的国内期货帐户信息
virtual VARIANT GetAccount2(short nType, char * szAccount) = 0;
virtual BOOL
HoldingInfo(UINT Index, int &Hold, double &MktPrice, double
&AvgPrice, double &MktValue, double &AgeCost, double
&PNL, CString &Code,
virtual BOOL HoldingInfo2(UINT Index, int &BuyHoding, double &BuyCost, int &BuyTodayHoding, int &SellHoding, double &SellCost, int &SellTodayHoding, double &PNL, double &UseMargin, CString &Code, WORD &Market, CString Account) = 0;
virtual BOOL OrderInfo(UINT Index, int &OrderID, int &ConSign, int &Filled, int &Remaining, int &Action, int &OrderType, double &LmtPrice, double &auxPrice, CString &Account, CString &Code, WORD &Market) = 0;
virtual BOOL OrderInfo2(UINT Index, int &OrderID, int &ConSign, int &Filled, int &Remaining, int &Action, int &OrderType, double &LmtPrice, CString &Account, int &Kaiping, CString &Code, WORD &Market) = 0;
virtual int StockType(char *
szCode, WORD wMarket)
virtual int GetContract(char *szCode, WORD wMarket, float &Multipliter, float &MinTick, float &ShortPercent, float &LongPercent) = 0;
virtual float GetChargeByNum(char * szCode, WORD wMarket, float lmtPrice, int Volume, int Type) = 0;
virtual int TradeDetalied(int Index, DATE &Date, CString &Code, WORD &Market, int &OrderType, int &Action, float &Price, int &Volume, CString &Account) = 0;
virtual int TradeDetalied2(int Index, DATE &Date, CString &Code, WORD &Market, int &OrderType, int &Action, float &Price, int &Volume, int &Kaiping, CString &Account) = 0;
//得到指定基于0索引的IB帐户名称,例如IBAccountName(0)表示取第一个登陆的IB帐户
virtual CString GetIBAccountName(int nIndex) = 0;
//得到指定基于0索引的CTP帐户名称(包含登陆未成功的),例如 CTPAccountName(0)表示取第一个登陆的CTP用户名称
virtual CString GetCTPAccountName(int nIndex) = 0;
//判断指定帐号是否是当前已登录有效帐号,例如 Order.IsAccount("351579"),如果该账户已登录则返回1,否则返回0
virtual int IsAccount(CString strAccount) = 0;
};
#endif