XROAD
order_book.h
Go to the documentation of this file.
1 
5 #pragma once
6 #include "order_fwd.h"
7 #include <props/props.h>
8 #include <logger/xroad_logger.h>
9 
10 #ifdef __cplusplus
11 extern "C"
12 {
13 #endif
14 
15 typedef enum
16 {
30 
31 typedef struct
32 {
33  bool (*on_can_send)(order_book_t*);
34  void (*on_activated)(order_book_t*);
35  void (*on_canceled)(order_book_t*);
36  void (*on_rejected)(order_book_t*, xroad_rej_reason_t, xroad_str_t);
37  void (*on_replaced)(order_book_t*);
38  void (*on_error)(order_book_t*, xroad_str_t);
39  void (*on_trade)(order_book_t*, xroad_trade_t*);
40  void (*on_destroyed)(order_book_t*);
41  xroad_errno_t (*gen_qty)(order_book_t*, uint64_t, xroad_side_t, xroad_qty_t*, size_t, xroad_sstream_t*);
42  void* ctx;
44 
45 typedef enum
46 {
47  order_book_side_none = 0,
48  order_book_side_buy = 1,
49  order_book_side_sell = 2,
50  order_book_side_both = 3
51 } order_book_side_t;
52 
56 typedef enum
57 {
63 
64 typedef struct
65 {
66  xroad_price_t best_bid;
67  xroad_price_t best_ask;
68  xroad_qty_t size;
69  order_book_side_t side;
70  xroad_sstream_t* ss;
72 
73 typedef struct
74 {
75  uint32_t levels;
76  order_book_side_t side;
77  xroad_price_t best_bid;
78  xroad_price_t best_ask;
79  uint32_t price_step;
80  xroad_str_t trader_book;
81  xroad_str_t account_buy;
82  xroad_str_t account_sell;
83  xroad_str_t client_code_buy;
84  xroad_str_t client_code_sell;
85  xroad_broker_t* broker_buy;
86  xroad_broker_t* broker_sell;
88  xroad_logger_t* logger;
89  xroad_sstream_t* ss;
90  int32_t flags;
91  int32_t order_flags;
92  xroad_currency_t* hedge_currency;
93  uint32_t destroy_timeout_ms;
95 
96 typedef struct
97 {
98  bool force;
100 
107 
113 xroad_str_t order_book_side_to_str(order_book_side_t side);
114 
115 #define order_book_create(instr, size, ...) \
116 ({ \
117  order_book_create_args_t args = {.levels = 1, .price_step = 1U, .destroy_timeout_ms = 5000, ## __VA_ARGS__}; \
118  order_book_create_ex(instr, size, args.levels, args.side, args.best_bid, args.best_ask, \
119  args.price_step, args.trader_book, args.account_buy, args.account_sell, \
120  args.client_code_buy, args.client_code_sell, args.broker_buy, args.broker_sell, \
121  args.cback, args.logger, args.ss, args.flags, args.order_flags, args.hedge_currency, \
122  args.destroy_timeout_ms); \
123 })
124 
152 order_book_t* order_book_create_ex(
153  xroad_instr_t* instr,
154  xroad_qty_t size,
155  uint32_t levels,
156  order_book_side_t side,
157  xroad_price_t best_bid,
158  xroad_price_t best_ask,
159  uint32_t price_step,
160  xroad_str_t trader_order_book,
161  xroad_str_t account_buy,
162  xroad_str_t account_sell,
163  xroad_str_t client_code_buy,
164  xroad_str_t client_code_sell,
165  xroad_broker_t* broker_buy,
166  xroad_broker_t* broker_sell,
167  order_book_callback_t cback,
168  xroad_logger_t* logger,
169  xroad_sstream_t* ss,
170  int32_t flags,
171  int32_t order_flags,
172  xroad_currency_t* hedge_currency,
173  uint32_t destroy_timeout_ms);
174 
175 void order_book_print(order_book_t* order_book);
176 
177 xroad_instr_t* order_book_get_instr(order_book_t* order_book);
178 
179 xroad_price_t order_book_get_size(order_book_t* order_book);
180 
181 void* order_book_get_ctx(order_book_t*);
182 
183 const order_t* order_book_get_order(order_book_t* order_book, order_book_side_t side, uint32_t idx);
184 
185 xroad_errno_t order_book_replace_ex(
186  order_book_t* order_book,
187  xroad_qty_t size,
188  order_book_side_t side,
189  xroad_price_t best_bid,
190  xroad_price_t best_ask,
191  int32_t mask,
192  xroad_sstream_t* ss);
193 
194 #define order_book_replace(order_book, ...) \
195 ({ \
196  xroad_qty_t def_size = -99999999999; \
197  xroad_price_t def_price = - 99999999999.0; \
198  order_book_replace_args_t args = (order_book_replace_args_t){ \
199  .size = def_size, .best_bid = def_price, .best_ask = def_price, .side = (order_book_side_t)-1, ## __VA_ARGS__}; \
200  int32_t mask = 0; \
201  mask |= !xroad_dbl_cmp(args.best_bid, def_price) ? 0 : order_book_replace_best_bid; \
202  mask |= !xroad_dbl_cmp(args.best_ask, def_price) ? 0 : order_book_replace_best_ask; \
203  mask |= args.side == (order_book_side_t)-1 ? 0 : order_book_replace_side; \
204  mask |= args.size == def_size ? 0 : order_book_replace_size; \
205  order_book_replace_ex(order_book, args.size, args.side, args.best_bid, args.best_ask, mask, args.ss); \
206 })
207 
208 xroad_errno_t order_book_send(order_book_t* order_book);
209 
210 xroad_errno_t order_book_cancel(order_book_t* order_book);
211 
212 #define order_book_destroy(book, ...) \
213 ({ \
214  order_book_destroy_args_t args = (order_book_destroy_args_t){__VA_ARGS__}; \
215  order_book_destroy_ex(book, args.force); \
216 })
217 
218 void order_book_destroy_ex(order_book_t* order_book, bool force);
219 
225 order_book_state_t order_book_get_state(order_book_t* order_book);
226 
227 #ifdef __cplusplus
228 }
229 #endif
order_book_replace_mask_t
Definition: order_book.h:57
@ order_book_replace_best_ask
replace best ask
Definition: order_book.h:59
@ order_book_replace_side
replace side
Definition: order_book.h:61
@ order_book_replace_best_bid
replace best bid
Definition: order_book.h:58
@ order_book_replace_size
replace size
Definition: order_book.h:60
order_book_state_t order_book_get_state(order_book_t *order_book)
order_book_state_t
Definition: order_book.h:16
@ order_book_state_active
order_book is in active state
Definition: order_book.h:18
@ order_book_state_awaiting_active
order_book is in awaiting active state
Definition: order_book.h:22
@ order_book_state_destroyed
order_book is in destroyed state
Definition: order_book.h:19
@ order_book_state_error
order_book is in errorneus state
Definition: order_book.h:27
@ order_book_state_awaiting_replace
order_book is in awaiting replace state
Definition: order_book.h:25
@ order_book_state_canceled
order_book is in canceled state
Definition: order_book.h:20
@ order_book_state_awaiting_cancel_replace
order_book is in awaiting cancel/replace state
Definition: order_book.h:28
@ order_book_state_awaiting_destroy
order_book is in awaiting destroyed state
Definition: order_book.h:23
@ order_book_state_initial
order_book is in initial state
Definition: order_book.h:17
@ order_book_state_awaiting_reject
order_book is awaiting to cancel all after reject
Definition: order_book.h:26
@ order_book_state_rejected
order_book is in rejected state
Definition: order_book.h:21
@ order_book_state_awaiting_cancel
order_book is in awaiting cancel state
Definition: order_book.h:24
xroad_str_t order_book_side_to_str(order_book_side_t side)
xroad_str_t order_book_state_to_str(order_book_state_t state)
order_book_t * order_book_create_ex(xroad_instr_t *instr, xroad_qty_t size, uint32_t levels, order_book_side_t side, xroad_price_t best_bid, xroad_price_t best_ask, uint32_t price_step, xroad_str_t trader_order_book, xroad_str_t account_buy, xroad_str_t account_sell, xroad_str_t client_code_buy, xroad_str_t client_code_sell, xroad_broker_t *broker_buy, xroad_broker_t *broker_sell, order_book_callback_t cback, xroad_logger_t *logger, xroad_sstream_t *ss, int32_t flags, int32_t order_flags, xroad_currency_t *hedge_currency, uint32_t destroy_timeout_ms)
Definition: order_book.h:32
void * ctx
stored context
Definition: order_book.h:42
Definition: order_book.h:74
Definition: order_book.h:97
Definition: order_book.h:65
Definition: xroad_string.h:29
struct xroad_str_s xroad_str_t
see common/xroad_string.h for details
Definition: xroad_common_fwd.h:39
int64_t xroad_qty_t
Definition: xroad_objects_types.h:159