Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 369a3df

Browse files
committed
add aggregate trades stream + kline-candlestick stream for binance.com example client
1 parent 01cfe83 commit 369a3df

File tree

6 files changed

+186
-6
lines changed

6 files changed

+186
-6
lines changed

‎client-binance.com/CMakeLists.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ add_library(${project_name}-lib
1313
src/WSListener.hpp
1414
src/Model.hpp
1515
src/WSEventListener.hpp
16+
src/AggregateTradesListener.hpp
1617
src/TradesListener.hpp
18+
src/KlineCandlestickListener.hpp
1719
)
1820

1921
## link libs

‎client-binance.com/README.md‎

Whitespace-only changes.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//
2+
// Created by Leonid on 2019年06月12日.
3+
//
4+
5+
#ifndef AggregateTradesListener_hpp
6+
#define AggregateTradesListener_hpp
7+
8+
#include "Model.hpp"
9+
#include "WSEventListener.hpp"
10+
11+
/**
12+
* Listener for Aggregate Trade events
13+
*/
14+
class AggregateTradesListener : public WSEventListener<AggregateTrade> {
15+
public:
16+
17+
AggregateTradesListener(const std::shared_ptr<oatpp::data::mapping::ObjectMapper>& mapper)
18+
: WSEventListener<AggregateTrade>(mapper)
19+
{}
20+
21+
void onEvent(const AggregateTrade::ObjectWrapper& trade) override {
22+
23+
OATPP_LOGI("AggregateTrades", "%s - quantity=%s, price=%s, time=%d / firstTradeId=%d, lastTradeId=%d",
24+
trade->symbol->getData(),
25+
trade->quantity->getData(),
26+
trade->price->getData(),
27+
trade->tradeTime->getValue(),
28+
trade->firstTradeId->getValue(),
29+
trade->lastTradeId->getValue()
30+
);
31+
32+
}
33+
34+
};
35+
36+
#endif // AggregateTradesListener_hpp

‎client-binance.com/src/App.cpp‎

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11

22
#include "WSListener.hpp"
33

4+
#include "KlineCandlestickListener.hpp"
5+
#include "AggregateTradesListener.hpp"
46
#include "TradesListener.hpp"
57

68
#include "oatpp-websocket/WebSocket.hpp"
@@ -20,7 +22,23 @@ namespace {
2022
}
2123

2224
/**
23-
* Connect to "trade" tream and listen for trading events
25+
* Connect to "aggregate trade" stream and listen for trading events
26+
* @param connector
27+
* @param objectMapper
28+
*/
29+
void readAggregateTrades(const std::shared_ptr<oatpp::websocket::Connector>& connector,
30+
const std::shared_ptr<oatpp::data::mapping::ObjectMapper>& objectMapper)
31+
{
32+
33+
auto connection = connector->connect("ws/bnbbtc@aggTrade");
34+
oatpp::websocket::WebSocket socket(connection, true /* maskOutgoingMessages must be true for clients */);
35+
socket.setListener(std::make_shared<AggregateTradesListener>(objectMapper));
36+
socket.listen();
37+
38+
}
39+
40+
/**
41+
* Connect to "trade" stream and listen for trading events
2442
* @param connector
2543
* @param objectMapper
2644
*/
@@ -29,11 +47,24 @@ void readTrades(const std::shared_ptr<oatpp::websocket::Connector>& connector,
2947
{
3048

3149
auto connection = connector->connect("ws/bnbbtc@trade");
32-
3350
oatpp::websocket::WebSocket socket(connection, true /* maskOutgoingMessages must be true for clients */);
34-
3551
socket.setListener(std::make_shared<TradesListener>(objectMapper));
52+
socket.listen();
53+
54+
}
55+
56+
/**
57+
* Connect to "Kline/Candlestick" stream and listen for events
58+
* @param connector
59+
* @param objectMapper
60+
*/
61+
void readCandlesticks(const std::shared_ptr<oatpp::websocket::Connector>& connector,
62+
const std::shared_ptr<oatpp::data::mapping::ObjectMapper>& objectMapper)
63+
{
3664

65+
auto connection = connector->connect("ws/bnbbtc@kline_1m");
66+
oatpp::websocket::WebSocket socket(connection, true /* maskOutgoingMessages must be true for clients */);
67+
socket.setListener(std::make_shared<KlineCandlestickListener>(objectMapper));
3768
socket.listen();
3869

3970
}
@@ -48,19 +79,25 @@ void run() {
4879
auto config = oatpp::mbedtls::Config::createDefaultClientConfigShared();
4980

5081
/* secure connection provider for stream.binance.com */
51-
auto connectionProvider = oatpp::mbedtls::client::ConnectionProvider::createShared(config, "stream.binance.com", 9443);
82+
auto connectionProvider = oatpp::mbedtls::client::ConnectionProvider::createShared(config, "stream.binance.com", 9443/* port */);
5283

5384
/* websocket connector */
5485
auto connector = oatpp::websocket::Connector::createShared(connectionProvider);
5586

5687
/* object mapper for DTO objects */
5788
auto objectMapper = oatpp::parser::json::mapping::ObjectMapper::createShared();
5889

59-
/* start trades read task in the thread */
90+
91+
/* Start Stream Reading Tasks */
92+
93+
std::thread aggTradesThread(readAggregateTrades, connector, objectMapper);
6094
std::thread tradesThread(readTrades, connector, objectMapper);
95+
std::thread candlesticksThread(readCandlesticks, connector, objectMapper);
6196

62-
/* join tasks */
97+
/* join task threads */
98+
aggTradesThread.join();
6399
tradesThread.join();
100+
candlesticksThread.join();
64101

65102
}
66103

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// Created by Leonid on 2019年06月12日.
3+
//
4+
5+
#ifndef KlineCandlestickListener_hpp
6+
#define KlineCandlestickListener_hpp
7+
8+
#include "Model.hpp"
9+
#include "WSEventListener.hpp"
10+
11+
/**
12+
* Listener for Trade events
13+
*/
14+
class KlineCandlestickListener : public WSEventListener<Candlestick> {
15+
public:
16+
17+
KlineCandlestickListener(const std::shared_ptr<oatpp::data::mapping::ObjectMapper>& mapper)
18+
: WSEventListener<Candlestick>(mapper)
19+
{}
20+
21+
void onEvent(const Candlestick::ObjectWrapper& obj) override {
22+
23+
OATPP_LOGI("Kline/Candlesticks", "%s - startTime=%d, closeTime=%d / openPrice=%s, closePrice=%s, highPrice=%s, lowPrice=%s",
24+
obj->symbol->getData(),
25+
obj->kline->klineStartTime->getValue(),
26+
obj->kline->klineCloseTime->getValue(),
27+
obj->kline->openPrice->getData(),
28+
obj->kline->closePrice->getData(),
29+
obj->kline->highPrice->getData(),
30+
obj->kline->lowPrice->getData()
31+
);
32+
33+
}
34+
35+
};
36+
37+
#endif // KlineCandlestickListener_hpp

‎client-binance.com/src/Model.hpp‎

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,28 @@
1010

1111
#include OATPP_CODEGEN_BEGIN(DTO)
1212

13+
/**
14+
* DTO representing "Aggregate Trade Stream" object from binance-exchange.
15+
* See https://github.com/binance-exchange/binance-official-api-docs/blob/master/web-socket-streams.md#aggregate-trade-streams
16+
*/
17+
class AggregateTrade : public oatpp::data::mapping::type::Object {
18+
19+
DTO_INIT(AggregateTrade, Object)
20+
21+
DTO_FIELD(String, eventType, "e");
22+
DTO_FIELD(Int64, eventTime, "E");
23+
DTO_FIELD(String, symbol, "s");
24+
DTO_FIELD(Int64, aggregateTradeId, "a");
25+
DTO_FIELD(String, price, "p");
26+
DTO_FIELD(String, quantity, "q");
27+
DTO_FIELD(Int64, firstTradeId, "f");
28+
DTO_FIELD(Int64, lastTradeId, "l");
29+
DTO_FIELD(Int64, tradeTime, "T");
30+
DTO_FIELD(Boolean, marketMaker, "m");
31+
DTO_FIELD(Boolean, ignore, "M");
32+
33+
};
34+
1335
/**
1436
* DTO representing "Trade Stream" object from binance-exchange.
1537
* See https://github.com/binance-exchange/binance-official-api-docs/blob/master/web-socket-streams.md#trade-streams
@@ -32,6 +54,52 @@ class Trade : public oatpp::data::mapping::type::Object {
3254

3355
};
3456

57+
/**
58+
* Nested object for Candlestick
59+
*/
60+
class Kline : public oatpp::data::mapping::type::Object {
61+
62+
DTO_INIT(Kline, Object)
63+
64+
DTO_FIELD(Int64, klineStartTime, "t");
65+
DTO_FIELD(Int64, klineCloseTime, "T");
66+
DTO_FIELD(String, symbol, "s");
67+
DTO_FIELD(String, interval, "i");
68+
69+
DTO_FIELD(Int64, firstTradeId, "f");
70+
DTO_FIELD(Int64, lastTradeId, "L");
71+
72+
DTO_FIELD(String, openPrice, "o");
73+
DTO_FIELD(String, closePrice, "c");
74+
DTO_FIELD(String, highPrice, "h");
75+
DTO_FIELD(String, lowPrice, "l");
76+
DTO_FIELD(String, baseAssetVolume, "v");
77+
78+
DTO_FIELD(Int64, numberOfTrades, "n");
79+
DTO_FIELD(Boolean, isKlineClosed, "x");
80+
81+
DTO_FIELD(String, quoteAssetVolume, "q");
82+
DTO_FIELD(String, takerBuyBaseAssetVolume, "V");
83+
DTO_FIELD(String, takerBuyQuoteAssetVolume, "Q");
84+
DTO_FIELD(String, ignore, "B");
85+
86+
};
87+
88+
/**
89+
* DTO representing "Kline/Candlestick Stream" object from binance-exchange.
90+
* See https://github.com/binance-exchange/binance-official-api-docs/blob/master/web-socket-streams.md#klinecandlestick-streams
91+
*/
92+
class Candlestick : public oatpp::data::mapping::type::Object {
93+
94+
DTO_INIT(Candlestick, Object)
95+
96+
DTO_FIELD(String, eventType, "e");
97+
DTO_FIELD(Int64, eventTime, "E");
98+
DTO_FIELD(String, symbol, "s");
99+
DTO_FIELD(Kline::ObjectWrapper, kline, "k");
100+
101+
};
102+
35103
#include OATPP_CODEGEN_END(DTO) ///< End DTO codegen section
36104

37105
#endif // Model_hpp

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /