CTPAPI策略交易框架

CTPAPI的专业性很强,由于CTP柜台采用内存数据库计算架构,在通讯机制上支持重演等特性,流式传输机制可能很多人就不容易理解,不同情况下,订单响应、回报推送等流程也不一样,手续费、保证金费率查询及资金与持仓计算均有不小的难度,并且还有很多坑要去踩,不仅新手,就是老手想写一套完整的策略交易程序也不是一件容易的事。开仓要冻结、失败要释放冻结,撤单要释放冻结,开仓成交要释放冻结保证金重新计算占用保证金,平仓成交要释放占用保证金并计算平仓盈亏等等,难度很高,很费精力。

市场上不缺策略交易框架,有很多也是开源的,但是基本上都是功能比较全的大框架,特别是支持回测、分析等专业的功能,但是凡事都有两面性,强大的工具也需要很强的驾驭能力,需要花很多时间去学习,如果你仅仅是需要实现一些简单的策略,并且并不需要回测等功能,那可能那些框架并不适合你。但是基于最低层的CTPAPI去写策略又太难了,于是就有了我们这套Tick级CTPAPI策略交易框架,它非常轻量,只做了一层最基础的封装,将CTPAPI接口复杂的订单处理、持仓与资金计算等逻辑封装掉,提供出一个非常简洁的策略层API,同时也保留了CTPAPI原生的数据结构,所以乍一看好像也没怎么封装,这就是简约而不简单的设计理念。

有了openctp的CTPAPI兼容接口技术,这套框架除了可以做期货、期权交易,还可以无缝对接到CTP股票期权柜台、中泰XTP、华鑫奇点等柜台进行股票、股票期权等品种交易,也可以对接到量投QDP、易达等极速柜台进行相关品种交易,所以具有很强的实用性。

策略交易框架价格:

策略程序demo:

#include "TickTradingFramework.h"
#include "SampleStrategy.h"
#include "ArbitrageStrategy.h"
#include "INIReader/INIReader.h"
#include 

int main(int argc, char* argv[])
{
  std::string TdHost, TdNameServer, MdHost, MdNameServer;
  std::string BrokerID, UserProductInfo, AuthCode, AppID;
  std::string UserID, Password;

  INIReader reader("Application.ini");

  // read config from file
  if (reader.ParseError() < 0) {
    std::cout << "open ini file failed." << std::endl;
    return -1;
  }
  TdHost = reader.Get("Trade", "Host", "");
  TdNameServer = reader.Get("Trade", "NameServer", "");
  MdHost = reader.Get("Market", "Host", "");
  MdNameServer = reader.Get("Market", "NameServer", "");
  BrokerID = reader.Get("Trade", "BrokerID", "");
  UserProductInfo = reader.Get("Trade", "UserProductInfo", "");
  AppID = reader.Get("Trade", "AppID", "");
  AuthCode = reader.Get("Trade", "AuthCode", "");
  UserID = reader.Get("Trade", "UserID", "");
  Password = reader.Get("Trade", "Password", "");

  CTickTradingFramework Framework;
  Framework.SetTdParameters(TdHost, TdNameServer, BrokerID, UserID, Password, UserProductInfo, AppID, AuthCode);
  Framework.SetMdParameters(MdHost, MdNameServer, BrokerID, UserID, Password, UserProductInfo);

  // 示例策略
  CSampleStrategy SampleStrategy(&Framework, "au2403", "");
  Framework.AddStrategy(&SampleStrategy);

  // 示例套利策略
  CArbitrageStrategy ArbitrageStrategy(&Framework, "au2403", "au2404", "");
  Framework.AddStrategy(&ArbitrageStrategy);

  // Running
  Framework.Run();

  return 0;
}

示例策略demo:

#include "SampleStrategy.h"

CSampleStrategy::CSampleStrategy(CTickTradingFramework* pFramework, std::string InstrumentID, std::string Parameters):
  CStrategy("SampleStratety", "", pFramework),
  m_InstrumentID(InstrumentID)
{
  AddInstrument(InstrumentID);
}

CSampleStrategy::~CSampleStrategy()
{
}

void CSampleStrategy::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField& DepthMarketData)
{
  static size_t count=1;
  if(count%10==0)
    LongEntry(m_InstrumentID, DepthMarketData.AskPrice1, 1);
  count++;
}

void CSampleStrategy::OnRspOrderInsert(CThostFtdcInputOrderField& InputOrder, CThostFtdcRspInfoField& RspInfo, int nRequestID, bool bIsLast)
{
  CStrategy::OnRspOrderInsert(InputOrder,RspInfo,nRequestID,bIsLast);
}

void CSampleStrategy::OnRspOrderAction(CThostFtdcInputOrderActionField& InputOrderAction, CThostFtdcRspInfoField& RspInfo, int nRequestID, bool bIsLast)
{
  CStrategy::OnRspOrderAction(InputOrderAction, RspInfo, nRequestID, bIsLast);
}

void CSampleStrategy::OnRtnOrder(CThostFtdcOrderField& Order)
{
  CStrategy::OnRtnOrder(Order);
}

void CSampleStrategy::OnRtnTrade(CThostFtdcTradeField& Trade)
{
  CStrategy::OnRtnTrade(Trade);
}