From 541aaa4ab8e641a75597b250d03781ae07c0045a Mon Sep 17 00:00:00 2001 From: David Brazda Date: Sun, 23 Apr 2023 21:21:06 +0200 Subject: [PATCH] bugfix a zakomentovan IC a podporen format f --- testy/fformat.py | 6 ++ testy/testloadfromcache.py | 6 +- v2realbot/ENTRY_backtest_strategy.py | 14 ++--- v2realbot/ENTRY_backtest_strategyKOKA-ok.py | 14 ++--- v2realbot/ENTRY_backtest_strategyVykladaci.py | 52 ++++++++--------- v2realbot/ENTRY_backtest_strategyWatched.py | 28 ++++----- v2realbot/__pycache__/config.cpython-310.pyc | Bin 2779 -> 2779 bytes .../__pycache__/backtester.cpython-310.pyc | Bin 19106 -> 18755 bytes v2realbot/backtesting/backtester.py | 51 +++++++++-------- v2realbot/controller/services.py | 2 +- .../__pycache__/aggregator.cpython-310.pyc | Bin 6493 -> 6493 bytes .../trade_offline_streamer.cpython-310.pyc | Bin 5089 -> 4913 bytes v2realbot/loader/aggregator.py | 4 +- v2realbot/loader/trade_offline_streamer.py | 22 +++---- v2realbot/main.py | 14 ++--- v2realbot/static/js/mywebsocket.js | 2 +- v2realbot/strategy/StrategyOrderLimitKOKA.py | 18 +++--- .../strategy/StrategyOrderLimitVykladaci.py | 36 ++++++------ ...trategyOrderLimitVykladaci.cpython-310.pyc | Bin 7494 -> 7232 bytes .../strategy/__pycache__/base.cpython-310.pyc | Bin 12980 -> 13143 bytes v2realbot/strategy/base.py | 54 +++++++++++------- v2realbot/strategy/strategyOrderLimit.py | 18 +++--- .../strategy/strategyOrderLimitWatched.py | 16 +++--- .../utils/__pycache__/utils.cpython-310.pyc | Bin 7965 -> 7930 bytes v2realbot/utils/utils.py | 3 +- 25 files changed, 185 insertions(+), 175 deletions(-) create mode 100644 testy/fformat.py diff --git a/testy/fformat.py b/testy/fformat.py new file mode 100644 index 0000000..3f5892a --- /dev/null +++ b/testy/fformat.py @@ -0,0 +1,6 @@ + +d= 1 + +a = f"neco {d=} a nebo takhle {float(d)}" + +print(a) diff --git a/testy/testloadfromcache.py b/testy/testloadfromcache.py index c7c5132..1de7e35 100644 --- a/testy/testloadfromcache.py +++ b/testy/testloadfromcache.py @@ -56,14 +56,14 @@ for day in cal_dates: #odesíláme do queue #jinak pass else: - ic("cache not exists") + ##"cache not exists") #denni file není - loadujeme den z Alpacy #ukládáme do cache s daily_file jako název #pokud jde o dnešní den a nebyl konec trhu tak cache neukládáme if datetime.now() < day.close: print("not saving the cache, market still open today") - ic(datetime.now()) - ic(day.close) + #ic(datetime.now()) + #ic(day.close) else: pass #save to daily cache file curr_dir+'/'+daily_file diff --git a/v2realbot/ENTRY_backtest_strategy.py b/v2realbot/ENTRY_backtest_strategy.py index 29b8ec1..681a204 100644 --- a/v2realbot/ENTRY_backtest_strategy.py +++ b/v2realbot/ENTRY_backtest_strategy.py @@ -16,10 +16,10 @@ Simple strategie pro test backtesting def next(data, state: StrategyState): print(10*"*","NEXT START",10*"*") - ic(state.avgp, state.positions) - ic(state.vars.limitka) - ic(state.vars.lastbuyindex) - ic(data) + #ic(state.avgp, state.positions) + #ic(state.vars.limitka) + #ic(state.vars.lastbuyindex) + #ic(data) #print("last trade price") #print(state.interface.get_last_price("BAC")) #print(state.vars.novaprom) @@ -35,7 +35,7 @@ def next(data, state: StrategyState): state.indicators.ema = ema(state.bars.hlcc4, state.vars.MA) #state.bars.vwap #trochu prasarna, EMAcko trunc na 3 mista - kdyz se osvedci, tak udelat efektivne state.indicators.ema = [trunc(i,3) for i in state.indicators.ema] - ic(state.vars.MA, state.vars.Trend, state.indicators.ema[-5:]) + #ic(state.vars.MA, state.vars.Trend, state.indicators.ema[-5:]) except Exception as e: print("No data for MA yet", str(e)) @@ -57,8 +57,8 @@ def next(data, state: StrategyState): if isfalling(state.indicators.ema,state.vars.Trend) and data['index'] > state.vars.lastbuyindex+state.vars.Trend: #and state.blockbuy == 0 print("BUY MARKET") - ic(data['updated']) - ic(state.time) + #ic(data['updated']) + #ic(state.time) state.buy_l() diff --git a/v2realbot/ENTRY_backtest_strategyKOKA-ok.py b/v2realbot/ENTRY_backtest_strategyKOKA-ok.py index d5bca7e..bcc7277 100644 --- a/v2realbot/ENTRY_backtest_strategyKOKA-ok.py +++ b/v2realbot/ENTRY_backtest_strategyKOKA-ok.py @@ -32,10 +32,10 @@ stratvars = AttributeDict(maxpozic = 250, def next(data, state: StrategyState): print(10*"*","NEXT START",10*"*") - ic(state.avgp, state.positions) - ic(state.vars.limitka) - ic(state.vars.lastbuyindex) - ic(data) + #ic(state.avgp, state.positions) + #ic(state.vars.limitka) + #ic(state.vars.lastbuyindex) + #ic(data) #print("last trade price") #print(state.interface.get_last_price("BAC")) #print(state.vars.novaprom) @@ -51,7 +51,7 @@ def next(data, state: StrategyState): state.indicators.ema = ema(state.bars.hlcc4, state.vars.MA) #state.bars.vwap #trochu prasarna, EMAcko trunc na 3 mista - kdyz se osvedci, tak udelat efektivne state.indicators.ema = [trunc(i,3) for i in state.indicators.ema] - ic(state.vars.MA, state.vars.Trend, state.indicators.ema[-5:]) + #ic(state.vars.MA, state.vars.Trend, state.indicators.ema[-5:]) except Exception as e: print("No data for MA yet", str(e)) @@ -65,8 +65,8 @@ def next(data, state: StrategyState): #proto dodělat LTP pro BT, neco jako get_last_price(self.state.time) if isfalling(state.indicators.ema,state.vars.Trend) and data['index'] > state.vars.lastbuyindex+state.vars.Trend: #and state.blockbuy == 0 print("BUY MARKET") - ic(data['updated']) - ic(state.time) + #ic(data['updated']) + #ic(state.time) state.buy_l() diff --git a/v2realbot/ENTRY_backtest_strategyVykladaci.py b/v2realbot/ENTRY_backtest_strategyVykladaci.py index c120908..4781d73 100644 --- a/v2realbot/ENTRY_backtest_strategyVykladaci.py +++ b/v2realbot/ENTRY_backtest_strategyVykladaci.py @@ -89,9 +89,9 @@ exthours=false def next(data, state: StrategyState): print(10*"*","NEXT START",10*"*") - ic(state.avgp, state.positions) - ic(state.vars) - ic(data) + #ic(state.avgp, state.positions) + #ic(state.vars) + #ic(data) #mozna presunout o level vys def vyloz(): @@ -128,7 +128,7 @@ def next(data, state: StrategyState): last_price = price2dec(state.interface.get_last_price(state.symbol)) #profit = float(state.vars.profit) price = last_price - state.ilog(e="BUY Vykladame", msg="first price"+str(price) + "pozic:"+str(vykladka), curve=curve, ema=state.indicators.ema[-1], trend=state.vars.Trend, price=price, vykladka=vykladka) + state.ilog(e="BUY Vykladame", msg=f"first price {price=} {vykladka=}", curve=curve, ema=state.indicators.ema[-1], trend=state.vars.Trend, price=price, vykladka=vykladka) ##prvni se vyklada na aktualni cenu, další jdou podle krivky, nula v krivce zvyšuje množství pro následující iteraci ##VAR - na zaklade conf. muzeme jako prvni posilat MARKET @@ -176,7 +176,7 @@ def next(data, state: StrategyState): state.indicators.ema = ema(state.bars.close, state.vars.MA) #state.bars.vwap #trochu prasarna, EMAcko trunc na 3 mista - kdyz se osvedci, tak udelat efektivne state.indicators.ema = [trunc(i,3) for i in state.indicators.ema] - ic(state.vars.MA, state.vars.Trend, state.indicators.ema[-5:]) + #ic(state.vars.MA, state.vars.Trend, state.indicators.ema[-5:]) slope_lookback = int(state.vars.slope_lookback) minimum_slope = float(state.vars.minimum_slope) @@ -192,17 +192,18 @@ def next(data, state: StrategyState): array_do = slope_lookback lookbackprice_array = state.bars.vwap[-array_od:-array_do] #obycejný prumer hodnot - lookbackprice = sum(lookbackprice_array)/lookback_offset + lookbackprice = round(sum(lookbackprice_array)/lookback_offset,3) #výpočet úhlu slope = ((state.bars.close[-1] - lookbackprice)/lookbackprice)*100 + slope = round(slope, 4) 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, minimum_slope=minimum_slope) #state.indicators.roc.append(roc) #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[-10:]) + state.ilog(e=f"{slope=}", msg=f"{lookbackprice=}", lookbackoffset=lookback_offset, minimum_slope=minimum_slope, last_slopes=state.indicators.slope[-10:]) #slope MA - cílem je identifikovat táhlá klesání, vypnout nákupy, až budou zase růsty @@ -262,18 +263,18 @@ def next(data, state: StrategyState): if o.side == OrderSide.BUY: pendingbuys_new[str(o.id)]=float(o.limit_price) - state.ilog(e="Konzolidace limitky", msg="limitka stejna?:"+str((str(limitka_old)==str(state.vars.limitka))), limitka_old=str(limitka_old), limitka_new=str(state.vars.limitka), limitka_new_price=state.vars.limitka_price, limitka_qty=limitka_qty, limitka_filled_qty=limitka_filled_qty) + state.ilog(e="Konzolidace limitky", msg=f"stejna:{(str(limitka_old)==str(state.vars.limitka))}", limitka_old=str(limitka_old), limitka_new=str(state.vars.limitka), limitka_new_price=state.vars.limitka_price, limitka_qty=limitka_qty, limitka_filled_qty=limitka_filled_qty) #pokud mame #neni limitka, ale mela by byt - vytváříme ji if int(state.positions) > 0 and state.vars.limitka is None: - state.ilog(e="Limitka neni, ale mela by být.", msg="počet pozic aktualnich" + str(int(state.positions))) + state.ilog(e="Limitka neni, ale mela by být.", msg=f"{state.positions=}") price=price2dec(float(state.avgp)+state.vars.profit) state.vars.limitka = asyncio.run(state.interface.sell_l(price=price, size=int(state.positions))) state.vars.limitka_price = price if state.vars.limitka == -1: - state.ilog(e="Vytvoreni limitky neprobehlo, vracime None", msg=str(state.vars.limitka)) + state.ilog(e="Vytvoreni limitky neprobehlo, vracime None", msg=f"{state.vars.limitka=}") state.vars.limitka = None state.vars.limitka_price = None else: @@ -281,13 +282,13 @@ def next(data, state: StrategyState): elif state.vars.limitka is not None and int(state.positions) > 0 and (int(state.positions) != int(limitka_qty)): #limitka existuje, ale spatne mnostvi - updatujeme - state.ilog(e="Limitka existuje, ale spatne mnozstvi - updatujeme", msg="POS"+str(int(state.positions))+" lim_qty:"+str(limitka_qty), pos=state.positions, limitka_qty=limitka_qty) + state.ilog(e=f"Limitka existuje, ale spatne mnozstvi - updatujeme", msg=f"{state.positions=} {limitka_qty=}", pos=state.positions, limitka_qty=limitka_qty) #snad to nespadne, kdyztak pridat exception handling puvodni = state.vars.limitka state.vars.limitka = asyncio.run(state.interface.repl(price=state.vars.limitka_price, orderid=state.vars.limitka, size=int(state.positions))) if state.vars.limitka == -1: - state.ilog(e="Replace limitky neprobehl, vracime puvodni", msg=str(state.vars.limitka), puvodni=puvodni) + state.ilog(e="Replace limitky neprobehl, vracime puvodni", msg=f"{state.vars.limitka=}", puvodni=puvodni) state.vars.limitka = puvodni else: limitka_qty = int(state.positions) @@ -326,7 +327,7 @@ def next(data, state: StrategyState): #HLAVNI ITERACNI LOG JESTE PRED AKCI - obsahuje aktualni hodnoty vetsiny parametru lp = state.interface.get_last_price(symbol=state.symbol) - state.ilog(e="ENTRY", msg="AVGP:"+str(round(float(state.avgp),2))+ "POS:" +str(state.positions)+" PROFIT:"+str(round(float(state.profit),2)), last_price=lp, stratvars=state.vars) + state.ilog(e="ENTRY", msg=f"LP:{lp} P:{state.positions}/{round(float(state.avgp),2)} profit:{round(float(state.profit),2)} Trades:{len(state.tradeList)}", last_price=lp, stratvars=state.vars) #maxSlopeMA = -0.03 #SLOPE ANGLE PROTECTIONs @@ -341,23 +342,21 @@ def next(data, state: StrategyState): print("OCHRANA SLOPE TOO HIGH") # if slopeMA0: print("CANCEL PENDINGBUYS") - ic(state.vars.pendingbuys) + #ic(state.vars.pendingbuys) res = asyncio.run(state.cancel_pending_buys()) - ic(state.vars.pendingbuys) + #ic(state.vars.pendingbuys) state.ilog(e="Rusime pendingbuyes", pb=state.vars.pendingbuys, res=res) print("slope", slope) print("min slope", minimum_slope) - if ic(state.vars.jevylozeno) == 0: + if state.vars.jevylozeno == 0: print("Neni vylozeno, muzeme testovat nakup") if isfalling(state.indicators.ema,state.vars.Trend) and slope > minimum_slope: print("BUY MARKET") - ic(data['updated']) - ic(state.time) #zatim vykladame full #positions = int(int(state.vars.maxpozic)/int(state.vars.chunk)) vyloz() @@ -378,8 +377,7 @@ def next(data, state: StrategyState): if state.interface.get_last_price(state.symbol) > float(maxprice) + float(state.vars.ticks2reset): ##TODO toto nejak vymyslet - duplikovat? res = asyncio.run(state.cancel_pending_buys()) - state.ilog(e="UJELO to o více " + str(state.vars.ticks2reset), msg="zrusene pb buye", pb=state.vars.pendingbuys) - + state.ilog(e=f"UJELO to. Rusime PB", msg=f"{state.vars.ticks2reset=}", pb=state.vars.pendingbuys) #PENDING BUYS SPENT - PART #pokud mame vylozeno a pendingbuys se vyklepou a @@ -435,15 +433,11 @@ def init(state: StrategyState): state.statinds['angle'] = {} state.vars["ticks2reset_backup"] = state.vars.ticks2reset - #state.indicators['roc'] = [] - #state.ilog(e="INIT", stratvars=state.vars) - def main(): - - try: - strat_settings = tomli.loads("]] this is invalid TOML [[") - except tomli.TOMLDecodeError: - print("Yep, definitely not valid.") + # try: + # strat_settings = tomli.loads("]] this is invalid TOML [[") + # except tomli.TOMLDecodeError: + # print("Yep, definitely not valid.") #strat_settings = dict_replace_value(strat_settings, "None", None) diff --git a/v2realbot/ENTRY_backtest_strategyWatched.py b/v2realbot/ENTRY_backtest_strategyWatched.py index 5f729ae..6369290 100644 --- a/v2realbot/ENTRY_backtest_strategyWatched.py +++ b/v2realbot/ENTRY_backtest_strategyWatched.py @@ -15,18 +15,18 @@ Simple strategie pro test backtesting def next(data, state: StrategyState): print(10*"*","NEXT START",10*"*") - ic(state.avgp, state.positions) - ic(state.vars.lastbuyindex) - ic(data) - ic(state.positions) - ic(state.vars.watched) - ic(state.vars.wait) + #ic(state.avgp, state.positions) + #ic(state.vars.lastbuyindex) + #ic(data) + #ic(state.positions) + #ic(state.vars.watched) + #ic(state.vars.wait) try: state.indicators.ema = ema(state.bars.hlcc4, state.vars.MA) #state.bars.vwap #trochu prasarna, EMAcko trunc na 3 mista - kdyz se osvedci, tak udelat efektivne state.indicators.ema = [trunc(i,3) for i in state.indicators.ema] - ic(state.vars.MA, state.vars.Trend, state.indicators.ema[-5:]) + #ic(state.vars.MA, state.vars.Trend, state.indicators.ema[-5:]) except Exception as e: print("No data for MA yet", str(e)) @@ -49,26 +49,26 @@ def next(data, state: StrategyState): datetime.fromtimestamp(state.last_trade_time) casbaru = datetime.fromtimestamp(state.last_trade_time)-data['time'] kupuj = casbaru.seconds > int(int(data['resolution']) * 0.4) - ic(kupuj) - ic(casbaru.seconds) + #ic(kupuj) + #ic(casbaru.seconds) #kupujeme kdyz v druhe polovine baru je aktualni cena=low (nejnizsi) #isrising(state.indicators.ema,state.vars.Trend) #kdyz se v jednom baru pohneme o 2 if kupuj and data['confirmed'] != 1 and data['close'] == data['low'] and float(data['close']) + 0.01 < data['open'] and state.vars.wait is False and state.vars.watched is None: print("BUY MARKET") - ic(data['updated']) - ic(state.time) + #ic(data['updated']) + #ic(state.time) ##updatneme realnou cenou po fillu state.buy() state.vars.wait = True if state.vars.watched and state.vars.wait is False: currprice = state.interface.get_last_price(symbol = state.symbol) - ic(currprice) + #ic(currprice) if float(currprice) > (float(state.vars.watched) + float(state.vars.profit)): - ic(state.time) - ic("prodavame", currprice) + #ic(state.time) + #ic("prodavame", currprice) print("PRODAVAME") ##vymyslet jak odchytavat obecne chyby a vracet cislo objednavky state.interface.sell(size=1) diff --git a/v2realbot/__pycache__/config.cpython-310.pyc b/v2realbot/__pycache__/config.cpython-310.pyc index 330c5082f0e2a631a0296d7b5fdc26d8a5561d41..1981e06c81a2a698bffc1b87be6e7831a75c67e1 100644 GIT binary patch delta 26 gcmcaDdRvq$pO=@50SFpfHgefBGBR)WVw}hc09aoJ8UO$Q delta 26 gcmcaDdRvq$pO=@50SKOYZsf9OWMtax#W;}@09vUALI3~& diff --git a/v2realbot/backtesting/__pycache__/backtester.cpython-310.pyc b/v2realbot/backtesting/__pycache__/backtester.cpython-310.pyc index d6e5ed3a9bf4aab614139272d248cef2cc3bc806..cbb92f7931e4ac508e044512040bc6ff8cc12f20 100644 GIT binary patch delta 3478 zcmai0Yiv}<6~5;_cJHp&Yh#;z1REOzh6NjF9Bj7!{)qZIXV%mv zp^8`Y-7{y-oSAdZH#7d;YjF1!@TW^ly$b$)dOB)#yz&$OAusF~ac@hu+R_IVOLx>0 zilccHkHX!yk~D2N4ms7)Nw#!be?bi^j)6V3S9#{JH#R+2M;ESIo@wwAB3U9$knWHb8lv1d^4%aS;zvP)!~_s%N3GFcT=_);5kFs3uc z70bXe&zs6sHTPh0z;@YS8_|sHXHT|03=QSEt z7x>f)2w^MNP4HshRMm5)E`C?`WcHM%C>A(6Hp7Obk_XI-n$&`dgK;NyZX{h}>J?zi zu;=Dx(u488ZmEu&du=TT813n!s$)7H+hb{A1+7ZP!0|5XDNYIZ@zSIpXSUg1$CoOT z{W9!lyX+EFxOusyQvv}?FsSe)I2~D#1C(62or)mJSfW>LA2zq8wJKB$UWqP5(H8k5 zH{clP%Vq1lD!c_{rqdAKI?a4ofUo*|D(h78!m{fJ}&W{pZmMZ*>LJYsWx z;**sv`@$Z}=PTtVHl&bxldDoL+~N|-53$2Wmzg0;MV?@daT#O|-U@JxC|Zr*8q^s% z(k$n-$vXV5z~fkNgHO^F2N z{#JP##OQEa_Vn-VKghbpWFQPtaXC;6{o+S~de;szX%`;{8lYEv z7MO-UF%_JK0dYUr4*SH$&|}TJ(d1XyGVdVhZXL?Oulqn(@$2)07hJNLc(E*3O~9Wn zE`*v|H52M^B%lUB2lXE=pL))Z;}x2TBMqq2Kf`Ot)WL;Umb{v9u1^<#3AMwJXbLmj zVm`bT~fk%JLUl+|3T zWI(HstBA^$k-SFyre>h?66!Nl2ftxze!O{gbvoP~8yVyA43D!7C*u6rcr3$@6>CWQ zFX)-Xbi7!y!(w824P2OeY5958WqWbCs=3+~A%Fv7OZ_lx6K~ePm+heCWYuLNWUY^r zPG&>qV1&9+gh(}8il2g(NO4IB7Neo32?7KQ$(y8Z6@g6c<0MIsa+RIbmAdIgalQcy@ZyOsV zkU`TiVf9ZCO4y82!IzmDKAGUh(#(pp>y-adadB0m1~VUAl=;P0tYdD;>X#_1`G%u| z+sU5{S1z&;%0d(}+o#D+ra*>FX^6Osp~#6c9vQ`9F|eiy{yyid8P*yW+)K~Wl(HGo z7p0*?80%NV60v^$pJA;CHU4MESv1*){;7Oy!H3M3EQU;)%%@Rwv{0-Gaj}Y@PK7$q?2HwJPY$=c@EL&Qv{L(M@Z@vS6hNe z(pxR>02jlpyWzZexAkK78#MST!D|HHCio7)WrTt;o=C+rL;9h^UHc;jlg1Zm^b*35 zJ3SE_N$@k$7E|`{u+&bwSH_QTZr;3U$aN?^K6Ns_*vpVNBW`U8mC{mpR9_~?S43e; zbklhhr@cL~%xK-I*!WaDqOmtBOY zNx)9qwjq}+>t*rAwnq53_+Z<2;p-x{{aGBmv;B7Y56JHg0!iB+3fNWYeHZ)Hcx2d* z#q}Mt@J+F^y?*yiR7TW-nmEpWisB8mV16}zCdycv6pgd?uaIIEVaR>* z3{UX!_>gOOit}`ey)AORSA�MsH#<2^#x|~_Z$+waIVNzXFMLQ| z6fI=3pTI+~o4_PU5}Y8Ax2aB&yky)YogtVeun8Q3=L!BQ{@K?EF%j97bNz`FDRFbx VP58Bl_ebCp@p3_jHor#ge?0O*bjE$?nUe7 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 L float(intime): - ic("too soon for",order.id) + print(f"too soon for {order.id}") #try to execute else: #try to execute specific order a = self._execute_order(o = order, intime=intime, work_range=work_range) if a == 1: - ic("EXECUTED") + #ic("EXECUTED") todel.append(order) changes = 1 else: - ic("NOT EXECUTED",a) - #ic("istodel",todel) + print("NOT EXECUTED {a}") + #ic("NOT EXECUTED",a) + ##ic("istodel",todel) #vymazu z pending orderu vschny zprocesovane nebo ty na výmaz for i in todel: self.open_orders.remove(i) todel = {} #tady udelat pripadny ořez self.btdata - priste zaciname od zacatku - #ic("before delete", len(self.btdata)) + ##ic("before delete", len(self.btdata)) #TEST zkusime to nemazat, jak ovlivni performance #Mazeme, jinak je to hruza #nechavame na konci trady, které muzeme potrebovat pro consekutivni pravidlo del self.btdata[0:index_end-2-BT_FILL_CONS_TRADES_REQUIRED] - #ic("after delete",len(self.btdata[0:index_end])) + ##ic("after delete",len(self.btdata[0:index_end])) if changes: return 1 else: return 0 @@ -214,8 +215,8 @@ class Backtester: fill_time = None fill_price = None order_min_fill_time = o.submitted_at.timestamp() + BT_DELAYS.sub_to_fill - ic(order_min_fill_time) - ic(len(work_range)) + #ic(order_min_fill_time) + #ic(len(work_range)) if o.order_type == OrderType.LIMIT: if o.side == OrderSide.BUY: @@ -248,7 +249,7 @@ class Backtester: if consec_cnt == BT_FILL_CONS_TRADES_REQUIRED: #(1679081919.381649, 27.88) - ic(i) + #ic(i) fill_time = i[0] fill_price = i[1] print("FILL LIMIT BUY at", fill_time, datetime.fromtimestamp(fill_time).astimezone(zoneNY), "at",i[1]) @@ -278,7 +279,7 @@ class Backtester: consec_cnt += 1 if consec_cnt == BT_FILL_CONS_TRADES_REQUIRED: #(1679081919.381649, 27.88) - ic(i) + #ic(i) fill_time = i[0] fill_price = i[1] print("FILL LIMIT SELL at", fill_time, datetime.fromtimestamp(fill_time).astimezone(zoneNY), "at",i[1]) @@ -296,7 +297,7 @@ class Backtester: #najde prvni nejvetsi čas vetsi nez minfill if i[0] > float(order_min_fill_time): #(1679081919.381649, 27.88) - ic(i) + #ic(i) fill_time = i[0] fill_price = i[1] print("FILL ",o.side,"MARKET at", fill_time, datetime.fromtimestamp(fill_time).astimezone(zoneNY), "cena", i[1]) @@ -306,7 +307,7 @@ class Backtester: return -1 if not fill_time: - ic("not FILLED") + #ic("not FILLED") return 0 else: @@ -316,7 +317,7 @@ class Backtester: o.filled_avg_price = float(fill_price) o.status = OrderStatus.FILLED - ic(o.filled_at, o.filled_avg_price) + #ic(o.filled_at, o.filled_avg_price) a = self.update_account(o = o) if a < 0: @@ -396,13 +397,13 @@ class Backtester: optimalized as bisect left """"" pos = bisect_left(self.btdata, (time,)) - ic("vracime last price") - ic(time) + #ic("vracime last price") + #ic(time) if pos == 0: - ic(self.btdata[0][1]) + #ic(self.btdata[0][1]) return self.btdata[0][1] afterTime, afterPrice = self.btdata[pos-1] - ic(afterPrice) + #ic(afterPrice) return afterPrice @@ -412,8 +413,8 @@ class Backtester: # #print(i) # if self.btdata[i][0] >= time: # break - # ic(time, self.btdata[i-1][1]) - # ic("get last price") + # #ic(time, self.btdata[i-1][1]) + # #ic("get last price") # return self.btdata[i-1][1] def submit_order(self, time: float, symbol: str, side: OrderSide, size: int, order_type: OrderType, price: float = None): @@ -493,7 +494,7 @@ class Backtester: limit_price=(float(price) if price else None)) self.open_orders.append(order) - ic("order SUBMITTED", order) + #ic("order SUBMITTED", order) return id diff --git a/v2realbot/controller/services.py b/v2realbot/controller/services.py index 8e48204..5886ef6 100644 --- a/v2realbot/controller/services.py +++ b/v2realbot/controller/services.py @@ -222,7 +222,7 @@ def save_history(id: UUID, st: object, runner: Runner, reason: str = None): #zkousime precist profit z objektu try: profit = st.state.profit - trade_count = len(st.tradeList) + trade_count = len(st.state.tradeList) except Exception as e: profit = str(e) diff --git a/v2realbot/loader/__pycache__/aggregator.cpython-310.pyc b/v2realbot/loader/__pycache__/aggregator.cpython-310.pyc index 81896677b4d106b455f5c02a47eda2cecd4ee9f6..b8552a9fe28f25b9e629a22467f4bbc2e7a63c48 100644 GIT binary patch delta 28 icmca>bk~SCpO=@50SK6jTvNn1^4^qSyfyi`L>T~YUkHW( delta 28 icmca>bk~SCpO=@50SLayTBL|>T~ew+NL0 diff --git a/v2realbot/loader/__pycache__/trade_offline_streamer.cpython-310.pyc b/v2realbot/loader/__pycache__/trade_offline_streamer.cpython-310.pyc index 3445022f4c86c6f53a5ec8f4a82e609428626d27..08a22e0458b2d074a8dad25411026e1bda361d79 100644 GIT binary patch delta 1145 zcmZ8gU2oJz6rDTvj=f&nYdf1bn@4v*WrRGAq0MN^t(A5=}&7Res0 zT~IjLeC_Id!$_PusWJt8QvkQ`~hgcgOSw~t5v9L?BACa}8_iT5> zu%z5<<3YI_6EQ4C`nsryON0gxlXtMDJA!&KQ5M>$dLTx*A7hM|E!xRgF)r;AvezP% zHg68-_mQfLiDFXLOHdAq2h!FDxH`G0=>VA;uNLR8rm4rJxC`in=Q2I zYn%Pzq;$~f`~K?Zk*0SJ9UdA)Bd!+gnkeuIA69Nk`G|6*gEwMTdE!H4@^o{R&tug* zSYd8S1$wVIB?CUH^M^J&vXAen^7&JW=h=hpW$7Zl;B71(Ym@H)SDD7OpqMF6|3{-= zPzjoJuDYOF9OXO}%CI;iW+mR95BN+trt??+TrF#1oKH7-!`bMGZ?-n?-$^&~hs{5RKF7o= z>ui48-Q3zYI;qH(@+3HUdIxd(AOc2hFu^ebi0p_u)PWY5rUNbnbr&3#{~C;5aH-2Q zH1UQ$7-5)#Sp(Om4^#j60RxlTrb|u3HD(#35tv5a3bz_xp+?5^bmQgIa37BETU))` dcQ-oSYz)zTc6TG?8@+5?mwc(GFY=wCmA7Zr0^4r~ zowiam)>bkX4iS-j1<5Ne9JrJU_y^$12_dxN(q1@m;ErhDo0O8)md9_t_q}i45BuTS z$IHR4@4F1IcmKX9{#kk$d~fr>%zw5okEE?w-^>7*C<*H`M!R*Efnr;ZuumegyyZ&r zJH*DfvCcLtDKh(xg1*&aMMc3Fef#feRn5E2QhuztX{Uzb$T2kMy5@|$zAppe90G}I zsQMBTVz7r#Rg@2TYN9n&M9LgPT0(Y7r&3yHN3i)(YDp$sW%X+rM=ho;QYEXd^~q}J z7)1KhG8l=GCOuRD#SnRB_;nVw=7Tq`SiMM3?I6X>=3KG$wkyfyj)5VgiJlCrI=OvX9ZRBgk znK3JH5MwZz!3NmQWR(Q8bv4GL;|8X2+(i2%Usq(mkR;~3E~9~E1iFmZm5YVEntpi| zPZ`2ie%h^#>H`yxjKy^7#auK~4`-`eu3Y@cx~VVEqKHq8PXqM%DxiLdnY4P0BkNkK zzZJQxLeV1Ti&DO#Vd_$Ti?QY-*#BI4c;0tn7P)gRHo8ac|CSum7V}gSr6S)b&iyY( z^Be<-uj#*l(!pc>bV^MXEAqSwGyMAB#}Qq{VW8Gesw!qKv9wCM_}tsiFcIf?L@&i& zIWJDV68uEISzH*iG{UwoP(msy-WsDY?m;X{$XK5X$V^O?eaOzWAAM4}1|^tqd60kO zeQjOF-#xjKZ}_*S59%B3Tf28-(cas=JCxfyy|(Dw$$#|Ufw%L&{N+m%zTHihDWHbS zq_mf8cYDbN0u~5xJ38uMH|`~MLKkT%B zdlqr$|K$&+ksHDadNB?>9>BuWAhf_lrek=hX>!k4u`C;f9d1G{!ktQ&(za;1{^*Zz j0!ugTo#E}hPIr*ZB0915IslR2VvX!$h%J-YD>BOEdK diff --git a/v2realbot/loader/aggregator.py b/v2realbot/loader/aggregator.py index 41271c0..2901e89 100644 --- a/v2realbot/loader/aggregator.py +++ b/v2realbot/loader/aggregator.py @@ -93,8 +93,8 @@ class TradeAggregator: #pokud projde TRADE s cenou 0.33% rozdilna oproti predchozi, pak vyhazujeme v ramci cisteni dat (cca 10ticku na 30USD) pct_off = 0.33 - #ic(ltp.price) - #ic(ltp.price[symbol]) + ##ic(ltp.price) + ##ic(ltp.price[symbol]) try: ltp.price[symbol] diff --git a/v2realbot/loader/trade_offline_streamer.py b/v2realbot/loader/trade_offline_streamer.py index 01964ca..4505664 100644 --- a/v2realbot/loader/trade_offline_streamer.py +++ b/v2realbot/loader/trade_offline_streamer.py @@ -63,7 +63,7 @@ class Trade_Offline_Streamer(Thread): for i in self.streams: self.uniquesymbols.add(i.symbol) - ic(self.uniquesymbols) + #ic(self.uniquesymbols) ##z unikatnich symbolu naplnime keys pro dictionary # for i in self.uniquesymbols: # self.to_run @@ -77,14 +77,14 @@ class Trade_Offline_Streamer(Thread): for i in self.streams: self.to_run[i.symbol].append(i) - ic(self.to_run) + #ic(self.to_run) #prepare data symbpole = [] for key in self.uniquesymbols: symbpole.append(key) #print(symbpole)) - ic(self.time_from.astimezone(tz=zoneNY)) - ic(self.time_to.astimezone(tz=zoneNY)) + #ic(self.time_from.astimezone(tz=zoneNY)) + #ic(self.time_to.astimezone(tz=zoneNY)) ##PREPSAT jednoduse tak, aby podporovalo jen jeden symbol #agregator2list bude mit vstup list @@ -92,7 +92,7 @@ class Trade_Offline_Streamer(Thread): #REFACTOR STARTS HERE calendar_request = GetCalendarRequest(start=self.time_from,end=self.time_to) cal_dates = self.clientTrading.get_calendar(calendar_request) - ic(cal_dates) + #ic(cal_dates) #zatim podpora pouze main session #zatim podpora pouze 1 symbolu, predelat na froloop vsech symbolu ze symbpole @@ -134,8 +134,8 @@ class Trade_Offline_Streamer(Thread): #pokud jde o dnešní den a nebyl konec trhu tak cache neukládáme if day.open < datetime.now().astimezone(zoneNY) < day.close: print("not saving the cache, market still open today") - ic(datetime.now().astimezone(zoneNY)) - ic(day.open, day.close) + #ic(datetime.now().astimezone(zoneNY)) + #ic(day.open, day.close) else: with open(file_path, 'wb') as fp: pickle.dump(tradesResponse, fp) @@ -157,13 +157,13 @@ class Trade_Offline_Streamer(Thread): wait_for_q = False else: wait_for_q = True - ic(wait_for_q) + #ic(wait_for_q) # v tradesResponse je dict = Trades identifikovane symbolem for symbol in tradesResponse: #print(tradesResponse[symbol]) celkem = len(tradesResponse[symbol]) - ic(symbol, celkem) + #ic(symbol, celkem) #print("POCET: ", celkem) cnt = 1 @@ -173,13 +173,13 @@ class Trade_Offline_Streamer(Thread): #protoze je zde cely den, poustime dal, jen ty relevantni #pokud je start_time < trade < end_time #datetime.fromtimestamp(parse_alpaca_timestamp(t['t'])) - #ic(t['t']) + ##ic(t['t']) if self.time_from < to_datetime(t['t']) < self.time_to: #poustime dal, jinak ne if wait_for_q: if 'Q' not in t['c']: continue else: - ic("Q found poustime dal") + #ic("Q found poustime dal") wait_for_q = False #homogenizace timestampu s online streamem diff --git a/v2realbot/main.py b/v2realbot/main.py index 91b2edd..83403ce 100644 --- a/v2realbot/main.py +++ b/v2realbot/main.py @@ -3,7 +3,7 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from v2realbot.enums.enums import Mode, Account from v2realbot.config import WEB_API_KEY from datetime import datetime -from icecream import install, ic +#from icecream import install, ic import os from rich import print from threading import current_thread @@ -26,12 +26,12 @@ from threading import Thread import asyncio #from async io import Queue, QueueEmpty -install() -ic.configureOutput(includeContext=True) -def threadName(): - return '%s |> ' % str(current_thread().name) -ic.configureOutput(prefix=threadName) -ic.disable() +# install() +# ic.configureOutput(includeContext=True) +# def threadName(): +# return '%s |> ' % str(current_thread().name) +# ic.configureOutput(prefix=threadName) +# ic.disable() """"" Main entry point of the bot. Starts strategies according to config file, each in separate thread. diff --git a/v2realbot/static/js/mywebsocket.js b/v2realbot/static/js/mywebsocket.js index 3759572..32cfc28 100644 --- a/v2realbot/static/js/mywebsocket.js +++ b/v2realbot/static/js/mywebsocket.js @@ -82,7 +82,7 @@ function connect(event) { logcnt++; - row = '
'+logLine.time + " " + logLine.event + ' - '+ logLine.message+'
' + row = '
'+logLine.time + " " + logLine.event + ' - '+ (logLine.message == undefined ? "" : logLine.message) +'
' str_row = JSON.stringify(logLine.details, null, 2) row_detail = '
' + str_row + '
' diff --git a/v2realbot/strategy/StrategyOrderLimitKOKA.py b/v2realbot/strategy/StrategyOrderLimitKOKA.py index 5b219a8..e5aaf34 100644 --- a/v2realbot/strategy/StrategyOrderLimitKOKA.py +++ b/v2realbot/strategy/StrategyOrderLimitKOKA.py @@ -16,7 +16,7 @@ class StrategyOrderLimitKOKA(Strategy): async def orderUpdateBuy(self, data: TradeUpdate): if data.event == TradeEvent.FILL or data.event == TradeEvent.PARTIAL_FILL: - ic("vstupujeme do orderupdatebuy") + #ic("vstupujeme do orderupdatebuy") print(data) o: Order = data.order #dostavame zde i celkové akutální množství - ukládáme @@ -39,18 +39,18 @@ class StrategyOrderLimitKOKA(Strategy): async def orderUpdateSell(self, data: TradeUpdate): if data.event == TradeEvent.PARTIAL_FILL: - ic("partial fill udpatujeme pozice") + #ic("partial fill udpatujeme pozice") self.state.avgp, self.state.positions = self.interface.pos() elif data.event == TradeEvent.FILL: #muzeme znovu nakupovat, mazeme limitku #self.state.blockbuy = 0 - ic("notifikace sell mazeme limitku") + #ic("notifikace sell mazeme limitku") self.state.vars.limitka = None self.state.vars.lastbuyindex = -5 #this parent method is called by strategy just once before waiting for first data def strat_init(self): - ic("strat INI function") + #ic("strat INI function") #lets connect method overrides self.state.buy = self.buy self.state.buy_l = self.buy_l @@ -67,8 +67,8 @@ class StrategyOrderLimitKOKA(Strategy): sizer = size self.state.blockbuy = 1 self.state.vars.lastbuyindex = self.state.bars['index'][-1] - ic(self.state.blockbuy) - ic(self.state.vars.lastbuyindex) + #ic(self.state.blockbuy) + #ic(self.state.vars.lastbuyindex) return self.state.interface.buy(size=sizer) #pro experiment - nemame zde max mnozstvi @@ -78,9 +78,9 @@ class StrategyOrderLimitKOKA(Strategy): #TODO pokud je cena 2 decimals, nechavam. pokud je 3 mistne delam round(x,2) if price is None: price=trunc(self.state.interface.get_last_price(self.symbol),2) - ic(price) + #ic(price) self.state.blockbuy = 1 self.state.vars.lastbuyindex = self.state.bars['index'][-1] - ic(self.state.blockbuy) - ic(self.state.vars.lastbuyindex) + #ic(self.state.blockbuy) + #ic(self.state.vars.lastbuyindex) return self.state.interface.buy_l(price=price, size=size) \ No newline at end of file diff --git a/v2realbot/strategy/StrategyOrderLimitVykladaci.py b/v2realbot/strategy/StrategyOrderLimitVykladaci.py index ccb8571..1a20b88 100644 --- a/v2realbot/strategy/StrategyOrderLimitVykladaci.py +++ b/v2realbot/strategy/StrategyOrderLimitVykladaci.py @@ -21,17 +21,17 @@ class StrategyOrderLimitVykladaci(Strategy): async def orderUpdateBuy(self, data: TradeUpdate): o: Order = data.order ##nejak to vymyslet, aby se dal poslat cely Trade a serializoval se - self.state.ilog(e="Příchozí BUY notifikace", msg="order status:"+o.status, trade=json.loads(json.dumps(data, default=json_serial))) + self.state.ilog(e="Příchozí BUY notif", msg=f"{o.status=}", trade=json.loads(json.dumps(data, default=json_serial))) if o.status == OrderStatus.FILLED or o.status == OrderStatus.CANCELED: #pokud existuje objednavka v pendingbuys - vyhodime ji if self.state.vars.pendingbuys.pop(str(o.id), False): - self.state.ilog(e="Příchozí BUY notifikace - mazeme ji z pb", msg="order status:"+o.status, orderid=str(o.id), pb=self.state.vars.pendingbuys) + self.state.ilog(e="Příchozí BUY notif - mazeme ji z pb", msg=f"{o.status=}", orderid=str(o.id), pb=self.state.vars.pendingbuys) print("limit buy filled or cancelled. Vyhazujeme z pendingbuys.") - ic(self.state.vars.pendingbuys) + #ic(self.state.vars.pendingbuys) if data.event == TradeEvent.FILL or data.event == TradeEvent.PARTIAL_FILL: - ic("vstupujeme do orderupdatebuy") + #ic("vstupujeme do orderupdatebuy") print(data) #dostavame zde i celkové akutální množství - ukládáme self.state.positions = data.position_qty @@ -59,7 +59,7 @@ class StrategyOrderLimitVykladaci(Strategy): self.state.vars.limitka = puvodni else: self.state.vars.limitka_price = cena - self.state.ilog(e="Příchozí BUY notif - menime limitku", msg="order status:"+o.status, orderid=str(o.id), limitka=str(self.state.vars.limitka), limtka_price=self.state.vars.limitka_price, puvodni_limitka=str(puvodni)) + self.state.ilog(e="Příchozí BUY notif - menime limitku", msg=f"{o.status=}", orderid=str(o.id), limitka=str(self.state.vars.limitka), limtka_price=self.state.vars.limitka_price, puvodni_limitka=str(puvodni)) except APIError as e: self.state.ilog(e="API ERROR pri zmene limitky", msg=str(e), orderid=str(o.id), limitka=str(self.state.vars.limitka), limitka_price=self.state.vars.limitka_price, puvodni_limitka=str(puvodni)) @@ -71,7 +71,7 @@ class StrategyOrderLimitVykladaci(Strategy): async def orderUpdateSell(self, data: TradeUpdate): - self.state.ilog(e="Příchozí SELL notifikace", msg="order status:"+data.order.status, trade=json.loads(json.dumps(data, default=json_serial))) + self.state.ilog(e="Příchozí SELL notif", msg=f"{data.order.status=}", trade=json.loads(json.dumps(data, default=json_serial))) #PROFIT #profit pocitame z TradeUpdate.price a TradeUpdate.qty - aktualne provedene mnozstvi a cena #naklady vypocteme z prumerne ceny, kterou mame v pozicich @@ -85,11 +85,11 @@ class StrategyOrderLimitVykladaci(Strategy): trade_profit = (sold_amount - avg_costs) self.state.profit += trade_profit - self.state.ilog(e="SELL not - PROFIT: "+str(round(float(trade_profit),3))+" celkem: "+str(round(float(self.state.profit),3)), msg=str(data.event), sold_amount=sold_amount, avg_costs=avg_costs, trade_qty=data.qty, trade_price=data.price, orderid=str(data.order.id)) + self.state.ilog(e=f"SELL not - PROFIT:{round(float(trade_profit),3)} celkem:{round(float(self.state.profit),3)}", msg=str(data.event), sold_amount=sold_amount, avg_costs=avg_costs, trade_qty=data.qty, trade_price=data.price, orderid=str(data.order.id)) if data.event == TradeEvent.PARTIAL_FILL: self.state.ilog(e="SELL notifikace - Partial fill", msg="pouze update pozic", orderid=str(data.order.id)) - ic("partial fill jen udpatujeme pozice") + #ic("partial fill jen udpatujeme pozice") #TODO tento update mozna vyhodit a pockat vzdy na plny fill - otestovat az bude cas self.state.avgp, self.state.positions = self.interface.pos() elif data.event == TradeEvent.FILL or data.event == TradeEvent.CANCELED: @@ -97,20 +97,20 @@ class StrategyOrderLimitVykladaci(Strategy): #muzeme znovu nakupovat, mazeme limitku, blockbuy a pendingbuys #self.state.blockbuy = 0 - ic("notifikace sell mazeme limitku a update pozic") + #ic("notifikace sell mazeme limitku a update pozic") #updatujeme pozice self.state.avgp, self.state.positions = self.interface.pos() - ic(self.state.avgp, self.state.positions) + #ic(self.state.avgp, self.state.positions) self.state.vars.limitka = None self.state.vars.limitka_price = None self.state.vars.lastbuyindex = -5 self.state.vars.jevylozeno = 0 await self.state.cancel_pending_buys() - self.state.ilog(e="Příchozí SELL - FILL nebo CANCEL - mazeme limitku a pb", msg="order status:"+ data.order.status, orderid=str(data.order.id), pb=self.state.vars.pendingbuys) + self.state.ilog(e="Příchozí SELL - FILL nebo CANCEL - mazeme limitku a pb", msg=f"{data.order.status=}", orderid=str(data.order.id), pb=self.state.vars.pendingbuys) #this parent method is called by strategy just once before waiting for first data def strat_init(self): - ic("strat INI function") + #ic("strat INI function") #lets connect method overrides self.state.buy = self.buy self.state.buy_l = self.buy_l @@ -141,7 +141,7 @@ class StrategyOrderLimitVykladaci(Strategy): return 0 if size is None: size=self.state.vars.chunk if price is None: price=price2dec((self.state.interface.get_last_price(self.symbol))) - ic(price) + #ic(price) print("odesilame LIMIT s cenou/qty", price, size) self.state.ilog(e="send LIMIT buy to if", msg="S:"+str(size)+" P:"+str(price), price=price, size=size) order = self.state.interface.buy_l(price=price, size=size) @@ -149,9 +149,9 @@ class StrategyOrderLimitVykladaci(Strategy): self.state.vars.pendingbuys[str(order)]=price self.state.blockbuy = 1 self.state.vars.lastbuyindex = self.state.bars['index'][-1] - ic(self.state.blockbuy) - ic(self.state.vars.lastbuyindex) - self.state.ilog(e="Odslano a ulozeno do pb", order=str(order), pb=self.state.vars.pendingbuys) + #ic(self.state.blockbuy) + #ic(self.state.vars.lastbuyindex) + self.state.ilog(e="Odeslan buy_l a ulozeno do pb", order=str(order), pb=self.state.vars.pendingbuys) async def cancel_pending_buys(self): print("cancel pending buys called.") @@ -161,11 +161,11 @@ class StrategyOrderLimitVykladaci(Strategy): if len(self.state.vars.pendingbuys)>0: tmp = copy.deepcopy(self.state.vars.pendingbuys) for key in tmp: - ic(key) + #ic(key) #nejprve vyhodime z pendingbuys self.state.vars.pendingbuys.pop(key, False) res = self.interface.cancel(key) - self.state.ilog(e="Pendingy zrusen pro"+str(key), orderid=str(key), res=str(res)) + self.state.ilog(e=f"Pendingy zrusen pro{key=}", orderid=str(key), res=str(res)) print("CANCEL PENDING BUYS RETURN", res) self.state.vars.pendingbuys={} self.state.vars.jevylozeno = 0 diff --git a/v2realbot/strategy/__pycache__/StrategyOrderLimitVykladaci.cpython-310.pyc b/v2realbot/strategy/__pycache__/StrategyOrderLimitVykladaci.cpython-310.pyc index 02f26d6f9cd7b505749a47fc2a896ec43668d352..363fd6ab66536ae3e9db9c1b1b49e4c6a80c5f91 100644 GIT binary patch delta 2397 zcmZuyU1(fI6uxKf-Jk5<{mCZTzx-{IHp$xbhbme_3$0jbYMO+mHV|4aX=Yn{7|SE3I!DW`{nX+-g7@>s&H3aQ@@50aZ)?O{$!%ACAHgZlZj8Xq4nJk zGgaGf29}vM;V34UK~t}X>@eyh8^AqVEj{C2&d8d4Tk9yY* z;%cAS@2I$z;cYcGp>XAd;zlwO+Yza#J5pjih$*|}C9o{L#sGbseyK8W^H~MMxza$> zCB(xb>`knrL(_GDM`|8&L~F9`s}F7|=NQe6w8Xefnby)9fXT~s$-GH}% zD{J02yjS6>Oe&k2DtC#$e92(7t+=mbFWBYM5%Ha`4~9uAy8T>i`m2#@sA%z=m2oY` zA0*nI2N)Gofs%L>_|!X!Jh%3Wo54(Q4^1VEiTlB1{3Ockh8Lb;Nl2=r;D@y8XX1z8 zFdP*DeJ=eCD9W33u-GjQ*b^|DtRR3t^_vN zZ3Q{y_FplhE#0PO$H)^Y!;ny5>NrAD$IK42(rZ3>L0YljYi59C+hG-{sc5B`o%OCJ z!4xAxmUv+#``qM^;H8h6i6$`7pX?;Z8;08>z5mahyyb=|BfUNA=Iu>g4=3^{X3FTL z-+JGc;_^^NqedCTp6yOO$=G!>`;jmB5KxLVvYk`qI3C2zqxT=)TYSA(eRwZ3dwg;- zQz+U?7ppP8U@z>GC%nypx5MSZSj#4}H#2j3`jv?@<3Fnyrs~fu=JLzAm2uG*xhcMk z92U<;Cm0B0`(RL7=-R)Lnxms zL!~}jyU{GGHPj2`iggU<4G+$YytPbvuw*qmZU|WfN?49y|J0sb+-5%>G zt+!6*pkj@YOflZUQR+ePLmZOGn;7&UYewOJC2vLC(@cJjGXCv9)t zhoyt5n%Wkufdelq=ZDuMYe-l3JB&W+@PW-8xKO}*>h{A#O_LQ3 z)m~X`sOV=^$hcK@v+8BkeSkw&&2CWLF*Qonsyg2BdivdS@?hveu|^1@1Q!VM1Vw~~ zcA;3zTf{~8&dc+l(2bB`Ean$VB}^@E7&~^)lJVGsTDJjkUHsaUiayCq&c;N%_rO1J Co+tGH delta 2657 zcmai0&2Jk;6yKR$JO2JmylW?Qwr)w|hEfg%O86`Y)RdA2(yCQkv~oQTc;eV$cic9{ z#RVe}he$jFU8`%PqsArY3J0dmh-^rCb*w9$BUC zVprpYM|o^3E)pP5_6ZAIAIT{TGK$vVnF|zqB0Vzi6QXqq&xkA^U!~r;;d)|~UL)>X zBF(~RAyQp3w9KKWV-Ec-rnNQqJCO&!LZ2wzq?m#|<-7bnBvmxEKDnZUcADE=z1yRF zH;Zi21&wJ(H9wSN-3=LqdOlM-%3@HBUzr6J#WyJdpOFXCmNf{c^iFB$kr-7v>ch?m zzHN_}SaLIfp&$UdPjBtHuAQg2b|w{?stVLi_6gLZ4&lW<~wzPD?P zB;p>mG9lsArv5KQ_M+TkP$jh3R;HAtcV_9=*~P$cr;c^nPjq;|-AXh6Unws^+yEq! z-3$`Vk7H;-F>{S<^kr#m-yUe|Fz=D+1e$h(d>_lH6oqVz?JCT6gMIQQVcM18>%mLp zl1izZUu+lTQrH@=uU4wHJMoswYOd{xifDWD@|&?DnL~9zspVf|tk{{l=!y1vo7dKA zHf!0+qrJ{5qIRLZAuFNI&EG-~5}^I=h^NzfRm#Y%;64}$_g;A_YDf3uQo)?O8np_G zu%}mpWR_aQ(q~ABBuIgV;9Gtkogt6QpQ5L&KZvHifrUax8G*hL?oY!lBQKp;BwhkZ zNQ60ZZ$n;;mB|sg6?^E34D`={{zdu}ubxFsO{4`%F;;3@10w|ypqUgHNq7uCagmmZ zc)s`X@Z2~{C@add;FsLgVX(#-#DI2dd}1p%q@d;`(ZewnJ^j33#=TF6Ia-k89g%1L zi7*imCG+1=dSYB9pn`I1?`coM6)k=J!R;H>S6ZFhH|*tSjvu$1Em2=lyl@YIULH!c z_hv^L`+&Xl;)!P$PR`rE>Y(j}?P{&DT3eg9<+q8q_jXF_6<5?N4SS{DXxO~gwA*YQ zSf^;U-s;q=HTgpF(Sw}>+vnI`4Q$sc9i(2PzE&5jZM$Oo!uNw5MBTn=&yG4&JtP7Ow0Gjk3S8wseaTnAUe!zALbA%dXd^E3k z>M)M-Hh5BAn)sLqIgy(;T`bK*mY%&Ot{XCtuXW){(@1G z$X2vVuls*Oz{|~o&_{Jk{C74ZGvEJ$M*kwB#q&%OoLV z`GYH}@aHgT?8qQktu*0f@wv4Mk|C=Gx>#Eu=&Q92w}Zw|@y>#g-ygxpD+17~SaL>B zL77k}jggZ4F#q0pbu~G3oIyw-R1ww?koyDULaWtqk#qAml258{qfZB#rDl5055 nj`L^Hc<$yq1&8eKqGedT;?^oyva1d=(O^4YwVIQusr&y13@u)r diff --git a/v2realbot/strategy/__pycache__/base.cpython-310.pyc b/v2realbot/strategy/__pycache__/base.cpython-310.pyc index cb2b7c8389e7efe8217ab017eba1dc40d9dab32c..f1be1eacd682a09cf8a352f390eb2f853b0054b0 100644 GIT binary patch delta 3685 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 delta 3717 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 KWAaZu=l%zgw_Y{? delta 2746 zcmZ{mU2Gf25rDbJqfAN^O-rPHNKul1B}%eP(~AEkTe1}+Nn1BjU8jc_=QDRHpLBPm z=SW#L0w{?TAh8n^_BODMHqH;=qIUCF2nPBR6e!TQ_N5Oka41qB4*?4FEih0N1)7NGh$Zm-enZZnjA5ZKhKyYz{(gaHK48Xfp5yTn0WP};kB5uF`+Lb8XCpyV)rN-zw2FW-l6qZsynegMNhfMJjEgZvQsnLL8x z!+aFQqvGgd*cgw6_?Q^yN5l|DKVEL&NBKCKPw)v`a7B6$rN{Vjlpf>SR49K!zM%aq z!UD}ME#K45FxD-jy2aY%jNZd~m#^sC8QUyBi;N%X#sdHfJva)IzVNtNtC%(6h-t9g z9Vqov2%YIH&NMB>k}Sd6So9U`|BzoUG`zu{Pm^ibuK~2tNUvS03TUTc)HJzWs+lHq z;45Shc@~5#=Vn$GeY|qhj9>9gUw~~nMH!3su!77-|8io8+_WesAgYd466T!c)J0x{ z-Q=>Lux=NdsuuVHx8XV_MrC``$K+_NlkHnR9oxcKtGwK}XW#%D-qix#7fw0Q%GLEw zFm&6qG4zx2?~QMbjMF-!gb75T^SWCF@&U&Q>mty7YfhY!H=1(nki6eCXerGW(oB;1 zM$@!BuTryWcE$5CJqKxO6X68mS;AwVt7(G$IPn8~d@9|>P!hjJBa1h{emNeWVk!Af zyr=Nkj=m{0Aylt>T9iom{KZoQR3u7Lu4Xw zTK={9V>TpTNo2Oa_-!jVg|gX4`W-r)l7C2)d)K*U)eEGeBRW_MgR^pSzA!uQSdl{)xF6zcx@n(d19@y2c6tWR$NvfwXjk96 zTs|B`FA6cstxG;op48IzR~yhUPS&bg$Qis$SXIeKph|)Z@<*+mMU|d9z6a6s6~|WI zz9U|h4wbgI<*nAO>{a=B>!*d2S;k;c4NC`6`Uvk-tg}PF-5j z4?DsO!j|I%;mdaQZWvx8XN!m+48mWZw3zLeQ5oy-Lsa=Xil8Rai)Rt8$xJ#IUJ8Ze zP-;Ya>3DH9FnFE3uH6v4iL&34{0ic7*7m{nqY^U%ZnX2Y6O!6>H zlHhs53y8Zch?#gaEi4gpB`OsQS^QCc(b;!u?G}O!*qSRP)Fq9e`Jrt|IL;$`wV@Aa z0p*DT_&q+WyGq62J!xeAy)Zx?bn4NtR}CH8uLUhcb4}BRA)JP0!bU;@k#B%IH2yUr z2z%mUz~%!s8?d=2a;pL$-+#u(r)xx4oiBmiFCqVwO|rf6Z`rFasg!L13JBCG`G`jM z2xP6+4;rj0HVBTjL?1~l3?I{oKKplFC_rBRAwTcR?NI*IDopi}{Bfhn^{1;=X?9r5 z*MPnt{PKG4ne>loWFYYDl|%`If;5I>} vo=(n6{#E)Om*#581kuB8g?HB-F-Gm!|0yCKisFA9U06JE{6)(9-ILz{d%$k# diff --git a/v2realbot/utils/utils.py b/v2realbot/utils/utils.py index 718163c..9c5aa43 100644 --- a/v2realbot/utils/utils.py +++ b/v2realbot/utils/utils.py @@ -6,7 +6,6 @@ import pytz from dateutil import tz from rich import print as richprint import decimal -from icecream import ic from v2realbot.enums.enums import RecordType, Mode, StartBarAlign import pickle import os @@ -94,7 +93,7 @@ def print(*args, **kwargs): if QUIET_MODE: pass else: - #ic(*args, **kwargs) + ####ic(*args, **kwargs) richprint(*args, **kwargs) def price2dec(price: float) -> float: