量化交易之One Piece篇 - MarketCTP.h
    
#pragma once
#include <vector>
#include <string>
#include <iostream>
#include <atomic>
#include <onepiece/api/ctp/ThostFtdcMdApi.h>
#include <onepiece/models/AccountModel.h>
#include <onepiece/templates/ICoreListener.h>
#include <onepiece/templates/IMarketApi.h>
using namespace std;
class MarketCTP: public IMarketApi, public CThostFtdcMdSpi
{
public:
    MarketCTP() = delete;
    MarketCTP(AccountSPtr accountPtr);
    virtual ~MarketCTP();
public:
    virtual bool Connect();
    
    virtual bool Disconnect();
    virtual void Subscribe(const shared_ptr<vector<string>> instruments);
    virtual void Unsubscribe(const shared_ptr<vector<string>> instruments);
    virtual bool RegisterListener(ICoreListener* coreListener);
public:
    virtual void OnFrontConnected();
    virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
    virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData);
    virtual void OnFrontDisconnected(int nReason);
    virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
    virtual void OnHeartBeatWarning(int nTimeLapse);
private:
    inline string GetDisconnectedReason(int reason) {
        switch (reason) {
            case 0x1001:
                return "网络读失败";
            case 0x1002:
                return "网络写失败";
            case 0x2001:
                return "接收心跳超时";
            case 0x2002:
                return "发送心跳失败";
            case 0x2003:
                return "收到错误报文";
            default:
                return "Unknown";
        }
    };
    inline uint32_t MakeRequestID() {
        return this->m_nRequestID.fetch_add(1) + 1;
    }
private:
    CThostFtdcMdApi *m_api;
    atomic<uint32_t> m_nRequestID;
    AccountSPtr m_accountPtr;
    ICoreListener* m_coreListener;
};