Skip to content

Commit 775ab69

Browse files
authored
Chapter 22 (#25)
* finishing transcribing * comparing against franton
1 parent cba5340 commit 775ab69

3 files changed

Lines changed: 185 additions & 8 deletions

File tree

apps/core/test/core_test.exs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
defmodule CoreTest do
22
use ExUnit.Case
33
doctest Core
4-
5-
test "greets the world" do
6-
assert Core.hello() == :world
7-
end
84
end
Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
defmodule IndicatorTest do
22
use ExUnit.Case
33
doctest Indicator
4-
5-
test "greets the world" do
6-
assert Indicator.hello() == :world
7-
end
84
end

apps/naive/test/naive/strategy_test.exs

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 occurred)" 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
66251
end

0 commit comments

Comments
 (0)