@@ -63,4 +63,189 @@ defmodule Naive.StrategyTest do
6363 % { buy_order: buy_order } = List . first ( new_positions )
6464 assert buy_order == expected_order
6565 end
66+
67+ @ tag :unit
68+ test "Generating place buy order decision" do
69+ assert Strategy . generate_decision (
70+ % TradeEvent {
71+ price: "1.0"
72+ } ,
73+ generate_position ( % { budget: "10.0" , buy_down_interval: "0.01" } ) ,
74+ :ignored ,
75+ :ignored
76+ ) == { :place_buy_order , "0.99000000" , "10.00000000" }
77+ end
78+
79+ @ tag :unit
80+ test "Generating skip decision as buy and sell already placed(race condition ocurred)" do
81+ assert Strategy . generate_decision (
82+ % TradeEvent {
83+ buyer_order_id: 123
84+ } ,
85+ generate_position ( % {
86+ buy_order: % Binance.OrderResponse {
87+ order_id: 123 ,
88+ status: "FILLED"
89+ } ,
90+ sell_order: % Binance.OrderResponse { }
91+ } ) ,
92+ :ignored ,
93+ :ignored
94+ ) == :skip
95+ end
96+
97+ @ tag :unit
98+ test "Generate place sell order decision" do
99+ assert Strategy . generate_decision (
100+ % TradeEvent { } ,
101+ generate_position ( % {
102+ buy_order: % Binance.OrderResponse {
103+ status: "FILLED" ,
104+ price: "1.00"
105+ } ,
106+ sell_order: nil ,
107+ profit_interval: "0.01" ,
108+ tick_size: "0.0001"
109+ } ) ,
110+ :ignored ,
111+ :ignored
112+ ) == { :place_sell_order , "1.0120" }
113+ end
114+
115+ @ tag :unit
116+ test "Generating fetch buy order decision" do
117+ assert Strategy . generate_decision (
118+ % TradeEvent { buyer_order_id: 1234 } ,
119+ generate_position ( % {
120+ buy_order: % Binance.OrderResponse {
121+ order_id: 1234
122+ }
123+ } ) ,
124+ :ignored ,
125+ :ignored
126+ ) == :fetch_buy_order
127+ end
128+
129+ @ tag :unit
130+ test "Generating finish position decision" do
131+ assert Strategy . generate_decision (
132+ % TradeEvent { } ,
133+ generate_position ( % {
134+ buy_order: % Binance.OrderResponse {
135+ status: "FILLED"
136+ } ,
137+ sell_order: % Binance.OrderResponse {
138+ status: "FILLED"
139+ }
140+ } ) ,
141+ :ignored ,
142+ % { status: "on" }
143+ ) == :finished
144+ end
145+
146+ @ tag :unit
147+ test "Generating exit position decision" do
148+ assert Strategy . generate_decision (
149+ % TradeEvent { } ,
150+ generate_position ( % {
151+ buy_order: % Binance.OrderResponse {
152+ status: "FILLED"
153+ } ,
154+ sell_order: % Binance.OrderResponse {
155+ status: "FILLED"
156+ }
157+ } ) ,
158+ :ignored ,
159+ % { status: "shutdown" }
160+ ) == :exit
161+ end
162+
163+ @ tag :unit
164+ test "Generating fetch sell order decision" do
165+ assert Strategy . generate_decision (
166+ % TradeEvent {
167+ seller_order_id: 1234
168+ } ,
169+ generate_position ( % {
170+ buy_order: % Binance.OrderResponse { } ,
171+ sell_order: % Binance.OrderResponse {
172+ order_id: 1234
173+ }
174+ } ) ,
175+ :ignored ,
176+ :ignored
177+ ) == :fetch_sell_order
178+ end
179+
180+ @ tag :unit
181+ test "Generating rebuy decision" do
182+ assert Strategy . generate_decision (
183+ % TradeEvent {
184+ price: "0.89"
185+ } ,
186+ generate_position ( % {
187+ buy_order: % Binance.OrderResponse {
188+ price: "1.00"
189+ } ,
190+ rebuy_interval: "0.1" ,
191+ rebuy_notified: false
192+ } ) ,
193+ [ :position ] ,
194+ % { status: "on" , chunks: 2 }
195+ ) == :rebuy
196+ end
197+
198+ @ tag :unit
199+ test "Generating skip (rebuy) decision because rebuy is already notified" do
200+ assert Strategy . generate_decision (
201+ % TradeEvent {
202+ price: "0.89"
203+ } ,
204+ generate_position ( % {
205+ buy_order: % Binance.OrderResponse {
206+ price: "1.00"
207+ } ,
208+ rebuy_interval: "0.1" ,
209+ rebuy_notified: true
210+ } ) ,
211+ [ :position ] ,
212+ % { status: "on" , chunks: 2 }
213+ ) == :skip
214+ end
215+
216+ @ tag :unit
217+ test "Generating skip rebuy decision" do
218+ assert Strategy . generate_decision (
219+ % TradeEvent {
220+ price: "0.9"
221+ } ,
222+ generate_position ( % {
223+ buy_order: % Binance.OrderResponse {
224+ price: "1.00"
225+ } ,
226+ rebuy_interval: "0.1" ,
227+ rebuy_notified: false
228+ } ) ,
229+ [ :position ] ,
230+ % { status: "on" , chunks: 1 }
231+ ) == :skip
232+ end
233+
234+ defp generate_position ( data ) do
235+ % {
236+ id: 1_234_456_789_101 ,
237+ symbol: "XRPUSDT" ,
238+ profit_interval: "0.005" ,
239+ rebuy_interval: "0.01" ,
240+ rebuy_notified: false ,
241+ budget: "10.0" ,
242+ buy_order: nil ,
243+ sell_order: nil ,
244+ buy_down_interval: "0.01" ,
245+ tick_size: "0.00010000" ,
246+ step_size: "1.00000000"
247+ }
248+ |> Map . merge ( data )
249+ |> then ( & struct ( Strategy.Position , & 1 ) )
250+ end
66251end
0 commit comments