FIX 4.0 Demo 1.0
Loading...
Searching...
No Matches
ctp_md_adapter.hpp
Go to the documentation of this file.
1
9#pragma once
10
11#ifdef ENABLE_CTP
12
13#include <thread>
14#include <atomic>
15#include <mutex>
16#include <set>
17#include <string>
18#include "market/md_adapter.hpp"
19#include "ThostFtdcMdApi.h"
20
21namespace fix40 {
22
26struct CtpMdConfig {
27 std::string mdFront;
28 std::string brokerId;
29 std::string userId;
30 std::string password;
31 std::string flowPath;
32};
33
34// 前向声明
35class CtpMdAdapter;
36
40class CtpMdSpi final : public CThostFtdcMdSpi {
41public:
42 explicit CtpMdSpi(CtpMdAdapter* adapter) : adapter_(adapter) {}
43 ~CtpMdSpi() = default;
44
45 void OnFrontConnected() override;
46 void OnFrontDisconnected(int nReason) override;
47 void OnRspUserLogin(CThostFtdcRspUserLoginField* pRspUserLogin,
48 CThostFtdcRspInfoField* pRspInfo,
49 int nRequestID, bool bIsLast) override;
50 void OnRspSubMarketData(CThostFtdcSpecificInstrumentField* pSpecificInstrument,
51 CThostFtdcRspInfoField* pRspInfo,
52 int nRequestID, bool bIsLast) override;
53 void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField* pSpecificInstrument,
54 CThostFtdcRspInfoField* pRspInfo,
55 int nRequestID, bool bIsLast) override;
56 void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField* pDepthMarketData) override;
57 void OnRspError(CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast) override;
58 void OnHeartBeatWarning(int nTimeLapse) override;
59
60private:
61 CtpMdAdapter* adapter_;
62};
63
70class CtpMdAdapter : public MdAdapter {
71 friend class CtpMdSpi;
72
73public:
80 const CtpMdConfig& config);
81
82 ~CtpMdAdapter() override;
83
84 // 禁止拷贝
85 CtpMdAdapter(const CtpMdAdapter&) = delete;
86 CtpMdAdapter& operator=(const CtpMdAdapter&) = delete;
87
88 // MdAdapter 接口实现
89 bool start() override;
90 void stop() override;
91 bool isRunning() const override { return running_.load(); }
92 MdAdapterState getState() const override { return state_.load(); }
93
94 bool subscribe(const std::vector<std::string>& instruments) override;
95 bool unsubscribe(const std::vector<std::string>& instruments) override;
96
97 void setStateCallback(StateCallback callback) override;
98
99 std::string getName() const override { return "CTP"; }
100 std::string getTradingDay() const override;
101
102private:
106 void doLogin();
107
111 void doSubscribePending();
112
116 void notifyState(MdAdapterState state, const std::string& message);
117
121 static MarketData convertMarketData(const CThostFtdcDepthMarketDataField* pData);
122
123 CtpMdConfig config_;
124 CThostFtdcMdApi* api_ = nullptr;
125 std::unique_ptr<CtpMdSpi> spi_;
126
127 std::atomic<bool> running_{false};
128 std::atomic<MdAdapterState> state_{MdAdapterState::DISCONNECTED};
129 std::atomic<int> requestId_{0};
130
131 mutable std::mutex mutex_;
132 std::set<std::string> subscribedInstruments_;
133 std::set<std::string> pendingSubscribe_;
134 std::string tradingDay_;
135
136 StateCallback stateCallback_;
137};
138
144CtpMdConfig loadCtpConfig(const std::string& filename);
145
146} // namespace fix40
147
148#endif // ENABLE_CTP
Definition concurrentqueue.h:768
行情适配器接口定义
Definition matching_engine.hpp:23
MdAdapterState
行情适配器状态
Definition md_adapter.hpp:24
std::function< void(MdAdapterState state, const std::string &message)> StateCallback
状态变更回调类型
Definition md_adapter.hpp:38