diff --git a/v2realbot/ENTRY_backtest_strategyVykladaci.py b/v2realbot/ENTRY_backtest_strategyVykladaci.py index aa2e70a..e4558dd 100644 --- a/v2realbot/ENTRY_backtest_strategyVykladaci.py +++ b/v2realbot/ENTRY_backtest_strategyVykladaci.py @@ -4,10 +4,10 @@ from v2realbot.strategy.base import StrategyState from v2realbot.strategy.StrategyOrderLimitVykladaci import StrategyOrderLimitVykladaci from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Account, OrderSide from v2realbot.indicators.indicators import ema -from v2realbot.utils.utils import ltp, isrising, isfalling,trunc,AttributeDict, zoneNY, price2dec, dict_replace_value +from v2realbot.utils.utils import ltp, isrising, isfalling,trunc,AttributeDict, zoneNY, price2dec, dict_replace_value, print from datetime import datetime from icecream import install, ic -from rich import print +#from rich import print from threading import Event from msgpack import packb, unpackb import asyncio @@ -119,7 +119,7 @@ def next(data, state: StrategyState): qty = qty + int(state.vars.chunk) else: state.buy_l(price=price, size=qty) - print(i,"BUY limitka - delta",curve[i]," cena:", price, "mnozstvi:", qty) + #print(i,"BUY limitka - delta",curve[i]," cena:", price, "mnozstvi:", qty) qty = int(state.vars.chunk) last_price = price state.vars.blockbuy = 1 @@ -174,10 +174,10 @@ def next(data, state: StrategyState): slope = ((state.bars.close[-1] - lookbackprice)/lookbackprice)*100 state.indicators.slope.append(slope) - state.statinds.angle = dict(time=state.bars.time[-1], price=state.bars.close[-1], lookbacktime=state.bars.time[-slope_lookback], lookbackprice=lookbackprice) + state.statinds.angle = dict(time=state.bars.time[-1], price=state.bars.close[-1], lookbacktime=state.bars.time[-slope_lookback], lookbackprice=lookbackprice, minimum_slope=minimum_slope) #state.indicators.roc.append(roc) - print("slope", state.indicators.slope[-5:]) + #print("slope", state.indicators.slope[-5:]) state.ilog(e="Slope "+str(slope), msg="lookback price:"+str(lookbackprice), lookbackoffset=lookback_offset, minimum_slope=minimum_slope, last_slopes=state.indicators.slope[-5:]) else: state.ilog(e="Slope - not enough data", slope_lookback=slope_lookback) @@ -200,7 +200,7 @@ def next(data, state: StrategyState): #print(orderlist) pendingbuys_new = {} limitka_old = state.vars.limitka - print("Puvodni LIMITKA", limitka_old) + #print("Puvodni LIMITKA", limitka_old) #zaciname s cistym stitem state.vars.limitka = None state.vars.limitka_price = None @@ -208,7 +208,7 @@ def next(data, state: StrategyState): limitka_qty = 0 for o in orderlist: if o.side == OrderSide.SELL: - print("Nalezena LIMITKA") + #print("Nalezena LIMITKA") limitka_found = True state.vars.limitka = o.id state.vars.limitka_price = o.limit_price @@ -233,7 +233,7 @@ def next(data, state: StrategyState): #snad to nespadne, kdyztak pridat exception handling state.vars.limitka = asyncio.run(state.interface.repl(price=state.vars.limitka_price, orderid=state.vars.limitka, size=int(state.positions))) limitka_qty = int(state.positions) - state.ilog(e="Změněna limitka", limitka=str(state.vars.limitka), limitka_price=state.vars.limitka_price) + state.ilog(e="Změněna limitka", limitka=str(state.vars.limitka), limitka_price=state.vars.limitka_price, limitka_qty=limitka_qty) if pendingbuys_new != state.vars.pendingbuys: state.ilog(e="Rozdilna PB prepsana", pb_new=pendingbuys_new, pb_old = state.vars.pendingbuys) diff --git a/v2realbot/__pycache__/config.cpython-310.pyc b/v2realbot/__pycache__/config.cpython-310.pyc index 519e911..ef0b8b1 100644 Binary files a/v2realbot/__pycache__/config.cpython-310.pyc and b/v2realbot/__pycache__/config.cpython-310.pyc differ diff --git a/v2realbot/config.py b/v2realbot/config.py index 2c7298c..444b718 100644 --- a/v2realbot/config.py +++ b/v2realbot/config.py @@ -2,6 +2,7 @@ from alpaca.data.enums import DataFeed from v2realbot.enums.enums import Mode, Account from appdirs import user_data_dir +QUIET_MODE = True COUNT_API_REQUESTS = False STRATVARS_UNCHANGEABLES = ['pendingbuys', 'blockbuy', 'jevylozeno', 'limitka'] DATA_DIR = user_data_dir("v2realbot") diff --git a/v2realbot/static/js/mywebsocket.js b/v2realbot/static/js/mywebsocket.js index e591f73..83c1435 100644 --- a/v2realbot/static/js/mywebsocket.js +++ b/v2realbot/static/js/mywebsocket.js @@ -182,7 +182,7 @@ function connect(event) { for (const [klic, hodnota] of Object.entries(statinds)) { console.log(JSON.stringify(klic)) console.log(JSON.stringify(hodnota)) - + //TODO predelat na configuracni klice vizualizacni dotahovane z backendu, ktere namapuji vybrane stratvars na typ vizualizace if (klic === "angle") { //nejsou vsechny hodnoty @@ -233,13 +233,35 @@ function connect(event) { if (searchObject == undefined) { //console.log("object new - init and add") var obj = {name: key, series: null} + + //predelat configuracne + //inicializace indicatoru + //momentum if (momentumIndicatorNames.includes(key)) { + + obj.series = chart.addLineSeries({ priceScaleId: 'left', title: key, lineWidth: 1 - }); + }); + + //natvrdo nakreslime lajnu pro min angle + //TODO predelat na configuracne + const minSlopeLineOptopns = { + price: parsed_data.statinds.angle.minimum_slope, + color: '#b67de8', + lineWidth: 2, + lineStyle: 2, // LineStyle.Dotted + axisLabelVisible: true, + title: "max:", + }; + + const minSlopeLine = obj.series.createPriceLine(minSlopeLineOptopns); + + } + //ostatni else { obj.series = chart.addLineSeries({ //title: key, diff --git a/v2realbot/strategy/__pycache__/StrategyOrderLimitVykladaci.cpython-310.pyc b/v2realbot/strategy/__pycache__/StrategyOrderLimitVykladaci.cpython-310.pyc index b70d00a..b05b3bf 100644 Binary files a/v2realbot/strategy/__pycache__/StrategyOrderLimitVykladaci.cpython-310.pyc and b/v2realbot/strategy/__pycache__/StrategyOrderLimitVykladaci.cpython-310.pyc differ diff --git a/v2realbot/strategy/__pycache__/base.cpython-310.pyc b/v2realbot/strategy/__pycache__/base.cpython-310.pyc index 78550ae..22fd505 100644 Binary files a/v2realbot/strategy/__pycache__/base.cpython-310.pyc and b/v2realbot/strategy/__pycache__/base.cpython-310.pyc differ diff --git a/v2realbot/strategy/base.py b/v2realbot/strategy/base.py index 85e51cd..f1e6298 100644 --- a/v2realbot/strategy/base.py +++ b/v2realbot/strategy/base.py @@ -2,12 +2,12 @@ Strategy base class """ from datetime import datetime -from v2realbot.utils.utils import AttributeDict, zoneNY, is_open_rush, is_close_rush, json_serial +from v2realbot.utils.utils import AttributeDict, zoneNY, is_open_rush, is_close_rush, json_serial, print from v2realbot.utils.tlog import tlog from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Order, Account from v2realbot.config import BT_DELAYS, get_key, HEARTBEAT_TIMEOUT import queue -from rich import print +#from rich import print from v2realbot.loader.aggregator import TradeAggregator2Queue, TradeAggregator2List, TradeAggregator from v2realbot.loader.order_updates_streamer import LiveOrderUpdatesStreamer from v2realbot.loader.trade_offline_streamer import Trade_Offline_Streamer @@ -39,6 +39,8 @@ class Strategy: self.state: StrategyState = None self.bt: Backtester = None self.debug = False + self.debug_target_iter = 0 + self.debug_iter_cnt = 0 #skip morning or closing rush self.open_rush = open_rush self.close_rush = close_rush @@ -169,8 +171,18 @@ class Strategy: ic('time updated') def strat_loop(self, item): + ##TODO do samostatne funkce if self.debug: - a = input("Press key before next iteration") + self.debug_iter_cnt += 1 + if (self.debug_iter_cnt >= self.debug_target_iter): + try: + cnt = int(input("Press enter for next iteration or number to skip")) + self.debug_target_iter = self.debug_iter_cnt + cnt + except ValueError: + self.debug_target_iter = self.debug_iter_cnt + 1 + + + self.update_times(item) ## BT - execute orders that should have been filled until this time diff --git a/v2realbot/utils/__pycache__/utils.cpython-310.pyc b/v2realbot/utils/__pycache__/utils.cpython-310.pyc index 4042b81..1985ba1 100644 Binary files a/v2realbot/utils/__pycache__/utils.cpython-310.pyc and b/v2realbot/utils/__pycache__/utils.cpython-310.pyc differ diff --git a/v2realbot/utils/utils.py b/v2realbot/utils/utils.py index 25ff9f6..bae320d 100644 --- a/v2realbot/utils/utils.py +++ b/v2realbot/utils/utils.py @@ -4,7 +4,7 @@ from queue import Queue from datetime import datetime, timezone, time, timedelta, date import pytz from dateutil import tz -from rich import print +from rich import print as richprint import decimal from icecream import ic from v2realbot.enums.enums import RecordType, Mode, StartBarAlign @@ -13,7 +13,7 @@ import os from v2realbot.common.model import StrategyInstance, Runner from typing import List import tomli -from v2realbot.config import DATA_DIR +from v2realbot.config import DATA_DIR, QUIET_MODE import requests from uuid import UUID @@ -67,7 +67,11 @@ qu = Queue() zoneNY = tz.gettz('America/New_York') def print(*args, **kwargs): - ic(*args, **kwargs) + if QUIET_MODE: + pass + else: + #ic(*args, **kwargs) + richprint(*args, **kwargs) def price2dec(price: float) -> float: """