FIX 4.0 Demo 1.0
Loading...
Searching...
No Matches
ctp_trader_adapter.hpp
Go to the documentation of this file.
1
10#pragma once
11
12#ifdef ENABLE_CTP
13
14#include <thread>
15#include <atomic>
16#include <mutex>
17#include <condition_variable>
18#include <string>
19#include <vector>
20#include <functional>
21#include "ThostFtdcTraderApi.h"
22
23namespace fix40 {
24
25// 前向声明
26class InstrumentManager;
27class CtpTraderAdapter;
28
32enum class CtpTraderState {
35 CONNECTED,
36 AUTHENTICATING,
38 READY,
39 QUERYING,
40 ERROR
41};
42
46struct CtpTraderConfig {
47 std::string traderFront;
48 std::string brokerId;
49 std::string userId;
50 std::string password;
51 std::string appId;
52 std::string authCode;
53 std::string flowPath;
54};
55
59class CtpTraderSpi final : public CThostFtdcTraderSpi {
60public:
61 explicit CtpTraderSpi(CtpTraderAdapter* adapter) : adapter_(adapter) {}
62 ~CtpTraderSpi() = default;
63
64 void OnFrontConnected() override;
65 void OnFrontDisconnected(int nReason) override;
66 void OnRspAuthenticate(CThostFtdcRspAuthenticateField* pRspAuthenticateField,
67 CThostFtdcRspInfoField* pRspInfo,
68 int nRequestID, bool bIsLast) override;
69 void OnRspUserLogin(CThostFtdcRspUserLoginField* pRspUserLogin,
70 CThostFtdcRspInfoField* pRspInfo,
71 int nRequestID, bool bIsLast) override;
72 void OnRspQryInstrument(CThostFtdcInstrumentField* pInstrument,
73 CThostFtdcRspInfoField* pRspInfo,
74 int nRequestID, bool bIsLast) override;
75 void OnRspError(CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast) override;
76 void OnHeartBeatWarning(int nTimeLapse) override;
77
78private:
79 CtpTraderAdapter* adapter_;
80};
81
112class CtpTraderAdapter {
113 friend class CtpTraderSpi;
114
115public:
117 using StateCallback = std::function<void(CtpTraderState state, const std::string& message)>;
118
120 using QueryCompleteCallback = std::function<void(int count)>;
121
126 explicit CtpTraderAdapter(const CtpTraderConfig& config);
127
128 ~CtpTraderAdapter();
129
130 // 禁止拷贝
131 CtpTraderAdapter(const CtpTraderAdapter&) = delete;
132 CtpTraderAdapter& operator=(const CtpTraderAdapter&) = delete;
133
138 bool start();
139
143 void stop();
144
148 bool isRunning() const { return running_.load(); }
149
153 CtpTraderState getState() const { return state_.load(); }
154
160 bool waitForReady(int timeoutSeconds);
161
166 bool queryInstruments();
167
173 bool queryInstruments(const std::string& exchangeId);
174
180 bool waitForQueryComplete(int timeoutSeconds);
181
186 void setInstrumentManager(InstrumentManager* manager) { instrumentManager_ = manager; }
187
191 void setStateCallback(StateCallback callback) { stateCallback_ = std::move(callback); }
192
196 void setQueryCompleteCallback(QueryCompleteCallback callback) { queryCompleteCallback_ = std::move(callback); }
197
201 std::string getTradingDay() const;
202
206 int getQueriedInstrumentCount() const { return queriedCount_.load(); }
207
208private:
212 void doAuthenticate();
213
217 void doLogin();
218
222 void notifyState(CtpTraderState state, const std::string& message);
223
224 CtpTraderConfig config_;
225 CThostFtdcTraderApi* api_ = nullptr;
226 std::unique_ptr<CtpTraderSpi> spi_;
227
228 std::atomic<bool> running_{false};
229 std::atomic<CtpTraderState> state_{CtpTraderState::DISCONNECTED};
230 std::atomic<int> requestId_{0};
231 std::atomic<int> queriedCount_{0};
232 std::atomic<bool> queryComplete_{false};
233
234 mutable std::mutex mutex_;
235 std::condition_variable readyCv_;
236 std::condition_variable queryCv_;
237 std::string tradingDay_;
238
239 InstrumentManager* instrumentManager_ = nullptr;
240 StateCallback stateCallback_;
241 QueryCompleteCallback queryCompleteCallback_;
242};
243
249CtpTraderConfig loadCtpTraderConfig(const std::string& filename);
250
251} // namespace fix40
252
253#endif // ENABLE_CTP
Definition matching_engine.hpp:23
@ READY
就绪(已登录,可订阅)
@ CONNECTED
已连接(未登录)
@ ERROR
错误状态
std::function< void(MdAdapterState state, const std::string &message)> StateCallback
状态变更回调类型
Definition md_adapter.hpp:38