From cd51cfbccd2b364fa7fbddf665fac1986217178f Mon Sep 17 00:00:00 2001 From: David Brazda Date: Wed, 13 Sep 2023 18:03:53 +0200 Subject: [PATCH] zarovnani baru u not div60 resolutions, +ind na FE --- testy/tradebarresolution.py | 19 +++++++++++++ v2realbot/ENTRY_ClassicSL_v01.py | 26 +++++++++++++++++- v2realbot/__pycache__/config.cpython-310.pyc | Bin 3281 -> 3281 bytes .../__pycache__/aggregator.cpython-310.pyc | Bin 7004 -> 7032 bytes .../trade_offline_streamer.cpython-310.pyc | Bin 4969 -> 4942 bytes v2realbot/loader/aggregator.py | 6 ++-- v2realbot/loader/trade_offline_streamer.py | 2 +- v2realbot/static/js/archivechart.js | 8 ++++-- .../strategy/__pycache__/base.cpython-310.pyc | Bin 14635 -> 14735 bytes v2realbot/strategy/base.py | 11 ++++++-- 10 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 testy/tradebarresolution.py diff --git a/testy/tradebarresolution.py b/testy/tradebarresolution.py new file mode 100644 index 0000000..cefc5d7 --- /dev/null +++ b/testy/tradebarresolution.py @@ -0,0 +1,19 @@ +from datetime import datetime, timedelta + +def find_bar_start_time(trade_time, resolution_seconds): + # Calculate the number of seconds to subtract to align with resolution + remainder = trade_time.second % resolution_seconds + seconds_to_subtract = remainder if remainder < resolution_seconds / 2 else resolution_seconds - remainder + + # Subtract the calculated seconds and microseconds from the trade_time + bar_start_time = trade_time - timedelta(seconds=seconds_to_subtract, microseconds=trade_time.microsecond) + + return bar_start_time + +# Example usage: +trade_time = datetime(2023, 9, 13, 10, 30, 30) # Replace with the actual trade time +resolution_seconds = 54 # Replace with your desired resolution in seconds + +bar_start_time = find_bar_start_time(trade_time, resolution_seconds) +print("Trade Time:", trade_time) +print("Bar Start Time:", bar_start_time) \ No newline at end of file diff --git a/v2realbot/ENTRY_ClassicSL_v01.py b/v2realbot/ENTRY_ClassicSL_v01.py index ec92942..cfaa40d 100644 --- a/v2realbot/ENTRY_ClassicSL_v01.py +++ b/v2realbot/ENTRY_ClassicSL_v01.py @@ -375,6 +375,28 @@ def next(data, state: StrategyState): return 0, val #random.randint(10, 20) + #TODO error handling obecne v indicatorech + # def average(params): + # funcName = "average" + # lookback = int(safe_get(params, "lookback",1)) + # source = safe_get(params, "source", None) + # if source is None: + # state.ilog(lvl=1,e=f"INSIDE {funcName} source required 0", **params) + # return 0,0 + + # if source in ["open","high","low","close","vwap","hlcc4"]: + # source_series = state.bars[source] + # else: + # source_series = state.indicators[source] + + # state.ilog(lvl=0,e=f"INSIDE {funcName}", source_series=source_series, **params) + + # delka_pole = len(source_series) + # if delka_pole < lookback: + # lookback = delka_pole + + # return 0, Average(source_series[-lookback:]) + #abs/rel divergence of two indicators def divergence(params): funcName = "indicatorDivergence" @@ -418,6 +440,8 @@ def next(data, state: StrategyState): lookback_priceline = safe_get(params, "lookback_priceline", None) if lookback_priceline is None: lookback_series = source_series + elif lookback_priceline in ["open","high","low","close","vwap","hlcc4"]: + lookback_series = state.bars[lookback_priceline] else: lookback_series = state.indicators[lookback_priceline] @@ -842,7 +866,7 @@ def next(data, state: StrategyState): state.vars.last_50_deltas.append(last_update_delta) avg_delta = Average(state.vars.last_50_deltas) - state.ilog(lvl=1,e=f"-----{data['index']}-{conf_bar}--delta:{last_update_delta}---AVGdelta:{avg_delta}") + state.ilog(lvl=1,e=f"-----{data['index']}-{conf_bar}--delta:{last_update_delta}---AVGdelta:{avg_delta}", data=data) conf_bar = data['confirmed'] process_delta() diff --git a/v2realbot/__pycache__/config.cpython-310.pyc b/v2realbot/__pycache__/config.cpython-310.pyc index 56c196a27efe6aeb0e8af7d201ed110981ab7a1c..f7b5293aada67bcb14027f5050c1e1c747260cdf 100644 GIT binary patch delta 83 zcmca8c~O!tpO=@50SHzdXH1nB*vOZ}p~sP!T#{LqSdw~+JtaS{BtAX=784M&q*i2> i++qiji76?!*o#ujQj3aHC(q+ZWoF`G+RVmzni&9YY8)c~ delta 83 zcmca8c~O!tpO=@50SJo18B#a!Z{$nj&|^=@&nt;f&%eb4#2ksqC7ET3C8@VqQY$h` iZm}1omZcUIr`}=*aT8NgCePzYWoG1I+|0&#ni&9Qa8=8mjp7WjWp8I|IHT`E=@94V5@H_Vt zmOt$1p9kS|^mXvHJa2}wui7kRZObp8r*kwo-X41>^??7zF6-<4I?%Q~Uh*$c;tm_*!CNa+qCQ(&h2i&CeB!0Wey6J>-_PBbO z-kL&{vkkyn=)!Y|5fx(`ro>gluD{3WN!%dghG$rpc2CPcVl(tY)1#YEVEcV0?{&pT z!-aRzcjE=XDRFb?M@Gg!5vOk5n7@888aZ48!%+-yz<{h`NSZ8~+2;kmfFeFeN~O{1 ztneE34KY+IM5Wv+fG0N09o<8=s_`>4^u!hGGOUW8^=Y8dC+hi0xF;UuM^Z$ri8uKR zmzHSc6D%Xds^|HgCC}p$QTGYRU-Et|uLYc^sU;`8Nw90gEV$4TGllg-M zDCVq+_+r{3Q!Hl>n4_yt#Wib8ctsO7L{R+Z_FdBC5y1ojPlN<_5vr+vHVk1`k`Ql2 m&z_k*7=k}0{eJ@RCpd_el@{jsCqd3R1}~$t&M3%t%;CRqte)-w delta 588 zcmZ9I!A}!G6vpT6wr*Lo6NGNtT??sF#kv@Y(Q?oP48|j(2{9zVrgW50Og0%edfA?U zco4M7J9&eH9+ZR4Ui=rha%?p5?#+`&-z#c_Iehcx``*m^Wq#Ga)}6?4Y(Z;g@}~;A z&c^|$q+bSh%-OSvsVq+`S7X($~YGl_a ziMB<3SMZ&)I9pS4N*E%n#aF4Tya~$L$aD-nwQ8oc(z*c4YuN={LCza1EP-N9o;j zb&xqzf)5ggGSaZKxIMJx^|Fs1EX>{0^Ykyh%xV-p(^FLHMp_xB%PaUH-*s2WsoDA_ z2VCnG34YFx;aj&15gxej&oufWJ}yi^h+Bn=SvF$)RG7ZM%2AU=k@T!ER8cbwwZYaC z7L(;EhvxHG>l`1MNUyOR1L0&bfEF$lH;L+dvFV(k!uirPyv9!H@GnW|m7Ha|UdtYX o6O}jCr$RjNW~wKt^b4MJng|E|QE1?G{{p;9ANo}=m+~XO0jVF1y8r+H diff --git a/v2realbot/loader/__pycache__/trade_offline_streamer.cpython-310.pyc b/v2realbot/loader/__pycache__/trade_offline_streamer.cpython-310.pyc index 2373ebaadd2a950e5eef249f08ffaeb8544a2551..13eafa6956aaf9440ce35de2e7b52f3bf02d1d00 100644 GIT binary patch delta 178 zcmaEMm&@c1E>*_qlh<*{OYbgWNRex1WMlx!F->4Bi~?f!!X%)m{Nxv0ilz$9 zj0=H~kpU>82vP@>KMiCnf!IKrF-5tAv6&%@DTT3_g^?kJA(%l^WwRZ3DbwbCyh%)q R6DBJPlrgexo+WUe2>=F|FNXjC delta 206 zcmX@7_EL>EpO=@50SMZ^yiJ+Bk=K=-@!8~H_EU_>o8>r;Gcwjqe#WWFm^qn;OPPIB z9up%&p3`JAE*IVsh7`FP{uI6%zGfE2$(3AcjPoWh;F6a<1eB0(W@Kals$`nLSQrJw z?uAJ}QH9C3xD-tln;91ZAtM7&L!3vv~@+L7cPMXXiP{z!}$FjLz;5-umRAM&p diff --git a/v2realbot/loader/aggregator.py b/v2realbot/loader/aggregator.py index ba52dc8..19e91aa 100644 --- a/v2realbot/loader/aggregator.py +++ b/v2realbot/loader/aggregator.py @@ -271,8 +271,10 @@ class TradeAggregator: self.newBar['open'] = data['p'] + #UPRAVENO - pouze pro prvni bar a ROUND, jinak bereme cas baru podle noveho tradu + #TODO: do budoucna vymyslet, kdyz bude mene tradu, tak to radit vzdy do spravneho intervalu #zarovname time prvniho baru podle timeframu kam patří (např. 5, 10, 15 ...) (ROUND) - if self.align: + if self.align == StartBarAlign.ROUND and self.bar_start == 0: t = datetime.fromtimestamp(data['t']) t = t - timedelta(seconds=t.second % self.timeframe,microseconds=t.microsecond) self.bar_start = datetime.timestamp(t) @@ -282,9 +284,7 @@ class TradeAggregator: t = datetime.fromtimestamp(int(data['t'])) #timestamp self.bar_start = int(data['t']) - - self.newBar['time'] = t self.newBar['resolution'] = self.timeframe diff --git a/v2realbot/loader/trade_offline_streamer.py b/v2realbot/loader/trade_offline_streamer.py index 149411e..9bf8508 100644 --- a/v2realbot/loader/trade_offline_streamer.py +++ b/v2realbot/loader/trade_offline_streamer.py @@ -196,7 +196,7 @@ class Trade_Offline_Streamer(Thread): #homogenizace timestampu s online streamem t['t'] = Timestamp.from_unix(to_datetime(t['t']).timestamp()) - print("PROGRESS ",cnt,"/",celkem) + #print("PROGRESS ",cnt,"/",celkem) #print(t) #na rozdil od wwebsocketu zde nemame v zaznamu symbol ['S'] #vsem streamum na tomto symbolu posilame data - tbd mozna udelat i per stream vlakno diff --git a/v2realbot/static/js/archivechart.js b/v2realbot/static/js/archivechart.js index f9ec99e..a86566e 100644 --- a/v2realbot/static/js/archivechart.js +++ b/v2realbot/static/js/archivechart.js @@ -637,9 +637,11 @@ function chart_archived_run(archRecord, data, oneMinuteBars) { //displays (redraws) buy markers function display_buy_markers() { - if (profitLine) { - chart.removeSeries(profitLine) - } + // if (profitLine) { + // console.log(profitLine) + // chart.removeSeries(profitLine) + // console.log("nd") + // } if (avgBuyLine) { chart.removeSeries(avgBuyLine) diff --git a/v2realbot/strategy/__pycache__/base.cpython-310.pyc b/v2realbot/strategy/__pycache__/base.cpython-310.pyc index a4a9c25507e70df2863adcd245e209a9e7659e69..74636b501b00da747005d9c0c57e99ad4afeb73e 100644 GIT binary patch delta 574 zcmX|7&ubGw7@arSB%3t9)~?NuZJJFFVv$xT=%tlP=%u!ZBIrS+Mkj?tp~+_J!LGF$ z5HBJ)RKZgMJy{5ZY0+D~6a@tpD@X%^e}oqi@k@lxVR&!ed&B#_E$3-Hwj7Oy8J+Ad zO4Zd)%#LGQo{X>IyKKihbFAX4XtV5E;vV<7z%A~)@*sGcd3{A7&4f11YA@;4PuNF} zuYGNRQr2PWom@*KXLkN89_5>U;cEe`wj}`HHTWv*>K?|8#IatH8_=-aUr4}dYDj*eDO-U#|UL;#Q2k5<+H9O5)DG+ zF-YO!2;Dw0D2zs+=WPzRSUNzTbLst| zyXK9eQ@3xI>#jX+SDn(G^72Yuj%13+%k|6#YSOS40`s(z`UQE@Iui)<7$Umbw5EY) z>gVtjM_Xod&#@=Bb4z$HEqfOqW!GNC7kMTB5Z~lMzKpJ#9bMA!Lv0<)aZIWY$0vY- l`aSjtSWpj6yZ{`P9`E`g)UV0w94&eIR0mg;etOi0!ao)5oE-oF delta 497 zcmX|7O-NKx6u#ei?~U{0%$vyp-O6YS)tHM2-~z!ldeOKmGztm@tNd6 zL=h3ETC{qzDhY(?E`kCrLWmZvgdk}jErM1p66!t&x~ubj=R4gsg42$vn68R*dxmPVt!WDt#Ly{{R zfVdvCcwghdl17V@VoXTO7nAYbN~6BWs8`mvzqZ}DCZ}rC(nE-17w4{4X1psJb277v zqx?EEV4Lj}g@Y`aJMlJiTkT{{1HaW!#~MKDXO;;`Ug@01WB%Ux4ySn4ISYsXI6ar@ z+LLzVYKN%@p}&*0oU}u>2AS3!l9|x4+#}QVNT?0+4Y4~zHLKdClYZ374z1~~_S8ww z#e#Sv+?kjx{7;kRNA4Cc=B7~OZ@DLYGk+#BtP{^IJh)?{scLksML}>P4wy;)}BP76|=nux|h;tBL)0kQgDo pJEwmvP5i4rtBeB+z^qz2xNTuvoj-Je@QmLaZsMG}e57Qc{11@Th_L_w diff --git a/v2realbot/strategy/base.py b/v2realbot/strategy/base.py index cf98ed8..6381b72 100644 --- a/v2realbot/strategy/base.py +++ b/v2realbot/strategy/base.py @@ -177,6 +177,13 @@ class Strategy: #bary updatujeme, pridavame jen prvni self.replace_prev_bar(self.state.bars,item) + #UPD + #tady mozna u standardnich(barovych) identifikatoru updatnout cas na "updated" - aby nebyl + #stale zarovnan s casem baru + for key in self.state.indicators: + if key == 'time': + self.state.indicators['time'][-1] = item['updated'] + #u cbar indikatoru, pridavame kazdou zmenu ceny, krome potvrzeneho baru if item['confirmed'] == 0: @@ -365,8 +372,8 @@ class Strategy: print(current_thread().name, "Paused.") continue #self.state.iter_log(event="INGEST",msg="New data ingested", item=item) - print("New data ingested") - + print("New data ingested", item) + print("bars list - previous", self.state.bars) #TODO sem pridat ochranu kulometu #pokud je updatetime aktualniho baru mensi nez LIMIT a nejde o potvrzovaci bar #tak jej vyhodit