Complete refactor, moving query_trades to persistance as get_open_trades
This commit is contained in:
parent
7bc874c7fd
commit
0c53bd6dd4
@ -163,7 +163,7 @@ class FreqtradeBot(object):
|
|||||||
self.active_pair_whitelist = self.edge.adjust(self.active_pair_whitelist)
|
self.active_pair_whitelist = self.edge.adjust(self.active_pair_whitelist)
|
||||||
|
|
||||||
# Query trades from persistence layer
|
# Query trades from persistence layer
|
||||||
trades = self._query_trades()
|
trades = Trade.get_open_trades()
|
||||||
|
|
||||||
# Extend active-pair whitelist with pairs from open trades
|
# Extend active-pair whitelist with pairs from open trades
|
||||||
# It ensures that tickers are downloaded for open trades
|
# It ensures that tickers are downloaded for open trades
|
||||||
@ -200,12 +200,6 @@ class FreqtradeBot(object):
|
|||||||
self.state = State.STOPPED
|
self.state = State.STOPPED
|
||||||
return state_changed
|
return state_changed
|
||||||
|
|
||||||
def _query_trades(self) -> List[Any]:
|
|
||||||
"""
|
|
||||||
Query trades from persistence layer
|
|
||||||
"""
|
|
||||||
return Trade.query.filter(Trade.is_open.is_(True)).all()
|
|
||||||
|
|
||||||
def _extend_whitelist_with_trades(self, whitelist: List[str], trades: List[Any]):
|
def _extend_whitelist_with_trades(self, whitelist: List[str], trades: List[Any]):
|
||||||
"""
|
"""
|
||||||
Extend whitelist with pairs from open trades
|
Extend whitelist with pairs from open trades
|
||||||
@ -265,7 +259,7 @@ class FreqtradeBot(object):
|
|||||||
avaliable_amount = self.wallets.get_free(self.config['stake_currency'])
|
avaliable_amount = self.wallets.get_free(self.config['stake_currency'])
|
||||||
|
|
||||||
if stake_amount == constants.UNLIMITED_STAKE_AMOUNT:
|
if stake_amount == constants.UNLIMITED_STAKE_AMOUNT:
|
||||||
open_trades = len(Trade.query.filter(Trade.is_open.is_(True)).all())
|
open_trades = len(Trade.get_open_trades())
|
||||||
if open_trades >= self.config['max_open_trades']:
|
if open_trades >= self.config['max_open_trades']:
|
||||||
logger.warning('Can\'t open a new trade: max number of trades is reached')
|
logger.warning('Can\'t open a new trade: max number of trades is reached')
|
||||||
return None
|
return None
|
||||||
@ -323,7 +317,7 @@ class FreqtradeBot(object):
|
|||||||
whitelist = copy.deepcopy(self.active_pair_whitelist)
|
whitelist = copy.deepcopy(self.active_pair_whitelist)
|
||||||
|
|
||||||
# Remove currently opened and latest pairs from whitelist
|
# Remove currently opened and latest pairs from whitelist
|
||||||
for trade in Trade.query.filter(Trade.is_open.is_(True)).all():
|
for trade in Trade.get_open_trades():
|
||||||
if trade.pair in whitelist:
|
if trade.pair in whitelist:
|
||||||
whitelist.remove(trade.pair)
|
whitelist.remove(trade.pair)
|
||||||
logger.debug('Ignoring %s in pair whitelist', trade.pair)
|
logger.debug('Ignoring %s in pair whitelist', trade.pair)
|
||||||
|
@ -5,7 +5,7 @@ This module contains the class to persist trades into SQLite
|
|||||||
import logging
|
import logging
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from typing import Any, Dict, Optional
|
from typing import Any, Dict, List, Optional
|
||||||
|
|
||||||
import arrow
|
import arrow
|
||||||
from sqlalchemy import (Boolean, Column, DateTime, Float, Integer, String,
|
from sqlalchemy import (Boolean, Column, DateTime, Float, Integer, String,
|
||||||
@ -371,3 +371,10 @@ class Trade(_DECL_BASE):
|
|||||||
.filter(Trade.is_open.is_(True))\
|
.filter(Trade.is_open.is_(True))\
|
||||||
.scalar()
|
.scalar()
|
||||||
return total_open_stake_amount or 0
|
return total_open_stake_amount or 0
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_open_trades() -> List[Any]:
|
||||||
|
"""
|
||||||
|
Query trades from persistence layer
|
||||||
|
"""
|
||||||
|
return Trade.query.filter(Trade.is_open.is_(True)).all()
|
||||||
|
@ -83,7 +83,7 @@ class RPC(object):
|
|||||||
a remotely exposed function
|
a remotely exposed function
|
||||||
"""
|
"""
|
||||||
# Fetch open trade
|
# Fetch open trade
|
||||||
trades = Trade.query.filter(Trade.is_open.is_(True)).all()
|
trades = Trade.get_open_trades()
|
||||||
if not trades:
|
if not trades:
|
||||||
raise RPCException('no active trade')
|
raise RPCException('no active trade')
|
||||||
else:
|
else:
|
||||||
@ -118,7 +118,7 @@ class RPC(object):
|
|||||||
return results
|
return results
|
||||||
|
|
||||||
def _rpc_status_table(self) -> DataFrame:
|
def _rpc_status_table(self) -> DataFrame:
|
||||||
trades = Trade.query.filter(Trade.is_open.is_(True)).all()
|
trades = Trade.get_open_trades()
|
||||||
if not trades:
|
if not trades:
|
||||||
raise RPCException('no active order')
|
raise RPCException('no active order')
|
||||||
else:
|
else:
|
||||||
@ -366,7 +366,7 @@ class RPC(object):
|
|||||||
|
|
||||||
if trade_id == 'all':
|
if trade_id == 'all':
|
||||||
# Execute sell for all open orders
|
# Execute sell for all open orders
|
||||||
for trade in Trade.query.filter(Trade.is_open.is_(True)).all():
|
for trade in Trade.get_open_trades():
|
||||||
_exec_forcesell(trade)
|
_exec_forcesell(trade)
|
||||||
Trade.session.flush()
|
Trade.session.flush()
|
||||||
return
|
return
|
||||||
@ -442,7 +442,7 @@ class RPC(object):
|
|||||||
if self._freqtrade.state != State.RUNNING:
|
if self._freqtrade.state != State.RUNNING:
|
||||||
raise RPCException('trader is not running')
|
raise RPCException('trader is not running')
|
||||||
|
|
||||||
return Trade.query.filter(Trade.is_open.is_(True)).all()
|
return Trade.get_open_trades()
|
||||||
|
|
||||||
def _rpc_whitelist(self) -> Dict:
|
def _rpc_whitelist(self) -> Dict:
|
||||||
""" Returns the currently active whitelist"""
|
""" Returns the currently active whitelist"""
|
||||||
|
@ -629,3 +629,48 @@ def test_adjust_stop_loss(limit_buy_order, limit_sell_order, fee):
|
|||||||
assert round(trade.stop_loss, 8) == 1.26
|
assert round(trade.stop_loss, 8) == 1.26
|
||||||
assert trade.max_rate == 1.4
|
assert trade.max_rate == 1.4
|
||||||
assert trade.initial_stop_loss == 0.95
|
assert trade.initial_stop_loss == 0.95
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_open(default_conf, fee):
|
||||||
|
init(default_conf)
|
||||||
|
|
||||||
|
# Simulate dry_run entries
|
||||||
|
trade = Trade(
|
||||||
|
pair='ETH/BTC',
|
||||||
|
stake_amount=0.001,
|
||||||
|
amount=123.0,
|
||||||
|
fee_open=fee.return_value,
|
||||||
|
fee_close=fee.return_value,
|
||||||
|
open_rate=0.123,
|
||||||
|
exchange='bittrex',
|
||||||
|
open_order_id='dry_run_buy_12345'
|
||||||
|
)
|
||||||
|
Trade.session.add(trade)
|
||||||
|
|
||||||
|
trade = Trade(
|
||||||
|
pair='ETC/BTC',
|
||||||
|
stake_amount=0.001,
|
||||||
|
amount=123.0,
|
||||||
|
fee_open=fee.return_value,
|
||||||
|
fee_close=fee.return_value,
|
||||||
|
open_rate=0.123,
|
||||||
|
exchange='bittrex',
|
||||||
|
is_open=False,
|
||||||
|
open_order_id='dry_run_sell_12345'
|
||||||
|
)
|
||||||
|
Trade.session.add(trade)
|
||||||
|
|
||||||
|
# Simulate prod entry
|
||||||
|
trade = Trade(
|
||||||
|
pair='ETC/BTC',
|
||||||
|
stake_amount=0.001,
|
||||||
|
amount=123.0,
|
||||||
|
fee_open=fee.return_value,
|
||||||
|
fee_close=fee.return_value,
|
||||||
|
open_rate=0.123,
|
||||||
|
exchange='bittrex',
|
||||||
|
open_order_id='prod_buy_12345'
|
||||||
|
)
|
||||||
|
Trade.session.add(trade)
|
||||||
|
|
||||||
|
assert len(Trade.get_open_trades()) == 2
|
||||||
|
Loading…
Reference in New Issue
Block a user