+
+def poloniex_create_margin_order(self, symbol, type, side, amount, price=None, lending_rate=None, params={}):
+ if type == 'market':
+ raise ccxt.ExchangeError(self.id + ' allows limit orders only')
+ self.load_markets()
+ method = 'privatePostMargin' + self.capitalize(side)
+ market = self.market(symbol)
+ price = float(price)
+ amount = float(amount)
+ if lending_rate is not None:
+ params = self.extend({"lendingRate": lending_rate}, params)
+ response = getattr(self, method)(self.extend({
+ 'currencyPair': market['id'],
+ 'rate': self.price_to_precision(symbol, price),
+ 'amount': self.amount_to_precision(symbol, amount),
+ }, params))
+ timestamp = self.milliseconds()
+ order = self.parse_order(self.extend({
+ 'timestamp': timestamp,
+ 'status': 'open',
+ 'type': type,
+ 'side': side,
+ 'price': price,
+ 'amount': amount,
+ }, response), market)
+ id = order['id']
+ self.orders[id] = order
+ return self.extend({'info': response}, order)
+ccxt.poloniex.create_margin_order = poloniex_create_margin_order
+
+def poloniex_create_order(self, symbol, type, side, amount, price=None, account="exchange", lending_rate=None, params={}):
+ if account == "exchange":
+ return self.create_exchange_order(symbol, type, side, amount, price=price, params=params)
+ elif account == "margin":
+ return self.create_margin_order(symbol, type, side, amount, price=price, lending_rate=lending_rate, params=params)
+ else:
+ raise NotImplementedError
+
+def poloniex_order_precision(self, symbol):
+ return 8
+
+ccxt.poloniex.create_exchange_order = ccxt.poloniex.create_order
+ccxt.poloniex.create_order = poloniex_create_order
+ccxt.poloniex.order_precision = poloniex_order_precision
+
+def poloniex_transfer_balance(self, currency, amount, from_account, to_account):
+ result = self.privatePostTransferBalance({
+ "currency": currency,
+ "amount": amount,
+ "fromAccount": from_account,
+ "toAccount": to_account,
+ "confirmed": 1})
+ return result["success"] == 1
+ccxt.poloniex.transfer_balance = poloniex_transfer_balance
+
+def poloniex_close_margin_position(self, currency, base_currency):
+ """
+ closeMarginPosition({"currencyPair": "BTC_DASH"})
+ fermer la position au prix du marché
+ """
+ symbol = "{}_{}".format(base_currency, currency)
+ self.privatePostCloseMarginPosition({"currencyPair": symbol})
+ccxt.poloniex.close_margin_position = poloniex_close_margin_position
+
+def poloniex_tradable_balances(self):
+ """
+ portfolio.market.privatePostReturnTradableBalances()
+ Returns tradable balances in margin
+ 'BTC_DASH': {'BTC': '0.01266999', 'DASH': '0.08574839'},
+ Je peux emprunter jusqu’à 0.08574839 DASH ou 0.01266999 BTC (une position est déjà ouverte)
+ 'BTC_CLAM': {'BTC': '0.00585143', 'CLAM': '7.79300395'},
+ Je peux emprunter 7.7 CLAM pour les vendre contre des BTC, ou emprunter 0.00585143 BTC pour acheter des CLAM
+ """
+
+ tradable_balances = self.privatePostReturnTradableBalances()
+ for symbol, balances in tradable_balances.items():
+ for currency, balance in balances.items():
+ balances[currency] = decimal.Decimal(balance)
+ return tradable_balances
+ccxt.poloniex.fetch_tradable_balances = poloniex_tradable_balances
+
+def poloniex_margin_summary(self):
+ """
+ portfolio.market.privatePostReturnMarginAccountSummary()
+ Returns current informations for margin
+ {'currentMargin': '1.49680968', -> marge (ne doit pas descendre sous 20% / 0.2)
+ = netValue / totalBorrowedValue
+ 'lendingFees': '0.00000000', -> fees totaux
+ 'netValue': '0.01008254', -> balance + plus-value
+ 'pl': '0.00008254', -> plus value latente (somme des positions)
+ 'totalBorrowedValue': '0.00673602', -> valeur en BTC empruntée
+ 'totalValue': '0.01000000'} -> valeur totale en compte
+ """
+ summary = self.privatePostReturnMarginAccountSummary()
+
+ return {
+ "current_margin": decimal.Decimal(summary["currentMargin"]),
+ "lending_fees": decimal.Decimal(summary["lendingFees"]),
+ "gains": decimal.Decimal(summary["pl"]),
+ "total_borrowed": decimal.Decimal(summary["totalBorrowedValue"]),
+ "total": decimal.Decimal(summary["totalValue"]),
+ }
+ccxt.poloniex.margin_summary = poloniex_margin_summary