From a620aa83527285b8b7e0ce85c072700474cbaf1d Mon Sep 17 00:00:00 2001
From: Matthias Voppichler <xmatthias@outlook.com>
Date: Sat, 21 Apr 2018 19:47:08 +0200
Subject: [PATCH] add columns fee_open and fee_close, update value

---
 freqtrade/freqtradebot.py | 38 ++++++++++++++++++++++++++++----------
 freqtrade/persistence.py  | 10 ++++++----
 2 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py
index bf1549e67..b6695ae50 100644
--- a/freqtrade/freqtradebot.py
+++ b/freqtrade/freqtradebot.py
@@ -316,11 +316,14 @@ class FreqtradeBot(object):
             )
         )
         # 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(
             pair=pair,
             stake_amount=stake_amount,
             amount=amount,
-            fee=exchange.get_fee(taker_or_maker='maker'),
+            fee=fee,
+            fee_open=fee,
+            fee_close=fee,
             open_rate=buy_limit,
             open_date=datetime.utcnow(),
             exchange=exchange.get_id(),
@@ -355,7 +358,19 @@ class FreqtradeBot(object):
         if trade.open_order_id:
             # Update trade with order values
             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:
             # Check if we can sell our current pair
@@ -374,18 +389,18 @@ class FreqtradeBot(object):
         if len(trades) == 0:
             raise OperationalException("get_real_amount: no trade found")
         amount = 0
-        fee = 0
+        fee_abs = 0
         for trade in trades:
             amount += trade["amount"]
             if "fee" in trade:
+                # only applies if fee is in quote 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:
             self.logger.warning("amount {} does not match amount {}".format(amount, order.amount))
             raise OperationalException("Half bought? Amounts don't match")
-        real_amount = amount - fee
+        real_amount = amount - fee_abs
         return real_amount
 
     def maybe_update_real_amount(self, trade: Trade) -> bool:
@@ -403,10 +418,12 @@ class FreqtradeBot(object):
             self.logger.warning("could not update trade amount: %s", exception)
             return False
         # updating amount
-        self.logger.info("Updating amount for Trade {} from {} to {}".format(
-                    trade, trade.amount, new_amount))
-        trade.amount = new_amount
-        Trade.session.flush()
+        if trade.amount != new_amount:
+            self.logger.info("Updating amount for Trade {} from {} to {}".format(
+                        trade, trade.amount, new_amount))
+            trade.amount = new_amount
+            trade.fee_open = 0  # Fee was applied - set to 0 for buy
+            Trade.session.flush()
         return True
 
     def handle_trade(self, trade: Trade) -> bool:
@@ -452,6 +469,7 @@ class FreqtradeBot(object):
 
             # Check if trade is still actually open
             if int(order['remaining']) == 0:
+                # self.maybe_update_real_amount(trade)
                 continue
 
             if order['side'] == 'buy' and ordertime < timeoutthreashold:
diff --git a/freqtrade/persistence.py b/freqtrade/persistence.py
index 55f53329a..6fea67c88 100644
--- a/freqtrade/persistence.py
+++ b/freqtrade/persistence.py
@@ -86,6 +86,8 @@ class Trade(_DECL_BASE):
     pair = Column(String, nullable=False)
     is_open = Column(Boolean, nullable=False, default=True)
     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)
     close_rate = Column(Float)
     close_profit = Column(Float)
@@ -156,7 +158,7 @@ class Trade(_DECL_BASE):
         getcontext().prec = 8
 
         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)
 
     def calc_close_trade_price(
@@ -177,7 +179,7 @@ class Trade(_DECL_BASE):
             return 0.0
 
         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)
 
     def calc_profit(
@@ -195,7 +197,7 @@ class Trade(_DECL_BASE):
         open_trade_price = self.calc_open_trade_price()
         close_trade_price = self.calc_close_trade_price(
             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))
 
@@ -215,7 +217,7 @@ class Trade(_DECL_BASE):
         open_trade_price = self.calc_open_trade_price()
         close_trade_price = self.calc_close_trade_price(
             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))