Skip to content

Commit 09c80a7

Browse files
committed
Merge branch 'staggered-orders-mcp-merge-fix'
2 parents b5b70ba + bac12af commit 09c80a7

File tree

7 files changed

+190
-66
lines changed

7 files changed

+190
-66
lines changed

dexbot/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
APP_NAME = 'dexbot'
2-
VERSION = '0.4.5'
2+
VERSION = '0.4.6'
33
AUTHOR = 'Codaone Oy'
44
__version__ = VERSION

dexbot/basestrategy.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def __init__(
186186
logging.getLogger('dexbot.orders_log'), {}
187187
)
188188

189-
def calculate_center_price(self, suppress_errors=False):
189+
def _calculate_center_price(self, suppress_errors=False):
190190
ticker = self.market.ticker()
191191
highest_bid = ticker.get("highestBid")
192192
lowest_ask = ticker.get("lowestAsk")
@@ -208,43 +208,47 @@ def calculate_center_price(self, suppress_errors=False):
208208
center_price = highest_bid['price'] * math.sqrt(lowest_ask['price'] / highest_bid['price'])
209209
return center_price
210210

211-
def calculate_offset_center_price(self, spread, center_price=None, order_ids=None, manual_offset=0):
211+
def calculate_center_price(self, center_price=None,
212+
asset_offset=False, spread=None, order_ids=None, manual_offset=0):
212213
""" Calculate center price which shifts based on available funds
213214
"""
214215
if center_price is None:
215216
# No center price was given so we simply calculate the center price
216-
calculated_center_price = self.calculate_center_price()
217-
center_price = calculated_center_price
217+
calculated_center_price = self._calculate_center_price()
218218
else:
219219
# Center price was given so we only use the calculated center price
220220
# for quote to base asset conversion
221-
calculated_center_price = self.calculate_center_price(True)
221+
calculated_center_price = self._calculate_center_price(True)
222222
if not calculated_center_price:
223223
calculated_center_price = center_price
224224

225-
total_balance = self.total_balance(order_ids)
226-
total = (total_balance['quote'] * calculated_center_price) + total_balance['base']
225+
if center_price:
226+
calculated_center_price = center_price
227227

228-
if not total: # Prevent division by zero
229-
balance = 0
230-
else:
231-
# Returns a value between -1 and 1
232-
balance = (total_balance['base'] / total) * 2 - 1
233-
234-
if balance < 0:
235-
# With less of base asset center price should be offset downward
236-
offset_center_price = calculated_center_price / math.sqrt(1 + spread * (balance * -1))
237-
elif balance > 0:
238-
# With more of base asset center price will be offset upwards
239-
offset_center_price = calculated_center_price * math.sqrt(1 + spread * balance)
240-
else:
241-
offset_center_price = calculated_center_price
228+
if asset_offset:
229+
total_balance = self.total_balance(order_ids)
230+
total = (total_balance['quote'] * calculated_center_price) + total_balance['base']
231+
232+
if not total: # Prevent division by zero
233+
balance = 0
234+
else:
235+
# Returns a value between -1 and 1
236+
balance = (total_balance['base'] / total) * 2 - 1
237+
238+
if balance < 0:
239+
# With less of base asset center price should be offset downward
240+
calculated_center_price = calculated_center_price / math.sqrt(1 + spread * (balance * -1))
241+
elif balance > 0:
242+
# With more of base asset center price will be offset upwards
243+
calculated_center_price = calculated_center_price * math.sqrt(1 + spread * balance)
244+
else:
245+
calculated_center_price = calculated_center_price
242246

243247
# Calculate final_offset_price if manual center price offset is given
244248
if manual_offset:
245-
offset_center_price = center_price + (center_price * manual_offset)
249+
calculated_center_price = calculated_center_price + (calculated_center_price * manual_offset)
246250

247-
return offset_center_price
251+
return calculated_center_price
248252

249253
@property
250254
def orders(self):

dexbot/controllers/strategy_controller.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ def set_config_values(self, worker_data):
115115
widget.lower_bound_input.setValue(worker_data.get('lower_bound', 0.000001))
116116
widget.upper_bound_input.setValue(worker_data.get('upper_bound', 1000000))
117117

118+
self.view.strategy_widget.center_price_input.setValue(worker_data.get('center_price', 0))
119+
120+
if worker_data.get('center_price_dynamic', True):
121+
self.view.strategy_widget.center_price_dynamic_checkbox.setChecked(True)
122+
else:
123+
self.view.strategy_widget.center_price_dynamic_checkbox.setChecked(False)
124+
self.view.strategy_widget.center_price_input.setDisabled(False)
125+
118126
@gui_error
119127
def on_value_change(self):
120128
base_asset = self.worker_controller.view.base_asset_input.currentText()
@@ -173,6 +181,8 @@ def values(self):
173181
data = {
174182
'amount': self.view.strategy_widget.amount_input.value(),
175183
'spread': self.view.strategy_widget.spread_input.value(),
184+
'center_price': self.view.strategy_widget.center_price_input.value(),
185+
'center_price_dynamic': self.view.strategy_widget.center_price_dynamic_checkbox.isChecked(),
176186
'increment': self.view.strategy_widget.increment_input.value(),
177187
'lower_bound': self.view.strategy_widget.lower_bound_input.value(),
178188
'upper_bound': self.view.strategy_widget.upper_bound_input.value()

dexbot/strategies/relative_orders.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ def __init__(self, *args, **kwargs):
4646
self.center_price = self.worker["center_price"]
4747

4848
self.is_relative_order_size = self.worker['amount_relative']
49-
self.is_center_price_offset = self.worker.get('center_price_offset', False)
49+
self.is_asset_offset = self.worker.get('center_price_offset', False)
50+
self.manual_offset = self.worker.get('manual_offset', 0) / 100
5051
self.order_size = float(self.worker['amount'])
5152
self.spread = self.worker.get('spread') / 100
5253

@@ -85,15 +86,21 @@ def amount_base(self):
8586

8687
def calculate_order_prices(self):
8788
if self.is_center_price_dynamic:
88-
if self.is_center_price_offset:
89-
self.center_price = self.calculate_offset_center_price(
90-
self.spread, order_ids=self['order_ids'])
91-
else:
92-
self.center_price = self.calculate_center_price()
89+
self.center_price = self.calculate_center_price(
90+
None,
91+
self.is_asset_offset,
92+
self.spread,
93+
self['order_ids'],
94+
self.manual_offset
95+
)
9396
else:
94-
if self.is_center_price_offset:
95-
self.center_price = self.calculate_offset_center_price(
96-
self.spread, self.center_price, self['order_ids'])
97+
self.center_price = self.calculate_center_price(
98+
self.center_price,
99+
self.is_asset_offset,
100+
self.spread,
101+
self['order_ids'],
102+
self.manual_offset
103+
)
97104

98105
self.buy_price = self.center_price / math.sqrt(1 + self.spread)
99106
self.sell_price = self.center_price * math.sqrt(1 + self.spread)

dexbot/strategies/staggered_orders.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ def configure(cls):
1616
ConfigElement(
1717
'amount', 'float', 1.0,
1818
'The amount of buy/sell orders', (0.0, None)),
19+
ConfigElement(
20+
'center_price_dynamic', 'bool', True,
21+
'Dynamic centre price', None),
22+
ConfigElement(
23+
'center_price', 'float', 0.0,
24+
'Initial center price', (0, 0, None)),
1925
ConfigElement(
2026
'spread', 'float', 6.0,
2127
'The percentage difference between buy and sell (Spread)', (0.0, None)),
@@ -73,7 +79,12 @@ def init_strategy(self):
7379
self.cancel_all()
7480
self.clear_orders()
7581

76-
center_price = self.calculate_center_price()
82+
# Dynamic / Manual center price
83+
if self.worker.get('center_price_dynamic', True):
84+
center_price = self.calculate_center_price()
85+
else:
86+
center_price = self.worker.get('center_price')
87+
7788
amount = self.amount
7889
spread = self.spread
7990
increment = self.increment

dexbot/views/ui/forms/relative_orders_widget.ui

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@
158158
<number>8</number>
159159
</property>
160160
<property name="minimum">
161-
<double>-999999999.998999953269958</double>
161+
<double>0.000000000000000</double>
162162
</property>
163163
<property name="maximum">
164164
<double>999999999.998999953269958</double>

dexbot/views/ui/forms/staggered_orders_widget.ui

Lines changed: 123 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,65 @@
3232
<string>Worker Parameters</string>
3333
</property>
3434
<layout class="QFormLayout" name="formLayout">
35+
<item row="0" column="0">
36+
<widget class="QLabel" name="amount_label">
37+
<property name="sizePolicy">
38+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
39+
<horstretch>0</horstretch>
40+
<verstretch>0</verstretch>
41+
</sizepolicy>
42+
</property>
43+
<property name="minimumSize">
44+
<size>
45+
<width>110</width>
46+
<height>0</height>
47+
</size>
48+
</property>
49+
<property name="maximumSize">
50+
<size>
51+
<width>110</width>
52+
<height>16777215</height>
53+
</size>
54+
</property>
55+
<property name="text">
56+
<string>Amount</string>
57+
</property>
58+
<property name="buddy">
59+
<cstring>spread_input</cstring>
60+
</property>
61+
</widget>
62+
</item>
63+
<item row="0" column="1">
64+
<widget class="QDoubleSpinBox" name="amount_input">
65+
<property name="sizePolicy">
66+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
67+
<horstretch>0</horstretch>
68+
<verstretch>0</verstretch>
69+
</sizepolicy>
70+
</property>
71+
<property name="minimumSize">
72+
<size>
73+
<width>151</width>
74+
<height>0</height>
75+
</size>
76+
</property>
77+
<property name="locale">
78+
<locale language="English" country="UnitedStates"/>
79+
</property>
80+
<property name="suffix">
81+
<string/>
82+
</property>
83+
<property name="decimals">
84+
<number>8</number>
85+
</property>
86+
<property name="maximum">
87+
<double>100000.000000000000000</double>
88+
</property>
89+
<property name="value">
90+
<double>0.000000000000000</double>
91+
</property>
92+
</widget>
93+
</item>
3594
<item row="1" column="0">
3695
<widget class="QLabel" name="spread_label">
3796
<property name="sizePolicy">
@@ -200,7 +259,7 @@
200259
</property>
201260
</widget>
202261
</item>
203-
<item row="5" column="0">
262+
<item row="9" column="0">
204263
<widget class="QLabel" name="upper_bound_label">
205264
<property name="sizePolicy">
206265
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
@@ -228,7 +287,7 @@
228287
</property>
229288
</widget>
230289
</item>
231-
<item row="5" column="1">
290+
<item row="9" column="1">
232291
<widget class="QDoubleSpinBox" name="upper_bound_input">
233292
<property name="sizePolicy">
234293
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -256,62 +315,78 @@
256315
</property>
257316
</widget>
258317
</item>
259-
<item row="0" column="1">
260-
<widget class="QDoubleSpinBox" name="amount_input">
318+
<item row="6" column="0">
319+
<widget class="QLabel" name="center_price_label">
261320
<property name="sizePolicy">
262-
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
321+
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
263322
<horstretch>0</horstretch>
264323
<verstretch>0</verstretch>
265324
</sizepolicy>
266325
</property>
267326
<property name="minimumSize">
268327
<size>
269-
<width>151</width>
328+
<width>110</width>
270329
<height>0</height>
271330
</size>
272331
</property>
273-
<property name="locale">
274-
<locale language="English" country="UnitedStates"/>
275-
</property>
276-
<property name="suffix">
277-
<string/>
278-
</property>
279-
<property name="decimals">
280-
<number>8</number>
332+
<property name="maximumSize">
333+
<size>
334+
<width>110</width>
335+
<height>16777215</height>
336+
</size>
281337
</property>
282-
<property name="maximum">
283-
<double>100000.000000000000000</double>
338+
<property name="text">
339+
<string>Center Price</string>
284340
</property>
285-
<property name="value">
286-
<double>0.000000000000000</double>
341+
<property name="buddy">
342+
<cstring>center_price_input</cstring>
287343
</property>
288344
</widget>
289345
</item>
290-
<item row="0" column="0">
291-
<widget class="QLabel" name="amount_label">
346+
<item row="6" column="1">
347+
<widget class="QDoubleSpinBox" name="center_price_input">
348+
<property name="enabled">
349+
<bool>false</bool>
350+
</property>
292351
<property name="sizePolicy">
293-
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
352+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
294353
<horstretch>0</horstretch>
295354
<verstretch>0</verstretch>
296355
</sizepolicy>
297356
</property>
298357
<property name="minimumSize">
299358
<size>
300-
<width>110</width>
359+
<width>140</width>
301360
<height>0</height>
302361
</size>
303362
</property>
304-
<property name="maximumSize">
305-
<size>
306-
<width>110</width>
307-
<height>16777215</height>
308-
</size>
363+
<property name="locale">
364+
<locale language="English" country="UnitedStates"/>
365+
</property>
366+
<property name="accelerated">
367+
<bool>false</bool>
309368
</property>
369+
<property name="showGroupSeparator" stdset="0">
370+
<bool>false</bool>
371+
</property>
372+
<property name="decimals">
373+
<number>8</number>
374+
</property>
375+
<property name="minimum">
376+
<double>0.000000000000000</double>
377+
</property>
378+
<property name="maximum">
379+
<double>999999999.998999953269958</double>
380+
</property>
381+
</widget>
382+
</item>
383+
<item row="8" column="1">
384+
<widget class="QCheckBox" name="center_price_dynamic_checkbox">
310385
<property name="text">
311-
<string>Amount</string>
386+
<string>Calculate center price dynamically</string>
312387
</property>
313-
<property name="buddy">
314-
<cstring>spread_input</cstring>
388+
<property name="checked">
389+
<bool>true</bool>
315390
</property>
316391
</widget>
317392
</item>
@@ -376,5 +451,22 @@
376451
</layout>
377452
</widget>
378453
<resources/>
379-
<connections/>
454+
<connections>
455+
<connection>
456+
<sender>center_price_dynamic_checkbox</sender>
457+
<signal>clicked(bool)</signal>
458+
<receiver>center_price_input</receiver>
459+
<slot>setDisabled(bool)</slot>
460+
<hints>
461+
<hint type="sourcelabel">
462+
<x>252</x>
463+
<y>165</y>
464+
</hint>
465+
<hint type="destinationlabel">
466+
<x>208</x>
467+
<y>136</y>
468+
</hint>
469+
</hints>
470+
</connection>
471+
</connections>
380472
</ui>

0 commit comments

Comments
 (0)