aboutsummaryrefslogtreecommitdiff
path: root/store.py
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2018-03-01 13:14:41 +0100
committerIsmaël Bouya <ismael.bouya@normalesup.org>2018-03-01 13:14:41 +0100
commitaca4d4372553110ab5d76740ff536de83d5617b2 (patch)
treea9bfdca4226daf422273da97a9e139721469c9f1 /store.py
parent2033e7fef780298be2ec15455a0ec1d26515de55 (diff)
downloadTrader-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.py17
1 files changed, 14 insertions, 3 deletions
diff --git a/store.py b/store.py
index bebd127..c581608 100644
--- a/store.py
+++ b/store.py
@@ -2,6 +2,7 @@ import portfolio
2import simplejson as json 2import simplejson as json
3from decimal import Decimal as D, ROUND_DOWN 3from decimal import Decimal as D, ROUND_DOWN
4from datetime import date, datetime 4from datetime import date, datetime
5import 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)