Skip to content

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)