]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git/blob - market.py
Add first steps for margin trading
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git] / market.py
1 import ccxt
2 import decimal
3
4 def exchange_sum(self, *args):
5 return sum([arg for arg in args if isinstance(arg, (float, int, decimal.Decimal))])
6 ccxt.Exchange.sum = exchange_sum
7 def poloniex_fetch_balance(self, params={}):
8 self.load_markets()
9 balances = self.privatePostReturnCompleteBalances(self.extend({
10 'account': 'all',
11 }, params))
12 result = {'info': balances}
13 currencies = list(balances.keys())
14 for c in range(0, len(currencies)):
15 id = currencies[c]
16 balance = balances[id]
17 currency = self.common_currency_code(id)
18 account = {
19 'free': decimal.Decimal(balance['available']),
20 'used': decimal.Decimal(balance['onOrders']),
21 'total': decimal.Decimal(0.0),
22 }
23 account['total'] = self.sum(account['free'], account['used'])
24 result[currency] = account
25 return self.parse_balance(result)
26 ccxt.poloniex.fetch_balance = poloniex_fetch_balance
27
28 def poloniex_fetch_balance_per_type(self):
29 balances = self.privatePostReturnAvailableAccountBalances()
30 result = {'info': balances}
31 for key, balance in balances.items():
32 result[key] = {}
33 for currency, amount in balance.items():
34 if currency not in result:
35 result[currency] = {}
36 result[currency][key] = decimal.Decimal(amount)
37 result[key][currency] = decimal.Decimal(amount)
38 return result
39 ccxt.poloniex.fetch_balance_per_type = poloniex_fetch_balance_per_type
40
41 def poloniex_parse_ticker(self, ticker, market=None):
42 timestamp = self.milliseconds()
43 symbol = None
44 if market:
45 symbol = market['symbol']
46 return {
47 'symbol': symbol,
48 'timestamp': timestamp,
49 'datetime': self.iso8601(timestamp),
50 'high': decimal.Decimal(ticker['high24hr']),
51 'low': decimal.Decimal(ticker['low24hr']),
52 'bid': decimal.Decimal(ticker['highestBid']),
53 'ask': decimal.Decimal(ticker['lowestAsk']),
54 'vwap': None,
55 'open': None,
56 'close': None,
57 'first': None,
58 'last': decimal.Decimal(ticker['last']),
59 'change': decimal.Decimal(ticker['percentChange']),
60 'percentage': None,
61 'average': None,
62 'baseVolume': decimal.Decimal(ticker['quoteVolume']),
63 'quoteVolume': decimal.Decimal(ticker['baseVolume']),
64 'info': ticker,
65 }
66 ccxt.poloniex.parse_ticker = poloniex_parse_ticker
67
68 def poloniex_create_margin_order(self, symbol, type, side, amount, price=None, lending_rate=None, params={}):
69 if type == 'market':
70 raise ccxt.ExchangeError(self.id + ' allows limit orders only')
71 self.load_markets()
72 method = 'privatePostMargin' + self.capitalize(side)
73 market = self.market(symbol)
74 price = float(price)
75 amount = float(amount)
76 if lending_rate is not None:
77 params = self.extend({"lendingRate": lending_rate}, params)
78 response = getattr(self, method)(self.extend({
79 'currencyPair': market['id'],
80 'rate': self.price_to_precision(symbol, price),
81 'amount': self.amount_to_precision(symbol, amount),
82 }, params))
83 timestamp = self.milliseconds()
84 order = self.parse_order(self.extend({
85 'timestamp': timestamp,
86 'status': 'open',
87 'type': type,
88 'side': side,
89 'price': price,
90 'amount': amount,
91 }, response), market)
92 id = order['id']
93 self.orders[id] = order
94 return self.extend({'info': response}, order)
95
96 def poloniex_create_order(self, symbol, type, side, amount, price=None, account="exchange", lending_rate=None, params={}):
97 if account == "exchange":
98 return self.create_exchange_order(symbol, type, side, amount, price=price, params=params)
99 elif account == "margin":
100 return self.create_margin_order(symbol, type, side, amount, price=price, lending_rate=lending_rate, params=params)
101 else:
102 raise NotImplementedError
103 ccxt.poloniex.create_exchange_order = ccxt.poloniex.create_order
104 ccxt.poloniex.create_order = poloniex_create_order
105
106 market = ccxt.poloniex({
107 "apiKey": "XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX",
108 "secret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
109 })
110