diff options
author | Ismaël Bouya <ismael.bouya@normalesup.org> | 2018-03-01 13:14:41 +0100 |
---|---|---|
committer | Ismaël Bouya <ismael.bouya@normalesup.org> | 2018-03-01 13:14:41 +0100 |
commit | aca4d4372553110ab5d76740ff536de83d5617b2 (patch) | |
tree | a9bfdca4226daf422273da97a9e139721469c9f1 /store.py | |
parent | 2033e7fef780298be2ec15455a0ec1d26515de55 (diff) | |
download | Trader-aca4d4372553110ab5d76740ff536de83d5617b2.tar.gz Trader-aca4d4372553110ab5d76740ff536de83d5617b2.tar.zst Trader-aca4d4372553110ab5d76740ff536de83d5617b2.zip |
Various fixes/improvementsv0.3
- Use pending gains to compute the move_balance
- Use ttl_cache for tickers
Diffstat (limited to 'store.py')
-rw-r--r-- | store.py | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -2,6 +2,7 @@ import portfolio | |||
2 | import simplejson as json | 2 | import simplejson as json |
3 | from decimal import Decimal as D, ROUND_DOWN | 3 | from decimal import Decimal as D, ROUND_DOWN |
4 | from datetime import date, datetime | 4 | from datetime import date, datetime |
5 | import inspect | ||
5 | 6 | ||
6 | __all__ = ["BalanceStore", "ReportStore", "TradeStore"] | 7 | __all__ = ["BalanceStore", "ReportStore", "TradeStore"] |
7 | 8 | ||
@@ -55,6 +56,9 @@ class ReportStore: | |||
55 | compute_value, type): | 56 | compute_value, type): |
56 | values = {} | 57 | values = {} |
57 | rates = {} | 58 | rates = {} |
59 | if callable(compute_value): | ||
60 | compute_value = inspect.getsource(compute_value).strip() | ||
61 | |||
58 | for currency, amount in amounts.items(): | 62 | for currency, amount in amounts.items(): |
59 | values[currency] = amount.as_json()["value"] | 63 | values[currency] = amount.as_json()["value"] |
60 | rates[currency] = amount.rate | 64 | rates[currency] = amount.rate |
@@ -92,6 +96,8 @@ class ReportStore: | |||
92 | }) | 96 | }) |
93 | 97 | ||
94 | def log_orders(self, orders, tick=None, only=None, compute_value=None): | 98 | def log_orders(self, orders, tick=None, only=None, compute_value=None): |
99 | if callable(compute_value): | ||
100 | compute_value = inspect.getsource(compute_value).strip() | ||
95 | self.print_log("[Orders]") | 101 | self.print_log("[Orders]") |
96 | self.market.trades.print_all_with_order(ind="\t") | 102 | self.market.trades.print_all_with_order(ind="\t") |
97 | self.add_log({ | 103 | self.add_log({ |
@@ -104,6 +110,8 @@ class ReportStore: | |||
104 | 110 | ||
105 | def log_order(self, order, tick, finished=False, update=None, | 111 | def log_order(self, order, tick, finished=False, update=None, |
106 | new_order=None, compute_value=None): | 112 | new_order=None, compute_value=None): |
113 | if callable(compute_value): | ||
114 | compute_value = inspect.getsource(compute_value).strip() | ||
107 | if finished: | 115 | if finished: |
108 | self.print_log("[Order] Finished {}".format(order)) | 116 | self.print_log("[Order] Finished {}".format(order)) |
109 | elif update == "waiting": | 117 | elif update == "waiting": |
@@ -201,8 +209,7 @@ class BalanceStore: | |||
201 | amounts[currency] = ptt * amount / sum_ratio | 209 | amounts[currency] = ptt * amount / sum_ratio |
202 | if trade_type == "short": | 210 | if trade_type == "short": |
203 | amounts[currency] = - amounts[currency] | 211 | amounts[currency] = - amounts[currency] |
204 | if currency not in self.all: | 212 | self.all.setdefault(currency, portfolio.Balance(currency, {})) |
205 | self.all[currency] = portfolio.Balance(currency, {}) | ||
206 | self.market.report.log_dispatch(amount, amounts, liquidity, repartition) | 213 | self.market.report.log_dispatch(amount, amounts, liquidity, repartition) |
207 | return amounts | 214 | return amounts |
208 | 215 | ||
@@ -214,6 +221,10 @@ class TradeStore: | |||
214 | self.market = market | 221 | self.market = market |
215 | self.all = [] | 222 | self.all = [] |
216 | 223 | ||
224 | @property | ||
225 | def pending(self): | ||
226 | return list(filter(lambda t: not t.is_fullfiled, self.all)) | ||
227 | |||
217 | def compute_trades(self, values_in_base, new_repartition, only=None): | 228 | def compute_trades(self, values_in_base, new_repartition, only=None): |
218 | computed_trades = [] | 229 | computed_trades = [] |
219 | base_currency = sum(values_in_base.values()).currency | 230 | base_currency = sum(values_in_base.values()).currency |
@@ -248,7 +259,7 @@ class TradeStore: | |||
248 | 259 | ||
249 | def prepare_orders(self, only=None, compute_value="default"): | 260 | def prepare_orders(self, only=None, compute_value="default"): |
250 | orders = [] | 261 | orders = [] |
251 | for trade in self.all: | 262 | for trade in self.pending: |
252 | if only is None or trade.action == only: | 263 | if only is None or trade.action == only: |
253 | orders.append(trade.prepare_order(compute_value=compute_value)) | 264 | orders.append(trade.prepare_order(compute_value=compute_value)) |
254 | self.market.report.log_orders(orders, only, compute_value) | 265 | self.market.report.log_orders(orders, only, compute_value) |