Merge branch 'freqtrade:develop' into develop
This commit is contained in:
commit
06571e99aa
@ -52,10 +52,15 @@ class Binance(Exchange):
|
|||||||
|
|
||||||
ordertype = 'stop' if self.trading_mode == TradingMode.FUTURES else 'stop_loss_limit'
|
ordertype = 'stop' if self.trading_mode == TradingMode.FUTURES else 'stop_loss_limit'
|
||||||
|
|
||||||
return order['type'] == ordertype and (
|
return (
|
||||||
(side == "sell" and stop_loss > float(order['stopPrice'])) or
|
order.get('stopPrice', None) is None
|
||||||
(side == "buy" and stop_loss < float(order['stopPrice']))
|
or (
|
||||||
)
|
order['type'] == ordertype
|
||||||
|
and (
|
||||||
|
(side == "sell" and stop_loss > float(order['stopPrice'])) or
|
||||||
|
(side == "buy" and stop_loss < float(order['stopPrice']))
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
def get_tickers(self, symbols: Optional[List[str]] = None, cached: bool = False) -> Dict:
|
def get_tickers(self, symbols: Optional[List[str]] = None, cached: bool = False) -> Dict:
|
||||||
tickers = super().get_tickers(symbols=symbols, cached=cached)
|
tickers = super().get_tickers(symbols=symbols, cached=cached)
|
||||||
|
@ -114,5 +114,7 @@ class Gateio(Exchange):
|
|||||||
Verify stop_loss against stoploss-order value (limit or price)
|
Verify stop_loss against stoploss-order value (limit or price)
|
||||||
Returns True if adjustment is necessary.
|
Returns True if adjustment is necessary.
|
||||||
"""
|
"""
|
||||||
return ((side == "sell" and stop_loss > float(order['stopPrice'])) or
|
return (order.get('stopPrice', None) is None or (
|
||||||
(side == "buy" and stop_loss < float(order['stopPrice'])))
|
side == "sell" and stop_loss > float(order['stopPrice'])) or
|
||||||
|
(side == "buy" and stop_loss < float(order['stopPrice']))
|
||||||
|
)
|
||||||
|
@ -27,7 +27,13 @@ class Huobi(Exchange):
|
|||||||
Verify stop_loss against stoploss-order value (limit or price)
|
Verify stop_loss against stoploss-order value (limit or price)
|
||||||
Returns True if adjustment is necessary.
|
Returns True if adjustment is necessary.
|
||||||
"""
|
"""
|
||||||
return order['type'] == 'stop' and stop_loss > float(order['stopPrice'])
|
return (
|
||||||
|
order.get('stopPrice', None) is None
|
||||||
|
or (
|
||||||
|
order['type'] == 'stop'
|
||||||
|
and stop_loss > float(order['stopPrice'])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
def _get_stop_params(self, ordertype: str, stop_price: float) -> Dict:
|
def _get_stop_params(self, ordertype: str, stop_price: float) -> Dict:
|
||||||
|
|
||||||
|
@ -33,7 +33,10 @@ class Kucoin(Exchange):
|
|||||||
Verify stop_loss against stoploss-order value (limit or price)
|
Verify stop_loss against stoploss-order value (limit or price)
|
||||||
Returns True if adjustment is necessary.
|
Returns True if adjustment is necessary.
|
||||||
"""
|
"""
|
||||||
return order['info'].get('stop') is not None and stop_loss > float(order['stopPrice'])
|
return (
|
||||||
|
order.get('stopPrice', None) is None
|
||||||
|
or stop_loss > float(order['stopPrice'])
|
||||||
|
)
|
||||||
|
|
||||||
def _get_stop_params(self, ordertype: str, stop_price: float) -> Dict:
|
def _get_stop_params(self, ordertype: str, stop_price: float) -> Dict:
|
||||||
|
|
||||||
|
@ -201,16 +201,18 @@ def migrate_orders_table(engine, table_back_name: str, cols_order: List):
|
|||||||
|
|
||||||
ft_fee_base = get_column_def(cols_order, 'ft_fee_base', 'null')
|
ft_fee_base = get_column_def(cols_order, 'ft_fee_base', 'null')
|
||||||
average = get_column_def(cols_order, 'average', 'null')
|
average = get_column_def(cols_order, 'average', 'null')
|
||||||
|
stop_price = get_column_def(cols_order, 'stop_price', 'null')
|
||||||
|
|
||||||
# sqlite does not support literals for booleans
|
# sqlite does not support literals for booleans
|
||||||
with engine.begin() as connection:
|
with engine.begin() as connection:
|
||||||
connection.execute(text(f"""
|
connection.execute(text(f"""
|
||||||
insert into orders (id, ft_trade_id, ft_order_side, ft_pair, ft_is_open, order_id,
|
insert into orders (id, ft_trade_id, ft_order_side, ft_pair, ft_is_open, order_id,
|
||||||
status, symbol, order_type, side, price, amount, filled, average, remaining, cost,
|
status, symbol, order_type, side, price, amount, filled, average, remaining, cost,
|
||||||
order_date, order_filled_date, order_update_date, ft_fee_base)
|
stop_price, order_date, order_filled_date, order_update_date, ft_fee_base)
|
||||||
select id, ft_trade_id, ft_order_side, ft_pair, ft_is_open, order_id,
|
select id, ft_trade_id, ft_order_side, ft_pair, ft_is_open, order_id,
|
||||||
status, symbol, order_type, side, price, amount, filled, {average} average, remaining,
|
status, symbol, order_type, side, price, amount, filled, {average} average, remaining,
|
||||||
cost, order_date, order_filled_date, order_update_date, {ft_fee_base} ft_fee_base
|
cost, {stop_price} stop_price, order_date, order_filled_date,
|
||||||
|
order_update_date, {ft_fee_base} ft_fee_base
|
||||||
from {table_back_name}
|
from {table_back_name}
|
||||||
"""))
|
"""))
|
||||||
|
|
||||||
@ -294,9 +296,8 @@ def check_migrate(engine, decl_base, previous_tables) -> None:
|
|||||||
|
|
||||||
# Check if migration necessary
|
# Check if migration necessary
|
||||||
# Migrates both trades and orders table!
|
# Migrates both trades and orders table!
|
||||||
# if ('orders' not in previous_tables
|
if not has_column(cols_orders, 'stop_price'):
|
||||||
# or not has_column(cols_orders, 'leverage')):
|
# if not has_column(cols_trades, 'base_currency'):
|
||||||
if not has_column(cols_trades, 'base_currency'):
|
|
||||||
logger.info(f"Running database migration for trades - "
|
logger.info(f"Running database migration for trades - "
|
||||||
f"backup: {table_back_name}, {order_table_bak_name}")
|
f"backup: {table_back_name}, {order_table_bak_name}")
|
||||||
migrate_trades_and_orders_table(
|
migrate_trades_and_orders_table(
|
||||||
|
@ -57,6 +57,7 @@ class Order(_DECL_BASE):
|
|||||||
filled = Column(Float, nullable=True)
|
filled = Column(Float, nullable=True)
|
||||||
remaining = Column(Float, nullable=True)
|
remaining = Column(Float, nullable=True)
|
||||||
cost = Column(Float, nullable=True)
|
cost = Column(Float, nullable=True)
|
||||||
|
stop_price = Column(Float, nullable=True)
|
||||||
order_date = Column(DateTime, nullable=True, default=datetime.utcnow)
|
order_date = Column(DateTime, nullable=True, default=datetime.utcnow)
|
||||||
order_filled_date = Column(DateTime, nullable=True)
|
order_filled_date = Column(DateTime, nullable=True)
|
||||||
order_update_date = Column(DateTime, nullable=True)
|
order_update_date = Column(DateTime, nullable=True)
|
||||||
@ -107,6 +108,7 @@ class Order(_DECL_BASE):
|
|||||||
self.average = order.get('average', self.average)
|
self.average = order.get('average', self.average)
|
||||||
self.remaining = order.get('remaining', self.remaining)
|
self.remaining = order.get('remaining', self.remaining)
|
||||||
self.cost = order.get('cost', self.cost)
|
self.cost = order.get('cost', self.cost)
|
||||||
|
self.stop_price = order.get('stopPrice', self.stop_price)
|
||||||
|
|
||||||
if 'timestamp' in order and order['timestamp'] is not None:
|
if 'timestamp' in order and order['timestamp'] is not None:
|
||||||
self.order_date = datetime.fromtimestamp(order['timestamp'] / 1000, tz=timezone.utc)
|
self.order_date = datetime.fromtimestamp(order['timestamp'] / 1000, tz=timezone.utc)
|
||||||
@ -130,6 +132,7 @@ class Order(_DECL_BASE):
|
|||||||
'side': self.ft_order_side,
|
'side': self.ft_order_side,
|
||||||
'filled': self.filled,
|
'filled': self.filled,
|
||||||
'remaining': self.remaining,
|
'remaining': self.remaining,
|
||||||
|
'stopPrice': self.stop_price,
|
||||||
'datetime': self.order_date_utc.strftime('%Y-%m-%dT%H:%M:%S.%f'),
|
'datetime': self.order_date_utc.strftime('%Y-%m-%dT%H:%M:%S.%f'),
|
||||||
'timestamp': int(self.order_date_utc.timestamp() * 1000),
|
'timestamp': int(self.order_date_utc.timestamp() * 1000),
|
||||||
'status': self.status,
|
'status': self.status,
|
||||||
|
@ -123,5 +123,5 @@ def test_stoploss_adjust_kucoin(mocker, default_conf):
|
|||||||
assert exchange.stoploss_adjust(1501, order, 'sell')
|
assert exchange.stoploss_adjust(1501, order, 'sell')
|
||||||
assert not exchange.stoploss_adjust(1499, order, 'sell')
|
assert not exchange.stoploss_adjust(1499, order, 'sell')
|
||||||
# Test with invalid order case
|
# Test with invalid order case
|
||||||
order['info']['stop'] = None
|
order['stopPrice'] = None
|
||||||
assert not exchange.stoploss_adjust(1501, order, 'sell')
|
assert exchange.stoploss_adjust(1501, order, 'sell')
|
||||||
|
@ -2717,5 +2717,7 @@ def test_order_to_ccxt(limit_buy_order_open):
|
|||||||
del raw_order['fee']
|
del raw_order['fee']
|
||||||
del raw_order['datetime']
|
del raw_order['datetime']
|
||||||
del raw_order['info']
|
del raw_order['info']
|
||||||
|
assert raw_order['stopPrice'] is None
|
||||||
|
del raw_order['stopPrice']
|
||||||
del limit_buy_order_open['datetime']
|
del limit_buy_order_open['datetime']
|
||||||
assert raw_order == limit_buy_order_open
|
assert raw_order == limit_buy_order_open
|
||||||
|
Loading…
Reference in New Issue
Block a user