add columns fee_open and fee_close, update value
This commit is contained in:
parent
7f4c70827a
commit
a620aa8352
@ -316,11 +316,14 @@ class FreqtradeBot(object):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
# Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL
|
# Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL
|
||||||
|
fee = exchange.get_fee(symbol=pair, taker_or_maker='maker')
|
||||||
trade = Trade(
|
trade = Trade(
|
||||||
pair=pair,
|
pair=pair,
|
||||||
stake_amount=stake_amount,
|
stake_amount=stake_amount,
|
||||||
amount=amount,
|
amount=amount,
|
||||||
fee=exchange.get_fee(taker_or_maker='maker'),
|
fee=fee,
|
||||||
|
fee_open=fee,
|
||||||
|
fee_close=fee,
|
||||||
open_rate=buy_limit,
|
open_rate=buy_limit,
|
||||||
open_date=datetime.utcnow(),
|
open_date=datetime.utcnow(),
|
||||||
exchange=exchange.get_id(),
|
exchange=exchange.get_id(),
|
||||||
@ -355,7 +358,19 @@ class FreqtradeBot(object):
|
|||||||
if trade.open_order_id:
|
if trade.open_order_id:
|
||||||
# Update trade with order values
|
# Update trade with order values
|
||||||
self.logger.info('Found open order for %s', trade)
|
self.logger.info('Found open order for %s', trade)
|
||||||
trade.update(exchange.get_order(trade.open_order_id, trade.pair))
|
order = exchange.get_order(trade.open_order_id, trade.pair)
|
||||||
|
# TODO: correct place here ??
|
||||||
|
# Try update amount (binance-fix)
|
||||||
|
try:
|
||||||
|
new_amount = self.get_real_amount(trade)
|
||||||
|
if order['amount'] != new_amount:
|
||||||
|
order['amount'] = new_amount
|
||||||
|
trade.fee_open = 0
|
||||||
|
|
||||||
|
except OperationalException as exception:
|
||||||
|
self.logger.warning("could not update trade amount: %s", exception)
|
||||||
|
|
||||||
|
trade.update(order)
|
||||||
|
|
||||||
if trade.is_open and trade.open_order_id is None:
|
if trade.is_open and trade.open_order_id is None:
|
||||||
# Check if we can sell our current pair
|
# Check if we can sell our current pair
|
||||||
@ -374,18 +389,18 @@ class FreqtradeBot(object):
|
|||||||
if len(trades) == 0:
|
if len(trades) == 0:
|
||||||
raise OperationalException("get_real_amount: no trade found")
|
raise OperationalException("get_real_amount: no trade found")
|
||||||
amount = 0
|
amount = 0
|
||||||
fee = 0
|
fee_abs = 0
|
||||||
for trade in trades:
|
for trade in trades:
|
||||||
amount += trade["amount"]
|
amount += trade["amount"]
|
||||||
if "fee" in trade:
|
if "fee" in trade:
|
||||||
|
# only applies if fee is in quote currency!
|
||||||
if order.pair.startswith(trade["fee"]["currency"]):
|
if order.pair.startswith(trade["fee"]["currency"]):
|
||||||
fee += trade["fee"]["cost"]
|
fee_abs += trade["fee"]["cost"]
|
||||||
|
|
||||||
# TODO: create order using amount_lots would be better
|
|
||||||
if amount != order.amount:
|
if amount != order.amount:
|
||||||
self.logger.warning("amount {} does not match amount {}".format(amount, order.amount))
|
self.logger.warning("amount {} does not match amount {}".format(amount, order.amount))
|
||||||
raise OperationalException("Half bought? Amounts don't match")
|
raise OperationalException("Half bought? Amounts don't match")
|
||||||
real_amount = amount - fee
|
real_amount = amount - fee_abs
|
||||||
return real_amount
|
return real_amount
|
||||||
|
|
||||||
def maybe_update_real_amount(self, trade: Trade) -> bool:
|
def maybe_update_real_amount(self, trade: Trade) -> bool:
|
||||||
@ -403,9 +418,11 @@ class FreqtradeBot(object):
|
|||||||
self.logger.warning("could not update trade amount: %s", exception)
|
self.logger.warning("could not update trade amount: %s", exception)
|
||||||
return False
|
return False
|
||||||
# updating amount
|
# updating amount
|
||||||
|
if trade.amount != new_amount:
|
||||||
self.logger.info("Updating amount for Trade {} from {} to {}".format(
|
self.logger.info("Updating amount for Trade {} from {} to {}".format(
|
||||||
trade, trade.amount, new_amount))
|
trade, trade.amount, new_amount))
|
||||||
trade.amount = new_amount
|
trade.amount = new_amount
|
||||||
|
trade.fee_open = 0 # Fee was applied - set to 0 for buy
|
||||||
Trade.session.flush()
|
Trade.session.flush()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -452,6 +469,7 @@ class FreqtradeBot(object):
|
|||||||
|
|
||||||
# Check if trade is still actually open
|
# Check if trade is still actually open
|
||||||
if int(order['remaining']) == 0:
|
if int(order['remaining']) == 0:
|
||||||
|
# self.maybe_update_real_amount(trade)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if order['side'] == 'buy' and ordertime < timeoutthreashold:
|
if order['side'] == 'buy' and ordertime < timeoutthreashold:
|
||||||
|
@ -86,6 +86,8 @@ class Trade(_DECL_BASE):
|
|||||||
pair = Column(String, nullable=False)
|
pair = Column(String, nullable=False)
|
||||||
is_open = Column(Boolean, nullable=False, default=True)
|
is_open = Column(Boolean, nullable=False, default=True)
|
||||||
fee = Column(Float, nullable=False, default=0.0)
|
fee = Column(Float, nullable=False, default=0.0)
|
||||||
|
fee_open = Column(Float, nullable=False, default=0.0)
|
||||||
|
fee_close = Column(Float, nullable=False, default=0.0)
|
||||||
open_rate = Column(Float)
|
open_rate = Column(Float)
|
||||||
close_rate = Column(Float)
|
close_rate = Column(Float)
|
||||||
close_profit = Column(Float)
|
close_profit = Column(Float)
|
||||||
@ -156,7 +158,7 @@ class Trade(_DECL_BASE):
|
|||||||
getcontext().prec = 8
|
getcontext().prec = 8
|
||||||
|
|
||||||
buy_trade = (Decimal(self.amount) * Decimal(self.open_rate))
|
buy_trade = (Decimal(self.amount) * Decimal(self.open_rate))
|
||||||
fees = buy_trade * Decimal(fee or self.fee)
|
fees = buy_trade * Decimal(fee or self.fee_open)
|
||||||
return float(buy_trade + fees)
|
return float(buy_trade + fees)
|
||||||
|
|
||||||
def calc_close_trade_price(
|
def calc_close_trade_price(
|
||||||
@ -177,7 +179,7 @@ class Trade(_DECL_BASE):
|
|||||||
return 0.0
|
return 0.0
|
||||||
|
|
||||||
sell_trade = (Decimal(self.amount) * Decimal(rate or self.close_rate))
|
sell_trade = (Decimal(self.amount) * Decimal(rate or self.close_rate))
|
||||||
fees = sell_trade * Decimal(fee or self.fee)
|
fees = sell_trade * Decimal(fee or self.fee_close)
|
||||||
return float(sell_trade - fees)
|
return float(sell_trade - fees)
|
||||||
|
|
||||||
def calc_profit(
|
def calc_profit(
|
||||||
@ -195,7 +197,7 @@ class Trade(_DECL_BASE):
|
|||||||
open_trade_price = self.calc_open_trade_price()
|
open_trade_price = self.calc_open_trade_price()
|
||||||
close_trade_price = self.calc_close_trade_price(
|
close_trade_price = self.calc_close_trade_price(
|
||||||
rate=(rate or self.close_rate),
|
rate=(rate or self.close_rate),
|
||||||
fee=(fee or self.fee)
|
fee=(fee or self.fee_close)
|
||||||
)
|
)
|
||||||
return float("{0:.8f}".format(close_trade_price - open_trade_price))
|
return float("{0:.8f}".format(close_trade_price - open_trade_price))
|
||||||
|
|
||||||
@ -215,7 +217,7 @@ class Trade(_DECL_BASE):
|
|||||||
open_trade_price = self.calc_open_trade_price()
|
open_trade_price = self.calc_open_trade_price()
|
||||||
close_trade_price = self.calc_close_trade_price(
|
close_trade_price = self.calc_close_trade_price(
|
||||||
rate=(rate or self.close_rate),
|
rate=(rate or self.close_rate),
|
||||||
fee=(fee or self.fee)
|
fee=(fee or self.fee_close)
|
||||||
)
|
)
|
||||||
|
|
||||||
return float("{0:.8f}".format((close_trade_price / open_trade_price) - 1))
|
return float("{0:.8f}".format((close_trade_price / open_trade_price) - 1))
|
||||||
|
Loading…
Reference in New Issue
Block a user