diff options
Diffstat (limited to 'market.py')
-rw-r--r-- | market.py | 161 |
1 files changed, 104 insertions, 57 deletions
@@ -26,7 +26,18 @@ def poloniex_fetch_balance(self, params={}): | |||
26 | return self.parse_balance(result) | 26 | return self.parse_balance(result) |
27 | ccxt.poloniex.fetch_balance = poloniex_fetch_balance | 27 | ccxt.poloniex.fetch_balance = poloniex_fetch_balance |
28 | 28 | ||
29 | def poloniex_fetch_margin_balances(self): | 29 | def 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 |
47 | ccxt.poloniex.fetch_margin_balances = poloniex_fetch_margin_balances | 58 | ccxt.poloniex.fetch_margin_balance = poloniex_fetch_margin_balance |
48 | |||
49 | def 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 | ||
59 | ccxt.poloniex.fetch_balance_with_margin = poloniex_fetch_balance_with_margin | ||
60 | |||
61 | 59 | ||
62 | def poloniex_fetch_balance_per_type(self): | 60 | def 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 |
73 | ccxt.poloniex.fetch_balance_per_type = poloniex_fetch_balance_per_type | 71 | ccxt.poloniex.fetch_balance_per_type = poloniex_fetch_balance_per_type |
74 | 72 | ||
73 | def 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 | ||
114 | ccxt.poloniex.fetch_all_balances = poloniex_fetch_all_balances | ||
115 | |||
75 | def poloniex_parse_ticker(self, ticker, market=None): | 116 | def 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 |
154 | ccxt.poloniex.transfer_balance = poloniex_transfer_balance | 195 | ccxt.poloniex.transfer_balance = poloniex_transfer_balance |
155 | 196 | ||
156 | # portfolio.market.create_order("DASH/BTC", "limit", "sell", 0.1, price=0.06828800, account="margin") | 197 | def 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'}, | 204 | ccxt.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 | 206 | def 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 | 221 | ccxt.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 | 223 | def 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 | } | ||
244 | ccxt.poloniex.margin_summary = poloniex_margin_summary | ||
198 | market = ccxt.poloniex({ | 245 | market = ccxt.poloniex({ |
199 | "apiKey": "XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX", | 246 | "apiKey": "XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX", |
200 | "secret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", | 247 | "secret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", |