experimental depth of market check prior to buying
This commit is contained in:
@@ -11,7 +11,7 @@ import pandas as pd
|
||||
from pandas import DataFrame, to_datetime
|
||||
|
||||
from freqtrade import constants
|
||||
from freqtrade.exchange import get_fee, get_ticker_history
|
||||
from freqtrade.exchange import get_fee, get_ticker_history, get_order_book
|
||||
from freqtrade.persistence import Trade
|
||||
from freqtrade.strategy.resolver import StrategyResolver, IStrategy
|
||||
|
||||
@@ -108,7 +108,7 @@ class Analyze(object):
|
||||
dataframe = self.parse_ticker_dataframe(ticker_history)
|
||||
# eliminate partials for known exchanges that sends partial candles
|
||||
if self.config['exchange']['name'] in ['binance']:
|
||||
logger.info('eliminating partial candle')
|
||||
logger.debug('eliminating partial candle')
|
||||
dataframe.drop(dataframe.tail(1).index, inplace=True) # eliminate partial candle
|
||||
dataframe = self.populate_indicators(dataframe, pair)
|
||||
dataframe = self.populate_buy_trend(dataframe, pair)
|
||||
@@ -122,6 +122,7 @@ class Analyze(object):
|
||||
:param interval: Interval to use (in min)
|
||||
:return: (Buy, Sell) A bool-tuple indicating buy/sell signal
|
||||
"""
|
||||
logger.info('Checking signal for %s', pair)
|
||||
ticker_hist = get_ticker_history(pair, interval)
|
||||
if not ticker_hist:
|
||||
logger.warning('Empty ticker history for pair %s', pair)
|
||||
@@ -271,7 +272,7 @@ class Analyze(object):
|
||||
break
|
||||
return sell_rate
|
||||
|
||||
def order_book_to_dataframe(data: list) -> DataFrame:
|
||||
def order_book_to_dataframe(self, data: list) -> DataFrame:
|
||||
"""
|
||||
Gets order book list, returns dataframe with below format
|
||||
-------------------------------------------------------------------
|
||||
@@ -292,8 +293,3 @@ class Analyze(object):
|
||||
keys=['b_sum', 'b_size', 'bids', 'asks', 'a_size', 'a_sum'])
|
||||
|
||||
return frame
|
||||
|
||||
def order_book_dom() -> DataFrame:
|
||||
# https://stackoverflow.com/questions/36835793/pandas-group-by-consecutive-ranges
|
||||
return DataFrame
|
||||
|
||||
|
||||
@@ -93,7 +93,9 @@ CONF_SCHEMA = {
|
||||
'properties': {
|
||||
'use_sell_signal': {'type': 'boolean'},
|
||||
'sell_profit_only': {'type': 'boolean'},
|
||||
'sell_fullfilled_at_roi': {'type': 'boolean'}
|
||||
'sell_fullfilled_at_roi': {'type': 'boolean'},
|
||||
'check_depth_of_market': {'type': 'boolean'},
|
||||
'dom_bids_asks_delta': {'type': 'number', 'minimum': 0}
|
||||
}
|
||||
},
|
||||
'telegram': {
|
||||
|
||||
@@ -195,7 +195,6 @@ class FreqtradeBot(object):
|
||||
:param key: sort key (defaults to 'quoteVolume')
|
||||
:return: List of pairs
|
||||
"""
|
||||
|
||||
if not exchange.exchange_has('fetchTickers'):
|
||||
raise OperationalException(
|
||||
'Exchange does not support dynamic whitelist.'
|
||||
@@ -264,7 +263,7 @@ class FreqtradeBot(object):
|
||||
if 'use_book_order' in self.config['bid_strategy'] and self.config['bid_strategy'].get('use_book_order', False):
|
||||
logger.info('Getting price from Order Book')
|
||||
orderBook_top = self.config.get('bid_strategy', {}).get('book_order_top', 1)
|
||||
orderBook = exchange.get_order_book(pair, orderBook_top)
|
||||
orderBook = exchange.get_order_book(pair, orderBook_top)
|
||||
# top 1 = index 0
|
||||
orderBook_rate = orderBook['bids'][orderBook_top - 1][0]
|
||||
orderBook_rate = orderBook_rate + 0.00000001
|
||||
@@ -327,6 +326,19 @@ class FreqtradeBot(object):
|
||||
break
|
||||
else:
|
||||
return False
|
||||
|
||||
# order book depth of market
|
||||
if self.config.get('experimental', {}).get('check_depth_of_market', False) \
|
||||
and (self.config.get('experimental', {}).get('dom_bids_asks_delta', 0) > 0):
|
||||
logger.info('depth of market check for %s', pair)
|
||||
orderBook = exchange.get_order_book(pair, 1000)
|
||||
orderBook_df = self.analyze.order_book_to_dataframe(orderBook)
|
||||
orderBook_bids = orderBook_df['b_size'].sum()
|
||||
orderBook_asks = orderBook_df['a_size'].sum()
|
||||
logger.info('bids: %s, asks: %s, delta: %s', orderBook_bids, orderBook_asks, orderBook_bids / orderBook_asks)
|
||||
if (orderBook_bids / orderBook_asks) < self.config.get('experimental', {}).get('dom_bids_asks_delta', 0):
|
||||
return False
|
||||
|
||||
pair_s = pair.replace('_', '/')
|
||||
pair_url = exchange.get_pair_detail_url(pair)
|
||||
# Calculate amount
|
||||
|
||||
Reference in New Issue
Block a user