diff options
author | Ismaël Bouya <ismael.bouya@normalesup.org> | 2018-06-11 00:38:37 +0200 |
---|---|---|
committer | Ismaël Bouya <ismael.bouya@normalesup.org> | 2018-06-11 00:38:37 +0200 |
commit | 3d6f74ee1a8b061e4b274dad70125ab6388f4d83 (patch) | |
tree | cd718866b15b6ff8de3d6b95b6e156ae25c17c20 /store.py | |
parent | e24df7cffc01937a211db2d29f44bccc3d740bd5 (diff) | |
download | Trader-3d6f74ee1a8b061e4b274dad70125ab6388f4d83.tar.gz Trader-3d6f74ee1a8b061e4b274dad70125ab6388f4d83.tar.zst Trader-3d6f74ee1a8b061e4b274dad70125ab6388f4d83.zip |
Fix available balance when buying
Diffstat (limited to 'store.py')
-rw-r--r-- | store.py | 45 |
1 files changed, 44 insertions, 1 deletions
@@ -325,6 +325,49 @@ class BalanceStore: | |||
325 | else: | 325 | else: |
326 | self.market.report.log_balances(tag=tag, checkpoint=checkpoint) | 326 | self.market.report.log_balances(tag=tag, checkpoint=checkpoint) |
327 | 327 | ||
328 | def available_balances_for_repartition(self, | ||
329 | compute_value="average", base_currency="BTC", | ||
330 | liquidity="medium", repartition=None): | ||
331 | if repartition is None: | ||
332 | repartition = Portfolio.repartition(liquidity=liquidity) | ||
333 | base_currency_balance = self.all.get(base_currency) | ||
334 | |||
335 | if base_currency_balance is None: | ||
336 | total_base_value = portfolio.Amount(base_currency, 0) | ||
337 | else: | ||
338 | total_base_value = base_currency_balance.exchange_free + \ | ||
339 | base_currency_balance.margin_available - \ | ||
340 | base_currency_balance.margin_in_position | ||
341 | |||
342 | amount_in_position = {} | ||
343 | |||
344 | # Compute balances already in the target position | ||
345 | for currency, (ptt, trade_type) in repartition.items(): | ||
346 | amount_in_position[currency] = portfolio.Amount(base_currency, 0) | ||
347 | balance = self.all.get(currency) | ||
348 | if currency != base_currency and balance is not None: | ||
349 | if trade_type == "short": | ||
350 | amount = balance.margin_borrowed | ||
351 | else: | ||
352 | amount = balance.exchange_free + balance.exchange_used | ||
353 | amount_in_position[currency] = amount.in_currency(base_currency, | ||
354 | self.market, compute_value=compute_value) | ||
355 | total_base_value += amount_in_position[currency] | ||
356 | |||
357 | # recursively delete more-than-filled positions from the wanted | ||
358 | # repartition | ||
359 | did_delete = True | ||
360 | while did_delete: | ||
361 | did_delete = False | ||
362 | sum_ratio = sum([v[0] for k, v in repartition.items()]) | ||
363 | current_base_value = total_base_value | ||
364 | for currency, (ptt, trade_type) in repartition.copy().items(): | ||
365 | if amount_in_position[currency] > current_base_value * ptt / sum_ratio: | ||
366 | did_delete = True | ||
367 | del(repartition[currency]) | ||
368 | total_base_value -= amount_in_position[currency] | ||
369 | return repartition, total_base_value, amount_in_position | ||
370 | |||
328 | def dispatch_assets(self, amount, liquidity="medium", repartition=None): | 371 | def dispatch_assets(self, amount, liquidity="medium", repartition=None): |
329 | if repartition is None: | 372 | if repartition is None: |
330 | repartition = Portfolio.repartition(liquidity=liquidity) | 373 | repartition = Portfolio.repartition(liquidity=liquidity) |
@@ -521,7 +564,7 @@ class Portfolio: | |||
521 | cls.retrieve_cryptoportfolio() | 564 | cls.retrieve_cryptoportfolio() |
522 | cls.get_cryptoportfolio() | 565 | cls.get_cryptoportfolio() |
523 | liquidities = cls.liquidities.get(liquidity) | 566 | liquidities = cls.liquidities.get(liquidity) |
524 | return liquidities[cls.last_date.get()] | 567 | return liquidities[cls.last_date.get()].copy() |
525 | 568 | ||
526 | @classmethod | 569 | @classmethod |
527 | def get_cryptoportfolio(cls, refetch=False): | 570 | def get_cryptoportfolio(cls, refetch=False): |