Skip to content

Commit 5e624bc

Browse files
committed
[Scripted] properly handle last_call_by_time_frames
tmp tmp
1 parent c655ba5 commit 5e624bc

File tree

1 file changed

+89
-24
lines changed

1 file changed

+89
-24
lines changed

octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py

+89-24
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,20 @@ async def start_over_database(self):
117117
self.symbol)
118118
symbol_db.set_initialized_flags(False)
119119
for producer in self.producers:
120-
for time_frame, call_args in producer.last_call_by_timeframe.items():
121-
run_db = databases.RunDatabasesProvider.instance().get_run_db(self.bot_id)
122-
await producer.init_user_inputs(False)
123-
run_db.set_initialized_flags(False, (time_frame, ))
124-
await databases.CacheManager().close_cache(commons_constants.UNPROVIDED_CACHE_IDENTIFIER,
125-
reset_cache_db_ids=True)
126-
await producer.call_script(*call_args)
127-
await run_db.flush()
120+
for time_frame, call_args_by_symbols in producer.last_calls_by_time_frame_and_symbol.items():
121+
if self.symbol in call_args_by_symbols:
122+
run_db = databases.RunDatabasesProvider.instance().get_run_db(self.bot_id)
123+
await producer.init_user_inputs(False)
124+
run_db.set_initialized_flags(False, (time_frame, ))
125+
await databases.CacheManager().close_cache(commons_constants.UNPROVIDED_CACHE_IDENTIFIER,
126+
reset_cache_db_ids=True)
127+
await producer.call_script(*call_args_by_symbols[self.symbol])
128+
await run_db.flush()
129+
else:
130+
raise RuntimeError(
131+
f"Failed to reload trading mode as {self.symbol}"
132+
"is not initialized"
133+
)
128134

129135
def set_initialized_trading_pair_by_bot_id(self, symbol, time_frame, initialized):
130136
# todo migrate to event tree
@@ -164,7 +170,7 @@ class AbstractScriptedTradingModeProducer(modes_channel.AbstractTradingModeProdu
164170

165171
def __init__(self, channel, config, trading_mode, exchange_manager):
166172
super().__init__(channel, config, trading_mode, exchange_manager)
167-
self.last_call_by_timeframe = {}
173+
self.last_calls_by_time_frame_and_symbol = {}
168174

169175
async def start(self) -> None:
170176
await super().start()
@@ -222,23 +228,60 @@ async def ohlcv_callback(self, exchange: str, exchange_id: str, cryptocurrency:
222228
trigger_time = candle[commons_enums.PriceIndexes.IND_PRICE_TIME.value] + \
223229
commons_enums.TimeFramesMinutes[commons_enums.TimeFrames(time_frame)] * \
224230
commons_constants.MINUTE_TO_SECONDS
225-
await self.call_script(self.matrix_id, cryptocurrency, symbol, time_frame,
226-
commons_enums.TriggerSource.OHLCV.value,
227-
trigger_time,
228-
candle=candle,
229-
init_call=init_call)
231+
self.log_last_call_by_time_frame_and_symbol(
232+
matrix_id=self.matrix_id,
233+
cryptocurrency=cryptocurrency,
234+
symbol=symbol,
235+
time_frame=time_frame,
236+
trigger_source=commons_enums.TriggerSource.OHLCV.value,
237+
trigger_cache_timestamp=trigger_time,
238+
candle=candle
239+
)
240+
await self.call_script(
241+
matrix_id=self.matrix_id, cryptocurrency=cryptocurrency,
242+
symbol=symbol, time_frame=time_frame,
243+
trigger_source=commons_enums.TriggerSource.OHLCV.value,
244+
trigger_cache_timestamp=trigger_time,
245+
candle=candle, init_call=init_call)
230246

231247
async def kline_callback(self, exchange: str, exchange_id: str, cryptocurrency: str, symbol: str,
232248
time_frame, kline: dict):
233249
async with self.trading_mode_trigger(), self.trading_mode.remote_signal_publisher(symbol):
234-
await self.call_script(self.matrix_id, cryptocurrency, symbol, time_frame,
235-
commons_enums.TriggerSource.KLINE.value,
236-
kline[commons_enums.PriceIndexes.IND_PRICE_TIME.value],
237-
kline=kline)
238-
239-
async def set_final_eval(self, matrix_id: str, cryptocurrency: str, symbol: str, time_frame, trigger_source: str):
240-
await self.call_script(matrix_id, cryptocurrency, symbol, time_frame, trigger_source,
241-
self._get_latest_eval_time(matrix_id, cryptocurrency, symbol, time_frame))
250+
self.log_last_call_by_time_frame_and_symbol(
251+
matrix_id=self.matrix_id,
252+
cryptocurrency=cryptocurrency,
253+
symbol=symbol,
254+
time_frame=time_frame,
255+
trigger_source=commons_enums.TriggerSource.KLINE.value,
256+
trigger_cache_timestamp=kline[commons_enums.PriceIndexes.IND_PRICE_TIME.value],
257+
kline=kline
258+
)
259+
await self.call_script(
260+
matrix_id=self.matrix_id, cryptocurrency=cryptocurrency,
261+
symbol=symbol, time_frame=time_frame,
262+
trigger_source=commons_enums.TriggerSource.KLINE.value,
263+
trigger_cache_timestamp=kline[commons_enums.PriceIndexes.IND_PRICE_TIME.value],
264+
kline=kline)
265+
266+
async def set_final_eval(
267+
self, matrix_id: str, cryptocurrency: str,
268+
symbol: str, time_frame, trigger_source: str):
269+
trigger_cache_timestamp = self._get_latest_eval_time(
270+
matrix_id, cryptocurrency, symbol, time_frame)
271+
self.log_last_call_by_time_frame_and_symbol(
272+
matrix_id=matrix_id,
273+
cryptocurrency=cryptocurrency,
274+
symbol=symbol,
275+
time_frame=time_frame,
276+
trigger_source=trigger_source,
277+
trigger_cache_timestamp=trigger_cache_timestamp,
278+
)
279+
await self.call_script(
280+
matrix_id=matrix_id, cryptocurrency=cryptocurrency,
281+
symbol=symbol, time_frame=time_frame,
282+
trigger_source=trigger_source,
283+
trigger_cache_timestamp=trigger_cache_timestamp,
284+
)
242285

243286
def _get_latest_eval_time(self, matrix_id: str, cryptocurrency: str, symbol: str, time_frame):
244287
try:
@@ -261,8 +304,6 @@ async def call_script(self, matrix_id: str, cryptocurrency: str, symbol: str, ti
261304
self.trading_mode, matrix_id, cryptocurrency, symbol, time_frame,
262305
trigger_source, trigger_cache_timestamp, candle, kline, init_call=init_call
263306
)
264-
self.last_call_by_timeframe[time_frame] = \
265-
(matrix_id, cryptocurrency, symbol, time_frame, trigger_source, trigger_cache_timestamp, candle, kline, init_call)
266307
context.matrix_id = matrix_id
267308
context.cryptocurrency = cryptocurrency
268309
context.symbol = symbol
@@ -307,3 +348,27 @@ async def post_trigger(self):
307348
await database.flush()
308349
except Exception as err:
309350
self.logger.exception(err, True, f"Error when flushing database: {err}")
351+
352+
def log_last_call_by_time_frame_and_symbol(
353+
self,
354+
matrix_id,
355+
cryptocurrency,
356+
symbol,
357+
time_frame,
358+
trigger_source,
359+
trigger_cache_timestamp,
360+
candle=None,
361+
kline=None,
362+
):
363+
if time_frame not in self.last_calls_by_time_frame_and_symbol:
364+
self.last_calls_by_time_frame_and_symbol[time_frame] = {}
365+
self.last_calls_by_time_frame_and_symbol[time_frame][symbol] = (
366+
matrix_id,
367+
cryptocurrency,
368+
symbol,
369+
time_frame,
370+
trigger_source,
371+
trigger_cache_timestamp,
372+
candle,
373+
kline,
374+
)

0 commit comments

Comments
 (0)