Merge pull request #26 from gcarq/bid-balance

Set balance for bid price between ask and last
This commit is contained in:
Janne Sinivirta 2017-09-20 07:58:20 -07:00 committed by GitHub
commit 2bd51d8be3
6 changed files with 47 additions and 3 deletions

View File

@ -44,6 +44,9 @@ profit dips below -10% for a given trade. This parameter is optional.
Possible values are `running` or `stopped`. (default=`running`) Possible values are `running` or `stopped`. (default=`running`)
If the value is `stopped` the bot has to be started with `/start` first. If the value is `stopped` the bot has to be started with `/start` first.
`ask_last_balance` sets the bidding price. Value `0.0` will use `ask` price, `1.0` will
use the `last` price and values between those interpolate between ask and last price. Using `ask` price will guarantee quick success in bid, but bot will also end up paying more then would probably have been necessary.
The other values should be self-explanatory, The other values should be self-explanatory,
if not feel free to raise a github issue. if not feel free to raise a github issue.

View File

@ -9,6 +9,9 @@
"0": 0.02 "0": 0.02
}, },
"stoploss": -0.10, "stoploss": -0.10,
"bid_strategy": {
"ask_last_balance": 0.0
},
"bittrex": { "bittrex": {
"enabled": true, "enabled": true,
"key": "key", "key": "key",

11
main.py
View File

@ -4,7 +4,7 @@ import logging
import time import time
import traceback import traceback
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Dict, Optional
from jsonschema import validate from jsonschema import validate
@ -138,6 +138,13 @@ def handle_trade(trade: Trade) -> None:
except ValueError: except ValueError:
logger.exception('Unable to handle open order') logger.exception('Unable to handle open order')
def get_target_bid(ticker: Dict[str, float]) -> float:
""" Calculates bid target between current ask price and last price """
if ticker['ask'] < ticker['last']:
return ticker['ask']
balance = _CONF['bid_strategy']['ask_last_balance']
return ticker['ask'] + balance * (ticker['last'] - ticker['ask'])
def create_trade(stake_amount: float, _exchange: exchange.Exchange) -> Optional[Trade]: def create_trade(stake_amount: float, _exchange: exchange.Exchange) -> Optional[Trade]:
""" """
@ -174,7 +181,7 @@ def create_trade(stake_amount: float, _exchange: exchange.Exchange) -> Optional[
else: else:
return None return None
open_rate = exchange.get_ticker(pair)['ask'] open_rate = get_target_bid(exchange.get_ticker(pair))
amount = stake_amount / open_rate amount = stake_amount / open_rate
order_id = exchange.buy(pair, open_rate, amount) order_id = exchange.buy(pair, open_rate, amount)

13
misc.py
View File

@ -48,6 +48,18 @@ CONF_SCHEMA = {
'minProperties': 1 'minProperties': 1
}, },
'stoploss': {'type': 'number', 'maximum': 0, 'exclusiveMaximum': True}, 'stoploss': {'type': 'number', 'maximum': 0, 'exclusiveMaximum': True},
'bid_strategy': {
'type': 'object',
'properties': {
'ask_last_balance': {
'type': 'number',
'minimum': 0,
'maximum': 1,
'exclusiveMaximum': False
},
},
'required': ['ask_last_balance']
},
'bittrex': {'$ref': '#/definitions/exchange'}, 'bittrex': {'$ref': '#/definitions/exchange'},
'telegram': { 'telegram': {
'type': 'object', 'type': 'object',
@ -85,6 +97,7 @@ CONF_SCHEMA = {
'stake_amount', 'stake_amount',
'dry_run', 'dry_run',
'minimal_roi', 'minimal_roi',
'bid_strategy',
'telegram' 'telegram'
] ]
} }

View File

@ -4,7 +4,7 @@ from unittest.mock import patch, MagicMock
from jsonschema import validate from jsonschema import validate
import exchange import exchange
from main import create_trade, handle_trade, close_trade_if_fulfilled, init from main import create_trade, handle_trade, close_trade_if_fulfilled, init, get_target_bid
from misc import CONF_SCHEMA from misc import CONF_SCHEMA
from persistence import Trade from persistence import Trade
@ -20,6 +20,9 @@ class TestMain(unittest.TestCase):
"720": 0.01, "720": 0.01,
"0": 0.02 "0": 0.02
}, },
"bid_strategy": {
"ask_last_balance": 0.0
},
"bittrex": { "bittrex": {
"enabled": True, "enabled": True,
"key": "key", "key": "key",
@ -90,6 +93,18 @@ class TestMain(unittest.TestCase):
self.assertTrue(closed) self.assertTrue(closed)
self.assertEqual(trade.is_open, False) self.assertEqual(trade.is_open, False)
def test_balance_fully_ask_side(self):
with patch.dict('main._CONF', {'bid_strategy': {'ask_last_balance': 0.0}}):
self.assertEqual(get_target_bid({'ask': 20, 'last': 10}), 20)
def test_balance_fully_last_side(self):
with patch.dict('main._CONF', {'bid_strategy': {'ask_last_balance': 1.0}}):
self.assertEqual(get_target_bid({'ask': 20, 'last': 10}), 10)
def test_balance_when_last_bigger_than_ask(self):
with patch.dict('main._CONF', {'bid_strategy': {'ask_last_balance': 1.0}}):
self.assertEqual(get_target_bid({'ask': 5, 'last': 10}), 5)
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
validate(cls.conf, CONF_SCHEMA) validate(cls.conf, CONF_SCHEMA)

View File

@ -28,6 +28,9 @@ class TestTelegram(unittest.TestCase):
"720": 0.01, "720": 0.01,
"0": 0.02 "0": 0.02
}, },
"bid_strategy": {
"ask_last_balance": 0.0
},
"bittrex": { "bittrex": {
"enabled": True, "enabled": True,
"key": "key", "key": "key",