From 0c2e441aac3bc3964501c52e1f70cbb659a649e3 Mon Sep 17 00:00:00 2001 From: David Brazda Date: Mon, 24 Apr 2023 18:09:12 +0200 Subject: [PATCH] bugfixy + update time now --- v2realbot/ENTRY_backtest_strategyVykladaci.py | 11 +++++++-- v2realbot/__pycache__/config.cpython-310.pyc | Bin 2779 -> 2779 bytes v2realbot/config.py | 2 +- .../strategy/StrategyOrderLimitVykladaci.py | 22 +++++++++++------- ...trategyOrderLimitVykladaci.cpython-310.pyc | Bin 7197 -> 7281 bytes .../strategy/__pycache__/base.cpython-310.pyc | Bin 13155 -> 13417 bytes v2realbot/strategy/base.py | 8 ++++++- 7 files changed, 30 insertions(+), 13 deletions(-) diff --git a/v2realbot/ENTRY_backtest_strategyVykladaci.py b/v2realbot/ENTRY_backtest_strategyVykladaci.py index c003341..de54ef1 100644 --- a/v2realbot/ENTRY_backtest_strategyVykladaci.py +++ b/v2realbot/ENTRY_backtest_strategyVykladaci.py @@ -114,12 +114,15 @@ def next(data, state: StrategyState): #zaroven docasne menime ticks2reset na defenzivni 0.06 state.vars.ticks2reset = 0.06 state.ilog(e="DEF: Menime tick2reset na 0.06", ticks2reset=state.vars.ticks2reset, ticks2reset_backup=state.vars.ticks2reset_backup) + defense = True else: + defense = False #vracime zpet, pokud bylo zmeneno if state.vars.ticks2reset != state.vars.ticks2reset_backup: state.vars.ticks2reset = state.vars.ticks2reset_backup state.ilog(e="DEF: Menime tick2reset zpet na"+str(state.vars.ticks2reset), ticks2reset=state.vars.ticks2reset, ticks2reset_backup=state.vars.ticks2reset_backup) + if kolikmuzu < vykladka: vykladka = kolikmuzu if len(curve) < vykladka: @@ -131,9 +134,13 @@ def next(data, state: StrategyState): 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 + ##VAR - na zaklade conf. muzeme jako prvni posilat MARKET order if safe_get(state.vars, "first_buy_market") == True: - state.buy(size=qty) + #pri defenzivnim rezimu pouzivame vzdy LIMIT order + if defense: + state.buy_l(price=price, size=qty) + else: + state.buy(size=qty) else: state.buy_l(price=price, size=qty) print("prvni limitka na aktuální cenu. Další podle křivky", price, qty) diff --git a/v2realbot/__pycache__/config.cpython-310.pyc b/v2realbot/__pycache__/config.cpython-310.pyc index 43a4ca92073e2bde8b4052371fdff09db4690a2b..8a9750e399396c9009c25826d2ceac96315aa091 100644 GIT binary patch delta 23 dcmcaDdRvq)pO=@50SKnfbxVoo-N<*A3jj-)24DaH delta 23 dcmcaDdRvq)pO=@50SL_d+)^&^Y~(x31prD024esK diff --git a/v2realbot/config.py b/v2realbot/config.py index 23d4f27..6e15f25 100644 --- a/v2realbot/config.py +++ b/v2realbot/config.py @@ -8,7 +8,7 @@ QUIET_MODE = False #0 - optimistic, every knot high will fill the order #N - N consecutive trades required #not impl.yet -#minimum is 1 +#minimum is 1, na alpace live to vetsinou vychazi 7-8 u BAC, je to hodne podobne tomu, nez je cena překonaná pul centu. tzn. 7-8 a nebo FillCondition.SLOW BT_FILL_CONS_TRADES_REQUIRED = 3 #during bt trade execution logs X-surrounding trades of the one that triggers the fill BT_FILL_LOG_SURROUNDING_TRADES = 10 diff --git a/v2realbot/strategy/StrategyOrderLimitVykladaci.py b/v2realbot/strategy/StrategyOrderLimitVykladaci.py index 8f6ae12..53bac50 100644 --- a/v2realbot/strategy/StrategyOrderLimitVykladaci.py +++ b/v2realbot/strategy/StrategyOrderLimitVykladaci.py @@ -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=o.status, 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=o.status, status=o.status, orderid=str(o.id), limitka=str(self.state.vars.limitka), limtka_price=self.state.vars.limitka_price, size=int(self.state.positions), 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)) @@ -80,19 +80,23 @@ class StrategyOrderLimitVykladaci(Strategy): #podle prumerne ceny, kolik stalo toto mnozstvi avg_costs = float(self.state.avgp) * float(data.qty) if avg_costs == 0: - self.state.ilog(e="Nemame naklady na PROFIT, AVGP je nula. Zaznamenano jako 0", msg="naklady=utrzena cena. TBD opravit.") + self.state.ilog(e="ERR: Nemame naklady na PROFIT, AVGP je nula. Zaznamenano jako 0", msg="naklady=utrzena cena. TBD opravit.") avg_costs = sold_amount trade_profit = (sold_amount - avg_costs) self.state.profit += trade_profit - 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)) + self.state.ilog(e=f"SELL notif - 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") - #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: + #update pozic, v trade update je i pocet zbylych pozic + old_avgp = self.state.avgp + old_pos = self.state.positions + self.state.positions = int(data.position_qty) + if int(data.position_qty) == 0: + self.state.avgp = 0 + self.state.ilog(e="SELL notifikace "+str(data.order.status), msg="update pozic", old_avgp=old_avgp, old_pos=old_pos, avgp=self.state.avgp, pos=self.state.positions, orderid=str(data.order.id)) + #self.state.avgp, self.state.positions = self.interface.pos() + + if data.event == TradeEvent.FILL or data.event == TradeEvent.CANCELED: print("Příchozí SELL notifikace - complete FILL nebo CANCEL", data.event) #muzeme znovu nakupovat, mazeme limitku, blockbuy a pendingbuys #self.state.blockbuy = 0 diff --git a/v2realbot/strategy/__pycache__/StrategyOrderLimitVykladaci.cpython-310.pyc b/v2realbot/strategy/__pycache__/StrategyOrderLimitVykladaci.cpython-310.pyc index 30e224a90b28206fae1acf4d9c9760a074fb3557..d78b5eb693b54a8d1771e3fb87bef6ec133e5041 100644 GIT binary patch delta 768 zcmZvazi-n}5XXIvlQ?bcxWxHgsG+JLY9$Cm6)F%=5h_FnND)#fA_{$J6(`i;*==c* zC`0B8fR z-zHx_C`aR}pH~4M2R!T_EFN5hcWgEIwk?=~8ESc(_|#iIC(;Bn+5xPK`rnF3Rgrdy zkl%}`ob34PnKI(=$K-8`u1U@S}0duS>+8;-GtSaW|FDFhy zD0DRh279lZ_oU3T?2B^McRiQS zFBnWy$+*6fTV6IcEvK^1TIy;}JE<$x(puSQ1h?v>?4wO+?=U}h2 z8JK6Ew1g^qWKj7n!#u=2?3?xyYHW962Auxh#BTtT?S-c^n|x7Pq8D(3D~RVDkGyuJ zQKobj1s8Le;cTn_GkgT#u*1lLkD_X`O!Pr}3)4l!HUj^Sq0L>)l8Czq3vmargLr{3 zInv&thb#)mM(7PJ|FMBvba~j595O^94pLu=&5BTEmlBag<3DR^T8WMa+>fGp6kTgIb~AYm=KAgAEr2HboGSbQj{2}Y delta 652 zcmZ{gJ#5oJ6vzGS7@9WDXB#J`6pMmLM3D$$2vJd`iV{^+2na$dMXEy2r9P*%u^pgR z5ktkm!1RQ~z(<+bkRT&tB{rsR+1OYZQ0EBlC1K>G``!P&`@eTj_q+PGs=1mrDv34s z^eQ{~S?i4@RT0I--WNOghK0mD1h|s;_zd_+80TY-?BkBaB@QgXv@p8^T;{o5V9A#X zNaALEZ{mY=PbSZ5s?R)=8j|o){iq`c?}u6!y?%rRmZEr9{(m)fDe>Z}!RP@=sADWW zRFf<=RLAMuo5BO_j8fz$u&2#J4d;?9o^32FEty+xh@X-xvs3>fd);=LYnFM=ywUVS zyV)|=?N%$wdTu+i%(lmxp=Ek*WUrMKzasv_zkt_M@4&=gsRt8xD6veqNvIRz7^Lf< z;@9*v{!E{O^QdKtBMI36Ln#1W%)ADU-!rGd>l|kO0Bqo4Zo1MErRA7kq7Ih`uE1S2 zup`U&&r+g~8B*lk?$pP706s3{YeziFKE&tw+l_$aJRu|;CG@9!Ov)f!BWw~D32nk7 z!iGRu9n4Ur#9$Dd(F-d1Uvw7rnylMo8;sgj!cDKMIM%lR1S@(@<>KxQektyo4mH>k g=*I55ZmU1Ee~Xg+r#ZedE<>qvU|a!+urRs&7s`R1^8f$< diff --git a/v2realbot/strategy/__pycache__/base.cpython-310.pyc b/v2realbot/strategy/__pycache__/base.cpython-310.pyc index 13e9b644ca7b4d685259f9d66b759ac17d41d6cd..56b12a18ca23b162335804bc63b608e95957d3be 100644 GIT binary patch delta 1160 zcmZvcTTByM6ozL_r==8Ht01Rp1raK36x!qU_#lWNLNs1dO$>=PobFPoVsUrWNNO}k z#RmgXm*6d8(fDA*7#;8T>+w8j&Wk37#Q2~w@zEDwjF+{h5sYz?`Lg!E*4}&lYm#}} z`eB_b>2x|2dV+lo;%W0mSC<6@_FDR&5vOTA^`ctT>{gm5$I8U~Sb3`|YQ=)x+Ae7J zky2+W^B`0DRN|;&= zXU_@bQfKAPxqRA8!dZ|D`B2eKi&b=J%0__)3PJnU=?&|W`j2m``i+q&6%Rig5BHHz z3z~$&lO4GjWcR@mk1I{dX1<5Z^Ko8r6CA<4#X(q$*NW%mr8JVWoA7gSX`c8|s)6Av zxuL>Id{a8kmZ2(n8o!qQV?9A(+}Jbu96&$*SzZU1*pF3^d>XsUzd3JH6j0?|-f|C* z`X+&4-1L>f5`&f1jLVEGjH`@mjOz>@k?d#OVBBQ1Fm5rDj0VOX^UgShcd)ji9{ku< z5rjd!TG3g{UsLiolRRU|1CToyT?}r2C_kmQ=xx#Vn7%G4g$;E`up`is%d*npyPcAhz_D6dcAnaUZi^Arx*I%Kl7O_%%eePv0u z#N0Q_oLVE5yfpk(4N(1p!hj_^^&URN6ttg&mp@eL<62vGSf;o0I2f#lT>KcEQ}!>H sJ!Sky7|Mx6L^2wQNdC9TzZrwLI23|sm=1a1mC+lDt8f9oOpn2=?{>r-;{X5v delta 1036 zcmZ9LNla5=5XaxV7HH@qibB~^q_px3wrqll3Mi#WhzSM{XpjbZY(-M?(Rd&w5Je8| zal#@7DTy&r0zsdMxUZ-u4n`9>=)n_-o=EiM^38{W;U(|a|M#Dnelyc_vH44*C15s3 zOZ*w>@~ZQPZdv+tP=o!t0q|m`{`{_nG_|n7-YBa@YH_drBpgoX&K}|HRZE29Sjq9I zrNVKlP$em4+AsZ)I2gv7q{0gDM+c35Q>)Cjh9tk)Zwapp!5DxP0)I@GE~N9X4{q?s z^7zh>6y8X&a!Hl;NjzgYwu#3ocq|UTCFMXorY7fNbMkSxh@X>_Es1;txyK3?Fv!s| z8dEwWkX!rlbV|{-0j}5}VTf><;9Wr(seX=1;9?lRr?`r_l1liyq~}njs=wt_bOTr^ z|5*D4A?_XIWlJ&_dd#<#!yxw9+)#~Ew%sOng=$0(UW~C>&3*h_OBarCp{1wJ$`Hm+ zX$g^Ilz0t)rk#km%4MC_Yaa&~#Vkijf=015ovYj%!LyFv=0{v9GJ8TvPjSeZ3KQC_ z(+=t#a;gc_gu8?p!ac$)A&)RhxKDUMs3SZi1PJ2Z$16%4#qOH8H-p6)9@v7XGTbnM z(;1xww0^NxMyp}n1R9#rR12n#U|q1KzO5nH98lSH@@Wt@hpmbeRJ^2AM#LI)2EDeZ zEXpvdz00&h_iFp1>D3v;gllFH?TbM~`!t9W#oFnXXN2d37lfCDGlW+h3W#keR(6xD z9fUT*G4#9gjbcglbPnUVE7vl~?3g|IhgF&t(qEja*)bm}U}hXL&$}Ke7t!uPN;f;Vs8Pl+ULI>U};&e_wW#Fo6fM tvl8b(k~$3hY>@PjW3cA2T7FQrvya-9>?YYbMX7c|Ew(H1n4aeW_aC7l_qPB5 diff --git a/v2realbot/strategy/base.py b/v2realbot/strategy/base.py index 9bf8e7e..5c9cf49 100644 --- a/v2realbot/strategy/base.py +++ b/v2realbot/strategy/base.py @@ -318,6 +318,7 @@ class Strategy: now = self.bt.time print("NOTIFICATION ARRIVED AT:", now) + self.update_live_timenow() #pokud jde o FILL zapisujeme do self.trades a notifikujeme if data.event == TradeEvent.FILL: @@ -336,9 +337,14 @@ class Strategy: async def orderUpdateSell(self,data): print(data) + #pouze pro live a paper + def update_live_timenow(self): + if self.mode == Mode.LIVE or self.mode == Mode.PAPER: + self.state.time = datetime.now().timestamp() + ##method to override by child class. Allows to call specific code right before running next iteration. def before_iteration(self): - pass + self.update_live_timenow() ##kroky po iteraci def after_iteration(self, item):