experimental depth of market check prior to buying

This commit is contained in:
Nullart
2018-06-27 21:47:29 +08:00
parent 9f827979bd
commit fff2b81c10
7 changed files with 33 additions and 13 deletions

View File

@@ -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

View File

@@ -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': {

View File

@@ -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