aboutsummaryrefslogtreecommitdiff
path: root/market.py
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2018-02-04 19:12:50 +0100
committerIsmaël Bouya <ismael.bouya@normalesup.org>2018-02-04 19:15:03 +0100
commit006a20846236ad365ec814f848f5fbf7e3dc7d3c (patch)
treefd28f7f278d7d5156f0b7a939b35507c2a6dc4ba /market.py
parent350ed24de673dc125be9e2fdecb0f1abc7835b41 (diff)
downloadTrader-006a20846236ad365ec814f848f5fbf7e3dc7d3c.tar.gz
Trader-006a20846236ad365ec814f848f5fbf7e3dc7d3c.tar.zst
Trader-006a20846236ad365ec814f848f5fbf7e3dc7d3c.zip
WIP: handle more balance information
Diffstat (limited to 'market.py')
-rw-r--r--market.py161
1 files changed, 104 insertions, 57 deletions
diff --git a/market.py b/market.py
index 1e1e083..979fbbf 100644
--- a/market.py
+++ b/market.py
@@ -26,7 +26,18 @@ def poloniex_fetch_balance(self, params={}):
26 return self.parse_balance(result) 26 return self.parse_balance(result)
27ccxt.poloniex.fetch_balance = poloniex_fetch_balance 27ccxt.poloniex.fetch_balance = poloniex_fetch_balance
28 28
29def poloniex_fetch_margin_balances(self): 29def poloniex_fetch_margin_balance(self):
30 """
31 portfolio.market.privatePostGetMarginPosition({"currencyPair": "BTC_DASH"})
32 See DASH/BTC positions
33 {'amount': '-0.10000000', -> DASH empruntés
34 'basePrice': '0.06818560', -> à ce prix là (0.06828800 demandé * (1-0.15%))
35 'lendingFees': '0.00000000', -> ce que je dois à mon créditeur
36 'liquidationPrice': '0.15107132', -> prix auquel ça sera liquidé (dépend de ce que j’ai déjà sur mon compte margin)
37 'pl': '-0.00000371', -> plus-value latente si je rachète tout de suite (négatif = perdu)
38 'total': '0.00681856', -> valeur totale empruntée en BTC
39 'type': 'short'}
40 """
30 positions = self.privatePostGetMarginPosition({"currencyPair": "all"}) 41 positions = self.privatePostGetMarginPosition({"currencyPair": "all"})
31 parsed = {} 42 parsed = {}
32 for symbol, position in positions.items(): 43 for symbol, position in positions.items():
@@ -41,23 +52,10 @@ def poloniex_fetch_margin_balances(self):
41 "liquidationPrice": decimal.Decimal(position["liquidationPrice"]), 52 "liquidationPrice": decimal.Decimal(position["liquidationPrice"]),
42 "type": position["type"], 53 "type": position["type"],
43 "total": decimal.Decimal(position["total"]), 54 "total": decimal.Decimal(position["total"]),
44 "base_currency": base_currency, 55 "baseCurrency": base_currency,
45 } 56 }
46 return parsed 57 return parsed
47ccxt.poloniex.fetch_margin_balances = poloniex_fetch_margin_balances 58ccxt.poloniex.fetch_margin_balance = poloniex_fetch_margin_balance
48
49def poloniex_fetch_balance_with_margin(self, params={}):
50 exchange_balance = self.fetch_balance(params=params)
51 margin_balances = self.fetch_margin_balances()
52
53 for currency, balance in margin_balances.items():
54 assert exchange_balance[currency]["total"] == 0
55 assert balance["type"] == "short"
56 exchange_balance[currency]["total"] = balance["amount"]
57 exchange_balance[currency]["marginPosition"] = balance
58 return exchange_balance
59ccxt.poloniex.fetch_balance_with_margin = poloniex_fetch_balance_with_margin
60
61 59
62def poloniex_fetch_balance_per_type(self): 60def poloniex_fetch_balance_per_type(self):
63 balances = self.privatePostReturnAvailableAccountBalances() 61 balances = self.privatePostReturnAvailableAccountBalances()
@@ -72,6 +70,49 @@ def poloniex_fetch_balance_per_type(self):
72 return result 70 return result
73ccxt.poloniex.fetch_balance_per_type = poloniex_fetch_balance_per_type 71ccxt.poloniex.fetch_balance_per_type = poloniex_fetch_balance_per_type
74 72
73def poloniex_fetch_all_balances(self):
74 exchange_balances = self.fetch_balance()
75 margin_balances = self.fetch_margin_balance()
76 balances_per_type = self.fetch_balance_per_type()
77
78 all_balances = {}
79 in_positions = {}
80
81 for currency, exchange_balance in exchange_balances.items():
82 if currency in ["info", "free", "used", "total"]:
83 continue
84
85 margin_balance = margin_balances.get(currency, {})
86 balance_per_type = balances_per_type.get(currency, {})
87
88 all_balances[currency] = {
89 "total": exchange_balance["total"] + margin_balance.get("amount", 0),
90 "exchange_used": exchange_balance["used"],
91 "exchange_total": exchange_balance["total"] - balance_per_type.get("margin", 0),
92 "exchange_free": exchange_balance["free"] - balance_per_type.get("margin", 0),
93 "margin_free": balance_per_type.get("margin", 0) + margin_balance.get("amount", 0),
94 "margin_borrowed": 0,
95 "margin_total": balance_per_type.get("margin", 0) + margin_balance.get("amount", 0),
96 "margin_lending_fees": margin_balance.get("lendingFees", 0),
97 "margin_pending_gain": margin_balance.get("pl", 0),
98 "margin_position_type": margin_balance.get("type", None),
99 "margin_liquidation_price": margin_balance.get("liquidationPrice", 0),
100 "margin_borrowed_base_price": margin_balance.get("total", 0),
101 "margin_borrowed_base_currency": margin_balance.get("baseCurrency", None),
102 }
103 if len(margin_balance) > 0:
104 if margin_balance["baseCurrency"] not in in_positions:
105 in_positions[margin_balance["baseCurrency"]] = 0
106 in_positions[margin_balance["baseCurrency"]] += margin_balance["total"]
107
108 for currency, in_position in in_positions.items():
109 all_balances[currency]["total"] += in_position
110 all_balances[currency]["margin_total"] += in_position
111 all_balances[currency]["margin_borrowed"] += in_position
112
113 return all_balances
114ccxt.poloniex.fetch_all_balances = poloniex_fetch_all_balances
115
75def poloniex_parse_ticker(self, ticker, market=None): 116def poloniex_parse_ticker(self, ticker, market=None):
76 timestamp = self.milliseconds() 117 timestamp = self.milliseconds()
77 symbol = None 118 symbol = None
@@ -153,48 +194,54 @@ def poloniex_transfer_balance(self, currency, amount, from_account, to_account):
153 return result["success"] == 1 194 return result["success"] == 1
154ccxt.poloniex.transfer_balance = poloniex_transfer_balance 195ccxt.poloniex.transfer_balance = poloniex_transfer_balance
155 196
156# portfolio.market.create_order("DASH/BTC", "limit", "sell", 0.1, price=0.06828800, account="margin") 197def poloniex_close_margin_position(self, currency, base_currency):
157 198 """
158# portfolio.market.privatePostReturnTradableBalances() 199 closeMarginPosition({"currencyPair": "BTC_DASH"})
159# Returns tradable balances in margin 200 fermer la position au prix du marché
160# 'BTC_DASH': {'BTC': '0.01266999', 'DASH': '0.08574839'}, 201 """
161# Je peux emprunter jusqu’à 0.08574839 DASH ou 0.01266999 BTC (une position est 202 symbol = "{}_{}".format(base_currency, currency)
162# déjà ouverte) 203 self.privatePostCloseMarginPosition({"currencyPair": symbol})
163# 'BTC_CLAM': {'BTC': '0.00585143', 'CLAM': '7.79300395'}, 204ccxt.poloniex.close_margin_position = poloniex_close_margin_position
164# Je peux emprunter 7.7 CLAM pour les vendre contre des BTC, ou emprunter 205
165# 0.00585143 BTC pour acheter des CLAM 206def poloniex_tradable_balances(self):
166 207 """
167# portfolio.market.privatePostReturnMarginAccountSummary() 208 portfolio.market.privatePostReturnTradableBalances()
168# Returns current informations for margin 209 Returns tradable balances in margin
169# {'currentMargin': '1.49680968', -> marge (ne doit pas descendre sous 20% / 0.2) 210 'BTC_DASH': {'BTC': '0.01266999', 'DASH': '0.08574839'},
170# = netValue / totalBorrowedValue 211 Je peux emprunter jusqu’à 0.08574839 DASH ou 0.01266999 BTC (une position est déjà ouverte)
171# 'lendingFees': '0.00000000', -> fees totaux 212 'BTC_CLAM': {'BTC': '0.00585143', 'CLAM': '7.79300395'},
172# 'netValue': '0.01008254', -> balance + plus-value 213 Je peux emprunter 7.7 CLAM pour les vendre contre des BTC, ou emprunter 0.00585143 BTC pour acheter des CLAM
173# 'pl': '0.00008254', -> plus value latente (somme des positions) 214 """
174# 'totalBorrowedValue': '0.00673602', -> valeur en BTC empruntée 215
175# 'totalValue': '0.01000000'} -> valeur totale en compte 216 tradable_balances = self.privatePostReturnTradableBalances()
176 217 for symbol, balances in tradable_balances.items():
177 218 for currency, balance in balances.items():
178# portfolio.market.privatePostGetMarginPosition({"currencyPair": "BTC_DASH"}) 219 balances[currency] = decimal.Decimal(balance)
179# See DASH/BTC positions 220 return tradable_balances
180# {'amount': '-0.10000000', -> DASH empruntés 221ccxt.poloniex.fetch_tradable_balances = poloniex_tradable_balances
181# 'basePrice': '0.06818560', -> à ce prix là (0.06828800 demandé * (1-0.15%)) 222
182# 'lendingFees': '0.00000000', -> ce que je dois à mon créditeur 223def poloniex_margin_summary(self):
183# 'liquidationPrice': '0.15107132', -> prix auquel ça sera liquidé (dépend de ce que j’ai déjà sur mon compte margin) 224 """
184# 'pl': '-0.00000371', -> plus-value latente si je rachète tout de suite (négatif = perdu) 225 portfolio.market.privatePostReturnMarginAccountSummary()
185# 'total': '0.00681856', -> valeur totale empruntée en BTC 226 Returns current informations for margin
186# 'type': 'short'} 227 {'currentMargin': '1.49680968', -> marge (ne doit pas descendre sous 20% / 0.2)
187 228 = netValue / totalBorrowedValue
188 229 'lendingFees': '0.00000000', -> fees totaux
189# closeMarginPosition({"currencyPair": "BTC_DASH"}) : fermer la position au prix 230 'netValue': '0.01008254', -> balance + plus-value
190# du marché 231 'pl': '0.00008254', -> plus value latente (somme des positions)
191# Nécessaire à la fin 232 'totalBorrowedValue': '0.00673602', -> valeur en BTC empruntée
192# portfolio.market.create_order("DASH/BTC", "limit", "buy", 0.1, price=0.06726487, account="margin") 233 'totalValue': '0.01000000'} -> valeur totale en compte
193 234 """
194# portfolio.market.fetch_balance_per_type() 235 summary = self.privatePostReturnMarginAccountSummary()
195# Ne suffit pas pour calculer les positions: ne contient que les 0.01 envoyés
196# TODO: vérifier si fetch_balance marque ces 0.01 comme disponibles -> oui
197 236
237 return {
238 "current_margin": decimal.Decimal(summary["currentMargin"]),
239 "lending_fees": decimal.Decimal(summary["lendingFees"]),
240 "gains": decimal.Decimal(summary["pl"]),
241 "total_borrowed": decimal.Decimal(summary["totalBorrowedValue"]),
242 "total": decimal.Decimal(summary["totalValue"]),
243 }
244ccxt.poloniex.margin_summary = poloniex_margin_summary
198market = ccxt.poloniex({ 245market = ccxt.poloniex({
199 "apiKey": "XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX", 246 "apiKey": "XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX",
200 "secret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", 247 "secret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",