Add close_proit_abs column
This commit is contained in:
parent
fb4e9b3938
commit
2c434e9b11
@ -954,6 +954,7 @@ class FreqtradeBot:
|
|||||||
|
|
||||||
trade.close_rate = None
|
trade.close_rate = None
|
||||||
trade.close_profit = None
|
trade.close_profit = None
|
||||||
|
trade.close_profit_abs = None
|
||||||
trade.close_date = None
|
trade.close_date = None
|
||||||
trade.is_open = True
|
trade.is_open = True
|
||||||
trade.open_order_id = None
|
trade.open_order_id = None
|
||||||
|
@ -86,7 +86,7 @@ def check_migrate(engine) -> None:
|
|||||||
logger.debug(f'trying {table_back_name}')
|
logger.debug(f'trying {table_back_name}')
|
||||||
|
|
||||||
# Check for latest column
|
# Check for latest column
|
||||||
if not has_column(cols, 'open_trade_price'):
|
if not has_column(cols, 'close_profit_abs'):
|
||||||
logger.info(f'Running database migration - backup available as {table_back_name}')
|
logger.info(f'Running database migration - backup available as {table_back_name}')
|
||||||
|
|
||||||
fee_open = get_column_def(cols, 'fee_open', 'fee')
|
fee_open = get_column_def(cols, 'fee_open', 'fee')
|
||||||
@ -106,6 +106,9 @@ def check_migrate(engine) -> None:
|
|||||||
ticker_interval = get_column_def(cols, 'ticker_interval', 'null')
|
ticker_interval = get_column_def(cols, 'ticker_interval', 'null')
|
||||||
open_trade_price = get_column_def(cols, 'open_trade_price',
|
open_trade_price = get_column_def(cols, 'open_trade_price',
|
||||||
f'amount * open_rate * (1 + {fee_open})')
|
f'amount * open_rate * (1 + {fee_open})')
|
||||||
|
close_profit_abs = get_column_def(
|
||||||
|
cols, 'close_profit_abs',
|
||||||
|
f"(amount * close_rate * (1 - {fee_close})) - {open_trade_price}")
|
||||||
|
|
||||||
# Schema migration necessary
|
# Schema migration necessary
|
||||||
engine.execute(f"alter table trades rename to {table_back_name}")
|
engine.execute(f"alter table trades rename to {table_back_name}")
|
||||||
@ -123,7 +126,7 @@ def check_migrate(engine) -> None:
|
|||||||
stop_loss, stop_loss_pct, initial_stop_loss, initial_stop_loss_pct,
|
stop_loss, stop_loss_pct, initial_stop_loss, initial_stop_loss_pct,
|
||||||
stoploss_order_id, stoploss_last_update,
|
stoploss_order_id, stoploss_last_update,
|
||||||
max_rate, min_rate, sell_reason, strategy,
|
max_rate, min_rate, sell_reason, strategy,
|
||||||
ticker_interval, open_trade_price
|
ticker_interval, open_trade_price, close_profit_abs
|
||||||
)
|
)
|
||||||
select id, lower(exchange),
|
select id, lower(exchange),
|
||||||
case
|
case
|
||||||
@ -143,7 +146,7 @@ def check_migrate(engine) -> None:
|
|||||||
{stoploss_order_id} stoploss_order_id, {stoploss_last_update} stoploss_last_update,
|
{stoploss_order_id} stoploss_order_id, {stoploss_last_update} stoploss_last_update,
|
||||||
{max_rate} max_rate, {min_rate} min_rate, {sell_reason} sell_reason,
|
{max_rate} max_rate, {min_rate} min_rate, {sell_reason} sell_reason,
|
||||||
{strategy} strategy, {ticker_interval} ticker_interval,
|
{strategy} strategy, {ticker_interval} ticker_interval,
|
||||||
{open_trade_price} open_trade_price
|
{open_trade_price} open_trade_price, {close_profit_abs} close_profit_abs
|
||||||
from {table_back_name}
|
from {table_back_name}
|
||||||
""")
|
""")
|
||||||
|
|
||||||
@ -190,6 +193,7 @@ class Trade(_DECL_BASE):
|
|||||||
close_rate = Column(Float)
|
close_rate = Column(Float)
|
||||||
close_rate_requested = Column(Float)
|
close_rate_requested = Column(Float)
|
||||||
close_profit = Column(Float)
|
close_profit = Column(Float)
|
||||||
|
close_profit_abs = Column(Float)
|
||||||
stake_amount = Column(Float, nullable=False)
|
stake_amount = Column(Float, nullable=False)
|
||||||
amount = Column(Float)
|
amount = Column(Float)
|
||||||
open_date = Column(DateTime, nullable=False, default=datetime.utcnow)
|
open_date = Column(DateTime, nullable=False, default=datetime.utcnow)
|
||||||
@ -334,6 +338,7 @@ class Trade(_DECL_BASE):
|
|||||||
"""
|
"""
|
||||||
self.close_rate = Decimal(rate)
|
self.close_rate = Decimal(rate)
|
||||||
self.close_profit = self.calc_profit_ratio()
|
self.close_profit = self.calc_profit_ratio()
|
||||||
|
self.close_profit_abs = self.calc_profit()
|
||||||
self.close_date = datetime.utcnow()
|
self.close_date = datetime.utcnow()
|
||||||
self.is_open = False
|
self.is_open = False
|
||||||
self.open_order_id = None
|
self.open_order_id = None
|
||||||
|
@ -476,12 +476,22 @@ def test_migrate_old(mocker, default_conf, fee):
|
|||||||
stake=default_conf.get("stake_amount"),
|
stake=default_conf.get("stake_amount"),
|
||||||
amount=amount
|
amount=amount
|
||||||
)
|
)
|
||||||
|
insert_table_old2 = """INSERT INTO trades (exchange, pair, is_open, fee,
|
||||||
|
open_rate, close_rate, stake_amount, amount, open_date)
|
||||||
|
VALUES ('BITTREX', 'BTC_ETC', 0, {fee},
|
||||||
|
0.00258580, 0.00268580, {stake}, {amount},
|
||||||
|
'2017-11-28 12:44:24.000000')
|
||||||
|
""".format(fee=fee.return_value,
|
||||||
|
stake=default_conf.get("stake_amount"),
|
||||||
|
amount=amount
|
||||||
|
)
|
||||||
engine = create_engine('sqlite://')
|
engine = create_engine('sqlite://')
|
||||||
mocker.patch('freqtrade.persistence.create_engine', lambda *args, **kwargs: engine)
|
mocker.patch('freqtrade.persistence.create_engine', lambda *args, **kwargs: engine)
|
||||||
|
|
||||||
# Create table using the old format
|
# Create table using the old format
|
||||||
engine.execute(create_table_old)
|
engine.execute(create_table_old)
|
||||||
engine.execute(insert_table_old)
|
engine.execute(insert_table_old)
|
||||||
|
engine.execute(insert_table_old2)
|
||||||
# Run init to test migration
|
# Run init to test migration
|
||||||
init(default_conf['db_url'], default_conf['dry_run'])
|
init(default_conf['db_url'], default_conf['dry_run'])
|
||||||
|
|
||||||
@ -500,6 +510,15 @@ def test_migrate_old(mocker, default_conf, fee):
|
|||||||
assert trade.stop_loss == 0.0
|
assert trade.stop_loss == 0.0
|
||||||
assert trade.initial_stop_loss == 0.0
|
assert trade.initial_stop_loss == 0.0
|
||||||
assert trade.open_trade_price == trade._calc_open_trade_price()
|
assert trade.open_trade_price == trade._calc_open_trade_price()
|
||||||
|
assert trade.close_profit_abs is None
|
||||||
|
|
||||||
|
trade = Trade.query.filter(Trade.id == 2).first()
|
||||||
|
assert trade.close_rate is not None
|
||||||
|
assert trade.is_open == 0
|
||||||
|
assert trade.open_rate_requested is None
|
||||||
|
assert trade.close_rate_requested is None
|
||||||
|
assert trade.close_rate is not None
|
||||||
|
assert pytest.approx(trade.close_profit_abs) == trade.calc_profit()
|
||||||
|
|
||||||
|
|
||||||
def test_migrate_new(mocker, default_conf, fee, caplog):
|
def test_migrate_new(mocker, default_conf, fee, caplog):
|
||||||
@ -583,6 +602,7 @@ def test_migrate_new(mocker, default_conf, fee, caplog):
|
|||||||
assert log_has("trying trades_bak2", caplog)
|
assert log_has("trying trades_bak2", caplog)
|
||||||
assert log_has("Running database migration - backup available as trades_bak2", caplog)
|
assert log_has("Running database migration - backup available as trades_bak2", caplog)
|
||||||
assert trade.open_trade_price == trade._calc_open_trade_price()
|
assert trade.open_trade_price == trade._calc_open_trade_price()
|
||||||
|
assert trade.close_profit_abs is None
|
||||||
|
|
||||||
|
|
||||||
def test_migrate_mid_state(mocker, default_conf, fee, caplog):
|
def test_migrate_mid_state(mocker, default_conf, fee, caplog):
|
||||||
|
Loading…
Reference in New Issue
Block a user