@@ -7,6 +7,29 @@ defmodule BinanceMock do
77
88 alias Decimal
99 alias Core.Struct.TradeEvent
10+ alias Binance.Order
11+ alias Binance.OrderResponse
12+ alias Core.Struct.TradeEvent
13+
14+ @ type symbol :: binary
15+ @ type quantity :: binary
16+ @ type price :: binary
17+ @ type time_in_force :: binary
18+ @ type timestamp :: non_neg_integer
19+ @ type order_id :: non_neg_integer
20+ @ type orig_client_order_id :: binary
21+ @ type recv_window :: binary
22+
23+ @ callback order_limit_buy ( symbol , quantity , price , time_in_force ) ::
24+ { :ok , % OrderResponse { } } | { :error , term }
25+
26+ @ callback order_limit_sell ( symbol , quantity , price , time_in_force ) ::
27+ { :ok , % OrderResponse { } } | { :error , term }
28+
29+ @ callback get_order ( symbol , timestamp , order_id ) ::
30+ { :ok , % Order { } } | { :error , term }
31+
32+ @ callback get_exchange_info ( ) :: { :ok , Binance.ExchangeInfo } | { :error , term }
1033
1134 require Logger
1235
@@ -51,6 +74,42 @@ defmodule BinanceMock do
5174 GenServer . call ( __MODULE__ , { :get_order , symbol , time , order_id } )
5275 end
5376
77+ def generate_fake_order ( order_id , symbol , quantity , price , side )
78+ when is_binary ( symbol ) and is_binary ( quantity ) and is_binary ( price ) and
79+ ( side == "BUY" or side == "SELL" ) do
80+ current_timestamp = :os . system_time ( :millisecond )
81+ client_order_id = :crypto . hash ( :md5 , "#{ order_id } " ) |> Base . encode16 ( )
82+
83+ Binance.Order . new ( % {
84+ symbol: symbol ,
85+ order_id: order_id ,
86+ client_order_id: client_order_id ,
87+ price: price ,
88+ orig_qty: quantity ,
89+ executed_qty: "0.00000000" ,
90+ cummulative_quote_qty: "0.00000000" ,
91+ status: "NEW" ,
92+ time_in_force: "GTC" ,
93+ type: "LIMIT" ,
94+ side: side ,
95+ stop_price: "0.00000000" ,
96+ iceberg_qty: "0.00000000" ,
97+ time: current_timestamp ,
98+ update_time: current_timestamp ,
99+ is_working: true
100+ } )
101+ end
102+
103+ def convert_order_to_order_response ( % Binance.Order { } = order ) do
104+ % {
105+ struct (
106+ Binance.OrderResponse ,
107+ order |> Map . to_list ( )
108+ )
109+ | transact_time: order . time
110+ }
111+ end
112+
54113 def handle_cast (
55114 { :add_order , % Binance.Order { symbol: symbol } = order } ,
56115 % State { order_books: order_books , subscriptions: subscriptions } = state
@@ -104,7 +163,7 @@ defmodule BinanceMock do
104163 |> Enum . drop ( length ( filled_sell_orders ) )
105164
106165 order_books =
107- Map . replace ( order_books , :"#{ trade_event . symbol } " , % {
166+ Map . replace! ( order_books , :"#{ trade_event . symbol } " , % {
108167 buy_side: remaining_buy_orders ,
109168 sell_side: remaining_sell_orders ,
110169 historical: filled_buy_orders ++ filled_sell_orders ++ order_book . historical
@@ -114,7 +173,10 @@ defmodule BinanceMock do
114173 end
115174
116175 defp order_limit ( symbol , quantity , price , side ) do
117- % Binance.Order { } = fake_order = generate_fake_order ( symbol , quantity , price , side )
176+ % Binance.Order { } =
177+ fake_order =
178+ generate_fake_order ( GenServer . call ( __MODULE__ , :generate_id ) , symbol , quantity , price , side )
179+
118180 GenServer . cast ( __MODULE__ , { :add_order , fake_order } )
119181 { :ok , convert_order_to_order_response ( fake_order ) }
120182 end
@@ -159,43 +221,6 @@ defmodule BinanceMock do
159221 Map . put ( order_books , :"#{ symbol } " , order_book )
160222 end
161223
162- defp generate_fake_order ( symbol , quantity , price , side )
163- when is_binary ( symbol ) and is_binary ( quantity ) and is_binary ( price ) and
164- ( side == "BUY" or side == "SELL" ) do
165- current_timestamp = :os . system_time ( :millisecond )
166- order_id = GenServer . call ( __MODULE__ , :generate_id )
167- client_order_id = :crypto . hash ( :md5 , "#{ order_id } " ) |> Base . encode16 ( )
168-
169- Binance.Order . new ( % {
170- symbol: symbol ,
171- order_id: order_id ,
172- client_order_id: client_order_id ,
173- price: price ,
174- orig_qty: quantity ,
175- executed_qty: "0.00000000" ,
176- cummulative_quote_qty: "0.00000000" ,
177- status: "NEW" ,
178- time_in_force: "GTC" ,
179- type: "LIMIT" ,
180- side: side ,
181- stop_price: "0.00000000" ,
182- iceberg_qty: "0.00000000" ,
183- time: current_timestamp ,
184- update_time: current_timestamp ,
185- is_working: true
186- } )
187- end
188-
189- defp convert_order_to_order_response ( % Binance.Order { } = order ) do
190- % {
191- struct (
192- Binance.OrderResponse ,
193- order |> Map . to_list ( )
194- )
195- | transact_time: order . time
196- }
197- end
198-
199224 defp convert_order_to_event ( % Binance.Order { } = order , time ) do
200225 % TradeEvent {
201226 event_type: order . type ,
0 commit comments