From ecba11139e357567c46f7ba2a0cf8dbd98266fe8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Isma=C3=ABl=20Bouya?= Date: Fri, 26 Jan 2018 00:10:03 +0100 Subject: [PATCH] Add first steps for margin trading --- market.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ portfolio.py | 13 +++++++------ test.py | 3 +-- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/market.py b/market.py index 63eff5a..1601e2d 100644 --- a/market.py +++ b/market.py @@ -25,6 +25,19 @@ def poloniex_fetch_balance(self, params={}): return self.parse_balance(result) ccxt.poloniex.fetch_balance = poloniex_fetch_balance +def poloniex_fetch_balance_per_type(self): + balances = self.privatePostReturnAvailableAccountBalances() + result = {'info': balances} + for key, balance in balances.items(): + result[key] = {} + for currency, amount in balance.items(): + if currency not in result: + result[currency] = {} + result[currency][key] = decimal.Decimal(amount) + result[key][currency] = decimal.Decimal(amount) + return result +ccxt.poloniex.fetch_balance_per_type = poloniex_fetch_balance_per_type + def poloniex_parse_ticker(self, ticker, market=None): timestamp = self.milliseconds() symbol = None @@ -51,7 +64,47 @@ def poloniex_parse_ticker(self, ticker, market=None): 'info': ticker, } ccxt.poloniex.parse_ticker = poloniex_parse_ticker + +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) + +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 +ccxt.poloniex.create_exchange_order = ccxt.poloniex.create_order +ccxt.poloniex.create_order = poloniex_create_order + market = ccxt.poloniex({ "apiKey": "XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX", "secret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", }) + diff --git a/portfolio.py b/portfolio.py index 1fe56b5..3257bcf 100644 --- a/portfolio.py +++ b/portfolio.py @@ -467,12 +467,13 @@ class Trade: print("\t", order, sep="") class Order: - def __init__(self, action, amount, rate, base_currency, market): + def __init__(self, action, amount, rate, base_currency, market, account="exchange"): self.action = action self.amount = amount self.rate = rate self.base_currency = base_currency self.market = market + self.account = account self.result = None self.status = "pending" @@ -498,16 +499,16 @@ class Order: amount = self.amount.value if debug: - print("market.create_order('{}', 'limit', '{}', {}, price={})".format( - symbol, self.action, amount, self.rate)) + print("market.create_order('{}', 'limit', '{}', {}, price={}, account={})".format( + symbol, self.action, amount, self.rate, self.account)) else: try: - self.result = self.market.create_order(symbol, 'limit', self.action, amount, price=self.rate) + self.result = self.market.create_order(symbol, 'limit', self.action, amount, price=self.rate, account=self.account) self.status = "open" except Exception as e: self.status = "error" - print("error when running market.create_order('{}', 'limit', '{}', {}, price={})".format( - symbol, self.action, amount, self.rate)) + print("error when running market.create_order('{}', 'limit', '{}', {}, price={}, account={})".format( + symbol, self.action, amount, self.rate, self.account)) self.error_message = str("{}: {}".format(e.__class__.__name__, e)) print(self.error_message) diff --git a/test.py b/test.py index b747617..8a6ba50 100644 --- a/test.py +++ b/test.py @@ -676,7 +676,7 @@ class AcceptanceTest(unittest.TestCase): self.assertEqual(D("0.00003003"), all_orders[1].rate) - def create_order(symbol, type, action, amount, price=None): + def create_order(symbol, type, action, amount, price=None, account="exchange"): self.assertEqual("limit", type) if symbol == "ETH/BTC": self.assertEqual("sell", action) @@ -771,7 +771,6 @@ class AcceptanceTest(unittest.TestCase): # Action 6 portfolio.Trade.prepare_orders(only="buy", compute_value=lambda x, y: x["ask"]) - all_orders = portfolio.Trade.all_orders(state="pending") self.assertEqual(3, len(all_orders)) self.assertEqual(portfolio.Amount("ETC", D("38.5")/3), all_orders[0].amount) -- 2.41.0