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
={}):
9 balances
= self
.privatePostReturnCompleteBalances(self
.extend({
12 result
= {'info': balances}
13 currencies
= list(balances
.keys())
14 for c
in range(0, len(currencies
)):
16 balance
= balances
[id]
17 currency
= self
.common_currency_code(id)
19 'free': decimal
.Decimal(balance
['available']),
20 'used': decimal
.Decimal(balance
['onOrders']),
21 'total': decimal
.Decimal(0.0),
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
28 def poloniex_fetch_balance_per_type(self
):
29 balances
= self
.privatePostReturnAvailableAccountBalances()
30 result
= {'info': balances}
31 for key
, balance
in balances
.items():
33 for currency
, amount
in balance
.items():
34 if currency
not in result
:
36 result
[currency
][key
] = decimal
.Decimal(amount
)
37 result
[key
][currency
] = decimal
.Decimal(amount
)
39 ccxt
.poloniex
.fetch_balance_per_type
= poloniex_fetch_balance_per_type
41 def poloniex_parse_ticker(self
, ticker
, market
=None):
42 timestamp
= self
.milliseconds()
45 symbol
= market
['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']),
58 'last': decimal
.Decimal(ticker
['last']),
59 'change': decimal
.Decimal(ticker
['percentChange']),
62 'baseVolume': decimal
.Decimal(ticker
['quoteVolume']),
63 'quoteVolume': decimal
.Decimal(ticker
['baseVolume']),
66 ccxt
.poloniex
.parse_ticker
= poloniex_parse_ticker
68 def poloniex_create_margin_order(self
, symbol
, type, side
, amount
, price
=None, lending_rate
=None, params
={}):
70 raise ccxt
.ExchangeError(self
.id + ' allows limit orders only')
72 method
= 'privatePostMargin' + self
.capitalize(side
)
73 market
= self
.market(symbol
)
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
),
83 timestamp
= self
.milliseconds()
84 order
= self
.parse_order(self
.extend({
85 'timestamp': timestamp
,
93 self
.orders
[id] = order
94 return self
.extend({'info': response}
, order
)
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
)
102 raise NotImplementedError
103 ccxt
.poloniex
.create_exchange_order
= ccxt
.poloniex
.create_order
104 ccxt
.poloniex
.create_order
= poloniex_create_order
106 market
= ccxt
.poloniex({
107 "apiKey": "XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX",
108 "secret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",