From 2a9ed56fca4b943a67c1e5fd96db21a0a2f2fe78 Mon Sep 17 00:00:00 2001 From: David Brazda Date: Fri, 14 Apr 2023 22:34:45 +0200 Subject: [PATCH] funkcni vterinovky bez vychytavek --- v2realbot/__pycache__/config.cpython-310.pyc | Bin 2546 -> 2546 bytes v2realbot/config.py | 1 + .../backtest_interface.cpython-310.pyc | Bin 3106 -> 3725 bytes v2realbot/interfaces/backtest_interface.py | 26 +++++++++++++++++- v2realbot/interfaces/live_interface.py | 4 +-- v2realbot/main.py | 2 +- v2realbot/static/index.html | 6 ++-- v2realbot/static/js/mytables.js | 1 - .../strategy/__pycache__/base.cpython-310.pyc | Bin 11681 -> 11726 bytes v2realbot/strategy/base.py | 2 ++ 10 files changed, 34 insertions(+), 8 deletions(-) diff --git a/v2realbot/__pycache__/config.cpython-310.pyc b/v2realbot/__pycache__/config.cpython-310.pyc index 62b8a1539097634d70091fa7572dff16a121f54b..7a5c5de925bf34790944cfea598951faba22d7a3 100644 GIT binary patch delta 412 zcmew){7INMpO=@50SJDYS*ASO$jis562)DRnwOH9m!4EwSscZYl#`#F4P-`fWu=x? z=HyqU=H*9iwr7-MWaO9}$0Q@e3DjK#GNXtaMDPHKl?+8fAhyutX-vV=>_8@nTMUxo zV&GwfKmn#A_Q@>FSGXZcLF$DkKV~*?76mf>G+ByxK|*{Wf*(Z4g9wCLFiRLDCITd+ zfVh|iNN_OlF&2qz4rAHG$S5(HlTFtFBz=p+JGIias3^Zklf6g*C{Uyb5@kurOfD%B z1M$T{gan9?1Q7^(geRA=8F6U?1z)lPiCddDv57OfMTrN81UZI;IR*vChx$2tIQqG} zIy(8d21jwYIEFaJyLbi_f&2}2ToFijl%R*JV^D~bt7Axfh^Mcse`v_9&HNmli~g3}8C0$Ne9 delta 412 zcmew){7INMpO=@50SK;2Tc$kS$jis5a*MklH7_MIFFmQWviKH9QciwyHjsIXD=W3E zGAF+(H820xW_w0CMn;~=aZEBYyg=PWd?11!Lh~1%mO4h82A{ABsPb!Y+_`Tnas(i>j09z#o?V==~`5jU!=)iqyiKuQU!^!q+}+S z6oK>>NrMO(5Fra95cY^qE@Ly|(gzB@WCapYn>VqEGrHXp4-N@(3<+}#3XTu;bM|ob zb9Z%g@^KBm#o^)@;u!DZ8B_%FH`sASAl*@d9==8M+i#lUl3Btg`i`C45nSZi%w=p4qK+Q8~04Yp-#p)!@4PwGvVtc7+_1 zk4^@%!L+lVMo;it|5Em)3gd_UT&hkO(O%_V7(K~lh84`p_Z|iJAMAhr_z)9cgt^SS z39)&jv@Z`HM|9GBD`RpOJ^MEXX|I^u2d4t6h@85cLjyO?bX z8(25=#R*_j6g6+>+EX$gs{TP_1Bgi@+C~2(dUg}TDLb_S>y%?;InQmu@W;>i5qm~E zj<9fseV`b4Uvcdv-Tp9_+Ktj-KX16&%TAJZ8ml$zYbWkzxpqW1!tvmYz+!7BlW|AY z!C<&vS!xUPe?{|~OscFY!lzx)R^dp5&HHIIOk_XLn)l^X8K(o9GzTa7aoTS_{Ww>l z==P65DH+D?G;ek%fs-}c?M+xCGIr7k zG5X9Pb_^o7UI3XM@7XWe3nzD9vTxZb>v@800?l4&+xix0_I$ywSi-&nY@cv-d%EJd z7S`QQEZe$+JUp~$=S4ZMoO0m`?~K1>lw&}>bnyBP&U^hoG_?*&U7#r`r;zbTGv(t) z*E%XqC@Zo&Oa^05&|Fu-jD9Io6y=3>j?t$f*2m@;cjKyKIM#wwLiVF>($}(w(ClFsmSP6sBhrgZY83!UmNG z(Xou4WXN)Npy19|%&4}g$_)s37d<19RW`b|tirrFwF|Z{C@%&w%$L%lgk93>yFCo2 z)(h*U#mG6VNA6@jJ9m2SHm!Jhspp@vyxgk@cIF-;F%BB8x{B{im?Pq;;$a-Y2Pu`n zAg98&X3#4DI+48$8C z#HSc}1xDTsBlR9+6uOf%MT*Yjqu!@g11Z6xKA^$W5JE$JNP|Jc-GBJi!$*Lhf>#+? zGemw)YgBD!0jyn^9K=m5j)A$&Rt2x&`raT>6nE+thBsGQJBJVU_l?%-Bl?^IZBaWa zmhmsKG4UE3U0(JYF-7FoNi#0SjHk$AW||P3#My6f>SC}h*y@m+&*m+?w$hix7Ew@78qwrWlWK2+ z_yJGiwm##9VZ6u|!uFg!)hO&oGG1*CFT7^VS8XNksmxPy8Vhz- zS%7!O87uT=CavKYy4{M}c=1T0Fydwk25HvKyJ^2j{db6CK}{Phf5Q5ACIwiXt*Ub1 zDGCl%kfo%ag1tgjW@2Xwv8h@l1h?f(-wRWHO}J*`t8{kcg3{^_knlCSqWBoySPuUM zflKi*MVIchRq-*8FICZV_^y-q7>|Ph*DH#?VHk&ksj=rVR(B!b5Pcj68*FrawaPP@ z4PIQgfWln6=90lf^5Bcc7Cp-PVIqS-SArl(#V{ti8U%kEhH4F+er>$THP z@ziV*>2~5Y%(aczfueG$eoezCv}NN4RllX_?`Zfv4d&7y)Qv53?l6{`hYh`F=pB^N z-Qrst%=dZOXWXtc?p|fw!LPH4PV_qGj*q^QMfmLrtZo9Fv*Ie z$zQshALHFhFIYt(r*BQ)v3t`uYqob({7W=@#wxmd_4OHZd;HRcpuGt#l|f9`XKYd0 x?{trpxjyOY)?2f^Vcw0iJu{k@p|N2VEZV|Up literal 3106 zcma)8OK%%D5MFX0dRVq)#fcLqah#VE^&z#n^w1*6y9ny2K#5&x^@^kxS%IS=IULS>GaNEnT`d~;a_(*M7r4KvGy7TS zJV1+o1rdf|q0wP3>u{Gd>hsX-SgxgcGqgL7>uBBzbDg}K*SsATIz_k0jDqo_AsmrA zHAGH2?@V_^Hfo42Lb7v{R-$jK#NllX}C-nE*DIif(x@{2}{_g@T4%Z z(6zzc5=H5>xL6UTQ`^m9oKoIQQb)<8uey!E1OVfYc#ifMEiQu$+0gKeAqNFQ(8n5xj1!-9 zno+0-#HyKEu?$;k1sy$dW~f#0|A_j_SgN=#{I_kHcQBrS@gB#bIqtJSjv0CpW&3ov#6VKbgo-rk;!-{OM zz2J3iEEq5djX&Zi9+%Kbkk#)PWh%VojkFXezDm5{wG7_G$SJ$0u>ToTB&;3H$QpGC zvWsXjsVuR<&Y~5w>ORo!&nOf<=_d=3$YGWu@o^7iXdD~Ihz2N6%wubdM(o5n&J9_T zKQ0LN-aatSc%y2kR?_ZB9T3EZ&JXB7rp1U3l$X#kD(X7EyPG>2FNbjPq6SoaA0z_S= zfe8+ZET6isu2NUKZ|^^U@%*rAXWnZyQwVO5*c=Wvy!1j6)JWWAgRP}Vc;SEMfjUom zFMxcOwW)RRbbnu)t9EGRH6n9n(b)}eVum*3dEmi@fRR}WQn;v zJwFMBx(V^mGG9^FXV%}MHP%w7=iG6~Rxhk#fvyGocL05Hxl3M{=5*e-#X_1nP@uir z1+&yUHZ+I0Fy33bOu#xynv}Q2G_jB!R3Y6}obM3#)BGvZ*)>ifGC51fX&%ivXOW(- zAvbbuXKA!ZD4@eS{)nfDJw}Tu*Owd{22XhA3D44>!a8=K6!_ghhRf~eSzNUJa|S!v zx_h)SS+Tt|7MajORW`9eo2>7larGm}S!O8H2eWEsm2BfkqKx%q*Xu=bJ84JV?A%tM zW%rsAWjxnd1m1H#6X>NF$~vN$V70? zO7#tP{vJ)$K?c_slXyqZ5bL>7e0AacG`{Lv zti6w>gIi&P-Q_k;H3Exskbi~^^}jCrRkP7}R^6nVyz6(Q=cPr@>qMd-5?}JX-}-)- z%_usTYMlrnpIXfb&yZbW?N%81NowM9R#eZ_9U^o~q$Vyi^(A$`B2ptlk=F=oCuX46 zF6zsiDje;iD_q{FFz)0TH_MD$SF(R|6aU1oac<_(Dy(8ETGyzS(oH|?`GH>>J!)#Q z+wa8L#uS;fki5n#hu%Ai@+sY$yn1Sr7fxI|${xAXM~|XwFx{OBH%IRxD5{NlsWen+ mc`6n}-B$ZZU+>z)Wj?3*A2Q(Y(|sHh3}w7yvLEN0g?|BvI)*g> diff --git a/v2realbot/interfaces/backtest_interface.py b/v2realbot/interfaces/backtest_interface.py index 28c7639..8a3a0e6 100644 --- a/v2realbot/interfaces/backtest_interface.py +++ b/v2realbot/interfaces/backtest_interface.py @@ -2,7 +2,9 @@ from alpaca.trading.enums import OrderSide, OrderType from threading import Lock from v2realbot.interfaces.general_interface import GeneralInterface from v2realbot.backtesting.backtester import Backtester -from v2realbot.config import BT_DELAYS +from v2realbot.config import BT_DELAYS, COUNT_API_REQUESTS +from datetime import datetime +from v2realbot.utils.utils import zoneNY """" backtester methods can be called @@ -17,49 +19,71 @@ class BacktestInterface(GeneralInterface): def __init__(self, symbol, bt: Backtester) -> None: self.symbol = symbol self.bt = bt + self.count_api_requests = COUNT_API_REQUESTS + self.mincnt = list([dict(minute=0,count=0)]) #TODO time v API nejspis muzeme dat pryc a BT bude si to brat primo ze self.time (nezapomenout na + BT_DELAYS) # self.time = self.bt.time + #pocita pocet api requestu za minutu + def count(self): + if self.count_api_requests: + #get minute od the day + now = datetime.fromtimestamp(self.bt.time).astimezone(zoneNY) + dayminute = now.hour*60 + now.minute + if self.mincnt[-1]["minute"] == dayminute: + self.mincnt[-1]["count"] += 1 + else: + self.mincnt.append(dict(minute=dayminute, count=1)) + """initial checks.""" def start_checks(self): print("start_checks") """buy market""" def buy(self, size = 1, repeat: bool = False): + self.count() #add REST API latency return self.bt.submit_order(time=self.bt.time + BT_DELAYS.strat_to_sub,symbol=self.symbol,side=OrderSide.BUY,size=size,order_type = OrderType.MARKET) """buy limit""" def buy_l(self, price: float, size: int = 1, repeat: bool = False, force: int = 0): + self.count() return self.bt.submit_order(time=self.bt.time + BT_DELAYS.strat_to_sub,symbol=self.symbol,side=OrderSide.BUY,size=size,price=price,order_type = OrderType.LIMIT) """sell market""" def sell(self, size = 1, repeat: bool = False): + self.count() return self.bt.submit_order(time=self.bt.time + BT_DELAYS.strat_to_sub,symbol=self.symbol,side=OrderSide.SELL,size=size,order_type = OrderType.MARKET) """sell limit""" async def sell_l(self, price: float, size = 1, repeat: bool = False): + self.count() return self.bt.submit_order(time=self.bt.time + BT_DELAYS.strat_to_sub,symbol=self.symbol,side=OrderSide.SELL,size=size,price=price,order_type = OrderType.LIMIT) """replace order""" async def repl(self, orderid: str, price: float = None, size: int = None, repeat: bool = False): + self.count() return self.bt.replace_order(time=self.bt.time + BT_DELAYS.strat_to_sub,id=orderid,size=size,price=price) """cancel order""" #TBD exec predtim? def cancel(self, orderid: str): + self.count() return self.bt.cancel_order(time=self.bt.time + BT_DELAYS.strat_to_sub, id=orderid) """get positions ->(size,avgp)""" #TBD exec predtim? def pos(self): + self.count() return self.bt.get_open_position(symbol=self.symbol) """get open orders ->list(Order)""" def get_open_orders(self, side: OrderSide, symbol: str): + self.count() return self.bt.get_open_orders(side=side, symbol=symbol) def get_last_price(self, symbol: str): + self.count() return self.bt.get_last_price(time=self.bt.time) diff --git a/v2realbot/interfaces/live_interface.py b/v2realbot/interfaces/live_interface.py index 180d6a7..46e29d3 100644 --- a/v2realbot/interfaces/live_interface.py +++ b/v2realbot/interfaces/live_interface.py @@ -167,8 +167,8 @@ class LiveInterface(GeneralInterface): return -1 """get open orders ->list(Order)""" - def get_open_orders(self, side: OrderSide, symbol: str): # -> list(Order): - getRequest = GetOrdersRequest(status=QueryOrderStatus.OPEN, side=OrderSide.SELL, symbols=[symbol]) + def get_open_orders(self, symbol: str, side: OrderSide = OrderSide.SELL): # -> list(Order): + getRequest = GetOrdersRequest(status=QueryOrderStatus.OPEN, side=side, symbols=[symbol]) try: # Market order submit orderlist = self.trading_client.get_orders(getRequest) diff --git a/v2realbot/main.py b/v2realbot/main.py index 0cf90d0..5ecc708 100644 --- a/v2realbot/main.py +++ b/v2realbot/main.py @@ -31,7 +31,7 @@ ic.configureOutput(includeContext=True) def threadName(): return '%s |> ' % str(current_thread().name) ic.configureOutput(prefix=threadName) -#ic.disable() +ic.disable() """"" Main entry point of the bot. Starts strategies according to config file, each in separate thread. diff --git a/v2realbot/static/index.html b/v2realbot/static/index.html index 9f1a47c..ef6bb27 100644 --- a/v2realbot/static/index.html +++ b/v2realbot/static/index.html @@ -60,7 +60,7 @@