Skip to content

Commit

Permalink
Merge branch 'staggered-orders-mcp-merge-fix'
Browse files Browse the repository at this point in the history
  • Loading branch information
mikakoi committed Jun 15, 2018
2 parents b5b70ba + bac12af commit 09c80a7
Show file tree
Hide file tree
Showing 7 changed files with 190 additions and 66 deletions.
2 changes: 1 addition & 1 deletion dexbot/__init__.py
@@ -1,4 +1,4 @@
APP_NAME = 'dexbot'
VERSION = '0.4.5'
VERSION = '0.4.6'
AUTHOR = 'Codaone Oy'
__version__ = VERSION
50 changes: 27 additions & 23 deletions dexbot/basestrategy.py
Expand Up @@ -186,7 +186,7 @@ def __init__(
logging.getLogger('dexbot.orders_log'), {}
)

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

def calculate_offset_center_price(self, spread, center_price=None, order_ids=None, manual_offset=0):
def calculate_center_price(self, center_price=None,
asset_offset=False, spread=None, order_ids=None, manual_offset=0):
""" Calculate center price which shifts based on available funds
"""
if center_price is None:
# No center price was given so we simply calculate the center price
calculated_center_price = self.calculate_center_price()
center_price = calculated_center_price
calculated_center_price = self._calculate_center_price()
else:
# Center price was given so we only use the calculated center price
# for quote to base asset conversion
calculated_center_price = self.calculate_center_price(True)
calculated_center_price = self._calculate_center_price(True)
if not calculated_center_price:
calculated_center_price = center_price

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

if not total: # Prevent division by zero
balance = 0
else:
# Returns a value between -1 and 1
balance = (total_balance['base'] / total) * 2 - 1

if balance < 0:
# With less of base asset center price should be offset downward
offset_center_price = calculated_center_price / math.sqrt(1 + spread * (balance * -1))
elif balance > 0:
# With more of base asset center price will be offset upwards
offset_center_price = calculated_center_price * math.sqrt(1 + spread * balance)
else:
offset_center_price = calculated_center_price
if asset_offset:
total_balance = self.total_balance(order_ids)
total = (total_balance['quote'] * calculated_center_price) + total_balance['base']

if not total: # Prevent division by zero
balance = 0
else:
# Returns a value between -1 and 1
balance = (total_balance['base'] / total) * 2 - 1

if balance < 0:
# With less of base asset center price should be offset downward
calculated_center_price = calculated_center_price / math.sqrt(1 + spread * (balance * -1))
elif balance > 0:
# With more of base asset center price will be offset upwards
calculated_center_price = calculated_center_price * math.sqrt(1 + spread * balance)
else:
calculated_center_price = calculated_center_price

# Calculate final_offset_price if manual center price offset is given
if manual_offset:
offset_center_price = center_price + (center_price * manual_offset)
calculated_center_price = calculated_center_price + (calculated_center_price * manual_offset)

return offset_center_price
return calculated_center_price

@property
def orders(self):
Expand Down
10 changes: 10 additions & 0 deletions dexbot/controllers/strategy_controller.py
Expand Up @@ -115,6 +115,14 @@ def set_config_values(self, worker_data):
widget.lower_bound_input.setValue(worker_data.get('lower_bound', 0.000001))
widget.upper_bound_input.setValue(worker_data.get('upper_bound', 1000000))

self.view.strategy_widget.center_price_input.setValue(worker_data.get('center_price', 0))

if worker_data.get('center_price_dynamic', True):
self.view.strategy_widget.center_price_dynamic_checkbox.setChecked(True)
else:
self.view.strategy_widget.center_price_dynamic_checkbox.setChecked(False)
self.view.strategy_widget.center_price_input.setDisabled(False)

@gui_error
def on_value_change(self):
base_asset = self.worker_controller.view.base_asset_input.currentText()
Expand Down Expand Up @@ -173,6 +181,8 @@ def values(self):
data = {
'amount': self.view.strategy_widget.amount_input.value(),
'spread': self.view.strategy_widget.spread_input.value(),
'center_price': self.view.strategy_widget.center_price_input.value(),
'center_price_dynamic': self.view.strategy_widget.center_price_dynamic_checkbox.isChecked(),
'increment': self.view.strategy_widget.increment_input.value(),
'lower_bound': self.view.strategy_widget.lower_bound_input.value(),
'upper_bound': self.view.strategy_widget.upper_bound_input.value()
Expand Down
25 changes: 16 additions & 9 deletions dexbot/strategies/relative_orders.py
Expand Up @@ -46,7 +46,8 @@ def __init__(self, *args, **kwargs):
self.center_price = self.worker["center_price"]

self.is_relative_order_size = self.worker['amount_relative']
self.is_center_price_offset = self.worker.get('center_price_offset', False)
self.is_asset_offset = self.worker.get('center_price_offset', False)
self.manual_offset = self.worker.get('manual_offset', 0) / 100
self.order_size = float(self.worker['amount'])
self.spread = self.worker.get('spread') / 100

Expand Down Expand Up @@ -85,15 +86,21 @@ def amount_base(self):

def calculate_order_prices(self):
if self.is_center_price_dynamic:
if self.is_center_price_offset:
self.center_price = self.calculate_offset_center_price(
self.spread, order_ids=self['order_ids'])
else:
self.center_price = self.calculate_center_price()
self.center_price = self.calculate_center_price(
None,
self.is_asset_offset,
self.spread,
self['order_ids'],
self.manual_offset
)
else:
if self.is_center_price_offset:
self.center_price = self.calculate_offset_center_price(
self.spread, self.center_price, self['order_ids'])
self.center_price = self.calculate_center_price(
self.center_price,
self.is_asset_offset,
self.spread,
self['order_ids'],
self.manual_offset
)

self.buy_price = self.center_price / math.sqrt(1 + self.spread)
self.sell_price = self.center_price * math.sqrt(1 + self.spread)
Expand Down
13 changes: 12 additions & 1 deletion dexbot/strategies/staggered_orders.py
Expand Up @@ -16,6 +16,12 @@ def configure(cls):
ConfigElement(
'amount', 'float', 1.0,
'The amount of buy/sell orders', (0.0, None)),
ConfigElement(
'center_price_dynamic', 'bool', True,
'Dynamic centre price', None),
ConfigElement(
'center_price', 'float', 0.0,
'Initial center price', (0, 0, None)),
ConfigElement(
'spread', 'float', 6.0,
'The percentage difference between buy and sell (Spread)', (0.0, None)),
Expand Down Expand Up @@ -73,7 +79,12 @@ def init_strategy(self):
self.cancel_all()
self.clear_orders()

center_price = self.calculate_center_price()
# Dynamic / Manual center price
if self.worker.get('center_price_dynamic', True):
center_price = self.calculate_center_price()
else:
center_price = self.worker.get('center_price')

amount = self.amount
spread = self.spread
increment = self.increment
Expand Down
2 changes: 1 addition & 1 deletion dexbot/views/ui/forms/relative_orders_widget.ui
Expand Up @@ -158,7 +158,7 @@
<number>8</number>
</property>
<property name="minimum">
<double>-999999999.998999953269958</double>
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.998999953269958</double>
Expand Down
154 changes: 123 additions & 31 deletions dexbot/views/ui/forms/staggered_orders_widget.ui
Expand Up @@ -32,6 +32,65 @@
<string>Worker Parameters</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="amount_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>110</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>110</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Amount</string>
</property>
<property name="buddy">
<cstring>spread_input</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="amount_input">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>151</width>
<height>0</height>
</size>
</property>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="suffix">
<string/>
</property>
<property name="decimals">
<number>8</number>
</property>
<property name="maximum">
<double>100000.000000000000000</double>
</property>
<property name="value">
<double>0.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="spread_label">
<property name="sizePolicy">
Expand Down Expand Up @@ -200,7 +259,7 @@
</property>
</widget>
</item>
<item row="5" column="0">
<item row="9" column="0">
<widget class="QLabel" name="upper_bound_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
Expand Down Expand Up @@ -228,7 +287,7 @@
</property>
</widget>
</item>
<item row="5" column="1">
<item row="9" column="1">
<widget class="QDoubleSpinBox" name="upper_bound_input">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
Expand Down Expand Up @@ -256,62 +315,78 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="amount_input">
<item row="6" column="0">
<widget class="QLabel" name="center_price_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>151</width>
<width>110</width>
<height>0</height>
</size>
</property>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="suffix">
<string/>
</property>
<property name="decimals">
<number>8</number>
<property name="maximumSize">
<size>
<width>110</width>
<height>16777215</height>
</size>
</property>
<property name="maximum">
<double>100000.000000000000000</double>
<property name="text">
<string>Center Price</string>
</property>
<property name="value">
<double>0.000000000000000</double>
<property name="buddy">
<cstring>center_price_input</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="amount_label">
<item row="6" column="1">
<widget class="QDoubleSpinBox" name="center_price_input">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>110</width>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>110</width>
<height>16777215</height>
</size>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="accelerated">
<bool>false</bool>
</property>
<property name="showGroupSeparator" stdset="0">
<bool>false</bool>
</property>
<property name="decimals">
<number>8</number>
</property>
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.998999953269958</double>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QCheckBox" name="center_price_dynamic_checkbox">
<property name="text">
<string>Amount</string>
<string>Calculate center price dynamically</string>
</property>
<property name="buddy">
<cstring>spread_input</cstring>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
Expand Down Expand Up @@ -376,5 +451,22 @@
</layout>
</widget>
<resources/>
<connections/>
<connections>
<connection>
<sender>center_price_dynamic_checkbox</sender>
<signal>clicked(bool)</signal>
<receiver>center_price_input</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>252</x>
<y>165</y>
</hint>
<hint type="destinationlabel">
<x>208</x>
<y>136</y>
</hint>
</hints>
</connection>
</connections>
</ui>

0 comments on commit 09c80a7

Please sign in to comment.