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
'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",
})
+
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"
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)
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)
# 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)