docasne ulozeni sec indikatoru pred smazanim

This commit is contained in:
David Brazda
2023-06-13 11:34:32 +02:00
parent 77272be886
commit 5fd6da7f59
7 changed files with 110 additions and 20 deletions

View File

@ -396,17 +396,30 @@ def next(data, state: StrategyState):
state.ilog(e=f"RSI {rsi_length=} necháváme 0", message=str(e)+format_exc())
#state.indicators.RSI14[-1]=0
def populate_cbar_rsi_indicator():
#CBAR RSI indicator
# def populate_cbar_rsi_indicator():
# #CBAR RSI indicator
# try:
# crsi_length = int(safe_get(state.vars, "crsi_length",14))
# source = state.cbar_indicators.tick_price #[-rsi_length:] #state.bars.vwap
# crsi_res = rsi(source, crsi_length)
# crsi_value = trunc(crsi_res[-1],3)
# state.cbar_indicators.CRSI[-1]=crsi_value
# #state.ilog(e=f"RSI {rsi_length=} {rsi_value=} {rsi_dont_buy=} {rsi_buy_signal=}", rsi_indicator=state.indicators.RSI14[-5:])
# except Exception as e:
# state.ilog(e=f"CRSI {crsi_length=} necháváme 0", message=str(e)+format_exc())
# #state.indicators.RSI14[-1]=0
def populate_secondary_rsi_indicator():
#SBAR RSI indicator
try:
crsi_length = int(safe_get(state.vars, "crsi_length",14))
source = state.cbar_indicators.tick_price #[-rsi_length:] #state.bars.vwap
crsi_res = rsi(source, crsi_length)
crsi_value = trunc(crsi_res[-1],3)
state.cbar_indicators.CRSI[-1]=crsi_value
srsi_length = int(safe_get(state.vars, "srsi_length",14))
source = state.secondary_indicators.sec_price #[-rsi_length:] #state.bars.vwap
srsi_res = rsi(source, srsi_length)
srsi_value = trunc(srsi_res[-1],3)
state.secondary_indicators.SRSI[-1]=srsi_value
#state.ilog(e=f"RSI {rsi_length=} {rsi_value=} {rsi_dont_buy=} {rsi_buy_signal=}", rsi_indicator=state.indicators.RSI14[-5:])
except Exception as e:
state.ilog(e=f"CRSI {crsi_length=} necháváme 0", message=str(e)+format_exc())
state.ilog(e=f"SRSI {srsi_length=} necháváme 0", message=str(e)+format_exc())
#state.indicators.RSI14[-1]=0
def slope_too_low():
@ -574,6 +587,11 @@ def next(data, state: StrategyState):
for key in state.cbar_indicators:
if key != 'time':
last_ind_vals[key] = state.cbar_indicators[key][-5:]
for key in state.secondary_indicators:
if key != 'time':
last_ind_vals[key] = state.secondary_indicators[key][-5:]
return last_ind_vals
conf_bar = data['confirmed']
@ -591,11 +609,14 @@ def next(data, state: StrategyState):
state.vars.last_tick_volume = 0
state.vars.next_new = 1
#SRSI
populate_secondary_rsi_indicator()
#kroky pro CONTINOUS TICKS only
else:
#CBAR INDICATOR pro tick price a deltu VOLUME
populate_cbar_tick_price_indicator()
populate_cbar_rsi_indicator()
#SPOLECNA LOGIKA - bar indikatory muzeme populovat kazdy tick (dobre pro RT GUI), ale uklada se stejne az pri confirmu
@ -628,7 +649,7 @@ def init(state: StrategyState):
#state.cbar_indicators['ivwap'] = []
state.cbar_indicators['tick_price'] = []
state.cbar_indicators['tick_volume'] = []
state.cbar_indicators['CRSI'] = []
state.secondary_indicators['SRSI'] = []
state.indicators['ema'] = []
state.indicators['slope'] = []
state.indicators['slopeMA'] = []

View File

@ -527,6 +527,16 @@ def archive_runner(runner: Runner, strat: StrategyInstance):
#print("is not numpy", key, value)
flattened_indicators[key]= value
flattened_indicators_list.append(flattened_indicators)
flattened_indicators = {}
for key, value in strat.state.secondary_indicators.items():
if isinstance(value, ndarray):
#print("is numpy", key,value)
flattened_indicators[key]= value.tolist()
#print("changed numpy:",value.tolist())
else:
#print("is not numpy", key, value)
flattened_indicators[key]= value
flattened_indicators_list.append(flattened_indicators)
runArchiveDetail: RunArchiveDetail = RunArchiveDetail(id = runner.id,
name=runner.run_name,

View File

@ -30,12 +30,12 @@ indConfig = [ {name: "ema", titlevisible: false, embed: true, display: true, pri
{name: "emaSlow", titlevisible: true, embed: true, display: true, priceScaleId: "right", lastValueVisible: false},
{name: "emaFast", titlevisible: true, embed: true, display: true, priceScaleId: "right", lastValueVisible: false},
{name: "RSI14", titlevisible: true, embed: true, display: true, priceScaleId: "left", lastValueVisible: false},
{name: "CRSI", titlevisible: true, embed: true, display: true, priceScaleId: "left", lastValueVisible: false},
{name: "SRSI", titlevisible: true, embed: true, display: true, priceScaleId: "left", lastValueVisible: false},
{name: "aroon", titlevisible: true, embed: true, display: true, priceScaleId: "left", lastValueVisible: false},
{name: "apo", titlevisible: true, embed: true, display: true, priceScaleId: "left", lastValueVisible: false},
{name: "ppo", titlevisible: true, embed: true, display: true, priceScaleId: "left", lastValueVisible: false},
{name: "stoch2", titlevisible: true, embed: true, display: true, priceScaleId: "left", lastValueVisible: false},
{name: "stoch1", titlevisible: true, embed: true, display: true, priceScaleId: "left", lastValueVisible: false},]
{name: "sec_price", titlevisible: true, embed: true, display: true, priceScaleId: "right", lastValueVisible: false},]
function initialize_statusheader() {

View File

@ -2,7 +2,7 @@
Strategy base class
"""
from datetime import datetime
from v2realbot.utils.utils import AttributeDict, zoneNY, is_open_rush, is_close_rush, json_serial, print
from v2realbot.utils.utils import AttributeDict, zoneNY, is_open_rush, is_close_rush, json_serial, print, safe_get, Average
from v2realbot.utils.tlog import tlog
from v2realbot.utils.ilog import insert_log, insert_log_multiple
from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Order, Account
@ -55,7 +55,8 @@ class Strategy:
self.rtqueue = None
self.runner_id = runner_id
self.ilog_save = ilog_save
self.secondary_res_start_time = dict()
self.secondary_res_start_index = dict()
#TODO predelat na dynamické queues
self.q1 = queue.Queue()
@ -189,11 +190,57 @@ class Strategy:
#pokud je potvrzeny, pak nenese nikdy zmenu ceny, nepridavame zaznam nic
self.nextnew = 1
#TODO potvrzeny CBAR by mohl triggerovat populaci indikatoru se sekundarnim rozlisenim (tbd co BAR?)
#zatim to udelat tak, ze secondary bude jen priceline nikoli ohlcv (pro RSI, MA a slope bude snad dostatecne)
#prvni iterace nastavi 0 (inicializace)
#kazdy potvrzeny bar updatne hodnotu, DOMYSLET tento algoritmus (co bude zde a co v NEXT)
#self.state.secondary_indicators
#pokud jsou nastaveny secondary - zatím skrz stratvars - pripadne do do API
#zatim jedno, predelat pak na list
if safe_get(self.state.vars, "secondary_timeframe",None):
self.process_secondary_indicators(item)
#tady jsem skoncil
def process_secondary_indicators(self, item):
#toto je voláno každý potvrzený CBAR
resolution = int(safe_get(self.state.vars, "secondary_timeframe",10))
if int(item['resolution']) >= int(resolution) or int(resolution) % int(item['resolution']) != 0:
self.state.ilog(e=f"Secondary res {resolution} must be higher than main resolution {item['resolution']} a jejim delitelem")
#prvni vytvori pocatecni
if safe_get(self.secondary_res_start_time, resolution, None) is None:
self.secondary_res_start_time[resolution] = item['time']
self.secondary_res_start_index[resolution] = int(item['index'])
self.state.ilog(e=f"INIT SECINDS {self.secondary_res_start_time[resolution]=} {self.secondary_res_start_index[resolution]=}")
start_timestamp = datetime.timestamp(self.secondary_res_start_time[resolution])
self.state.ilog(e=f"SECINDS EVAL", start_time=start_timestamp,start_time_plus=start_timestamp + resolution, aktual=datetime.timestamp(item['time']))
#pokud uz jsme prekrocili okno, ukladame hodnotu
if start_timestamp + resolution <= datetime.timestamp(item['time']):
self.state.ilog(e=f"SECINDS okno prekroceno")
index_from = self.secondary_res_start_index[resolution] - int(item['index']) -1
#vytvorime cas a vyplnime data
for key in self.state.secondary_indicators:
if key == 'time':
#nastavujeme aktualni cas
self.state.secondary_indicators['time'].append(item['time'])
#self.state.secondary_indicators['time'].append(self.secondary_res_start_time[resolution] )
#pro cenu vyplnime aktualni cenou, pro ostatni 0
elif key == 'sec_price':
#do ceny dame ceny v tomto okne
source = self.state.bars['vwap']
#source = self.state.bars['close']
self.state.ilog(e=f"SECINDS pocitame z hodnot", hodnty=source[index_from:])
self.state.secondary_indicators[key].append(Average(self.state.bars['close'][index_from:]))
else:
self.state.secondary_indicators[key].append(0)
self.state.ilog(e="SECIND populated", sec_price=self.state.secondary_indicators['sec_price'][-5:])
#priprava start hodnot pro dalsi iteraci
self.secondary_res_start_time[resolution] = item['time']
self.secondary_res_start_index[resolution] = int(item['index'])
""""refresh positions and avgp - for CBAR once per confirmed, for BARS each time"""
@ -445,6 +492,13 @@ class Strategy:
rt_out["indicators"][key]= value[-1]
except IndexError:
pass
#secondaries
if len(self.state.secondary_indicators) > 0 and item['confirmed'] == 1:
for key, value in self.state.secondary_indicators.items():
try:
rt_out["indicators"][key]= value[-1]
except IndexError:
pass
#same for static indicators
if len(self.state.statinds) > 0:
@ -580,6 +634,8 @@ class StrategyState:
self.trades = AttributeDict(trades)
self.indicators = AttributeDict(time=[])
self.cbar_indicators = AttributeDict(time=[])
#secondary timeframe indicators
self.secondary_indicators = AttributeDict(time=[], sec_price=[])
self.statinds = AttributeDict()
#these methods can be overrided by StrategyType (to add or alter its functionality)
self.buy = self.interface.buy

View File

@ -79,6 +79,9 @@ def eval_cond_dict(cond: dict) -> tuple[bool, str]:
return False, None
def Average(lst):
return sum(lst) / len(lst)
def safe_get(collection, key, default=None):
"""Get values from a collection without raising errors"""