From 2564871ff8b5a1b1a071ae33f9d4d31c2d5f162c Mon Sep 17 00:00:00 2001 From: dsyoon Date: Wed, 10 Aug 2022 00:42:03 +0900 Subject: [PATCH] init --- HTS_122630.py | 11 +++-- HTS_252670.py | 11 +++-- Simulation.py | 6 +-- hts/HTS.py | 15 ++++++- resources/hts.db | Bin 44593152 -> 44593152 bytes stock/util/LabelMaker.py | 94 ++++++++++++++++++++++++++++++++++----- 6 files changed, 116 insertions(+), 21 deletions(-) diff --git a/HTS_122630.py b/HTS_122630.py index 611101a..eb08072 100644 --- a/HTS_122630.py +++ b/HTS_122630.py @@ -30,13 +30,14 @@ class HTS_122630 (HTS): self.labelMaker = LabelMaker(RESOURCE_PATH) return - def getDefaultSell(self, log_time, stock_code): + def getDefaultSell(self, log_time, stock_code, final_price): jangoDic = self.requstJango() if jangoDic and len(jangoDic.keys()) > 0: for code in jangoDic: if jangoDic[code]['매도가능'] > 0: + max_price = max(jangoDic[code]['장부가'], final_price) if code == "A"+stock_code: - sell_price = (int(jangoDic[code]['장부가'] + 10) - int(jangoDic[code]['장부가'] + 10) % 10) + 5 + sell_price = (int(max_price+ 10) - int(max_price + 10) % 10) + 5 if log_time.strftime('%H%M') < "1430": orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price) print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price) @@ -93,8 +94,12 @@ class HTS_122630 (HTS): # 3시 까지만 매수를 시도한다. if THIS_TIME.strftime('%S') in ("09", "19", "29", "39", "49", "59"): + # 데이터를 가지고 온다. + result = self.getRealTime(self.stock_code, today, LAST_DATA) + final_price = result["close"][len(result["close"])-1] + # 10초마다 체크하여 체결된 내역이 있으면 60원 높게 매도를 주문한다. - self.getDefaultSell(THIS_TIME, self.stock_code) + self.getDefaultSell(THIS_TIME, self.stock_code, final_price) if THIS_TIME.strftime('%S') == "05": # 매분 5초마다 실행한다. diff --git a/HTS_252670.py b/HTS_252670.py index e48b81d..68fb5b2 100644 --- a/HTS_252670.py +++ b/HTS_252670.py @@ -31,13 +31,14 @@ class HTS_252670 (HTS): self.labelMaker = LabelMaker(RESOURCE_PATH) return - def getDefaultSell(self, log_time, stock_code): + def getDefaultSell(self, log_time, stock_code, final_price): jangoDic = self.requstJango() if jangoDic and len(jangoDic.keys()) > 0: for code in jangoDic: if jangoDic[code]['매도가능'] > 0: + max_price = max (jangoDic[code]['장부가'], final_price) if code == "A"+stock_code: - sell_price = (int(jangoDic[code]['장부가'] + 5) - int(jangoDic[code]['장부가'] + 5)%5) + 5 + sell_price = (int(max_price + 5) - int(max_price + 5)%5) + 5 if log_time.strftime('%H%M') < "1430": orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price) print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price) @@ -94,8 +95,12 @@ class HTS_252670 (HTS): # 3시 까지만 매수를 시도한다. if THIS_TIME.strftime('%S') in ("06", "16", "26", "36", "46", "56"): + # 데이터를 가지고 온다. + result = self.getRealTime(self.stock_code, today, LAST_DATA) + final_price = result["close"][len(result["close"])-1] + # 10초마다 체크하여 체결된 내역이 있으면 60원 높게 매도를 주문한다. - self.getDefaultSell(THIS_TIME, self.stock_code) + self.getDefaultSell(THIS_TIME, self.stock_code, final_price) if THIS_TIME.strftime('%S') == "03": # 매분 3초마다 실행한다. diff --git a/Simulation.py b/Simulation.py index 0ef6a8e..55dda2c 100644 --- a/Simulation.py +++ b/Simulation.py @@ -174,11 +174,11 @@ if __name__ == "__main__": # to check bying stock_codes = { - "122630": ['20220808'], - "252670": ['20220808'], + "122630": ['20220809'], + "252670": ['20220809'], } - method = "rule" # "rule", "ml", "answer" + method = "answer" # "rule", "ml", "answer" for stock_code in stock_codes: simulation = Simulation(RESOURCE_PATH) diff --git a/hts/HTS.py b/hts/HTS.py index b9094d2..f5e5d0e 100644 --- a/hts/HTS.py +++ b/hts/HTS.py @@ -85,7 +85,7 @@ class HTS: def currentStock(self, stock_code): # 현재가 객체 구하기 self.objStockMst = win32com.client.Dispatch("DsCbo1.StockMst") - self.objStockMst.SetInputValue(0, 'A'+stock_code) # 종목 코드 - 삼성전자 + self.objStockMst.SetInputValue(0, 'A'+stock_code) # 종목 코드 self.objStockMst.BlockRequest() # 현재가 통신 및 통신 에러 처리 @@ -568,6 +568,19 @@ class HTS: print("update...", stock_code, ymd) return + def makeLabel(self, db_filename, stock_code, ymd, hms, label): + tableName = 'hts' + conn = sqlite3.connect(db_filename) + cursor = conn.cursor() + + cursor.execute('Update ' + tableName + ' set label=? WHERE CODE=? and ymd=? and hms=?', (label, stock_code, ymd, hms,)) + + conn.commit() + cursor.close() + conn.close() + print("update...", stock_code, ymd, hms, label) + return + def getYMD(self, stock_code): tableName = 'hts' conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, "hts.db")) diff --git a/resources/hts.db b/resources/hts.db index c3c61fe82bae046ca93e4943651b46db1651d5d7..6abea5e29ff2011d6cb1a78255ae03ca07b1bdaf 100644 GIT binary patch delta 9643 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 delta 9262 zcmZ{q2Y3|K-iLS2?#}k?rVv^P8+sFWHy!DqiAYHR=_LURQUeM|5fTMaY69ZKlAMG{ zc11<7Thz($gW&x)T?}n;+FsVm*%O?-hSVTm{luc6d-^R zn1C6mzyhqm2JFBAoWKQmof~*SEQkZ~AOSQ1iJ&QH2AYEwpe0BGtw1tp4ZI))v;l2F zJJ23<03AUm&>3_AT|qZ+4d@Q81wP;h0gwvPKsv|(nIH>fgC5{I&=d3my+I$)7xV-D z!2mE2Tn}ylIUpC@2nK@p7!3Z!C+zdv6(O?W13&w%*U;>y3CV|PI z02G2LU@Eu;+zM_3w}WZm4lo_e05icXFdNJPMPM$N2kr!Sf%#woSP1S0i@;*A1S|#j zfMsAgC<5ZDYJ1{x>_kAO$P zW8iU60V;t6RiGMd0X5(WuocvTAP9jc!8Y&|cp5wdwu5KE4zLqE2c8EnfEU5Pz%K9- zcp1C`UInj#*TEY=2fINX*aP;0ec(;-7T6Eo2Je7(!2xg(yax_}_rYOs1RMn)fDge( z;A8L!_!N8wJ_lcbW8h2h6*vw~fO>Eed<{;4Z@{J`sy{V=8c1DF-9Y6~ zxzvr+AnGP+Fg1i4N)4m(sC;TTHG&#R-As+5MpI*`vD7$fJT-xuNKK+9Qw3BZHHDf= z-9p_;-A3I`O{4Chrc*Phnba(5HZ_MTqUKWbs5_~z0^MHP3kRbKlL{C4)rc|fI3LMM;)Txrw&s` zsH4;e)Q8kZ)W_5()Th*E)aTR})G_Ky>MQCvb%Ls=PEub}r>JkJZ>jI7@2MZC)6|dD zPt+OeEOm}LPhFsXrY=&yP`^@_sNbmHsee;{Pz}^&>QCwl^_PO>PvAhI1ZAX5l$lZ~ z3uUEjl$~-=PRd1vOL6naL&Z{YR6LbHHK7uzrc^VkIn{z{NhMLOsAQ@&<)u=nHdI@x z9o3%dKy{=#QJtwSR9C7Sbq&>>x|Z@$ekwqvQfX8=l|f}vSyVRFgSw9DN%f+7Q+=qu zR6nXeHGmpOT~FOWgc?c>qw=VHYB)858cE$ujiN?VW2mvzIBGmK zftpB7q9#)XR3SBmno8Y5-Adg?-A+xT?x3bqGpL!=ENV72hbp4xQuC-gsk^B8)B&;4s0XRl)Ea6nwT@a(ZJa?{=_}~EcP11a;1k-;SGoc zt?%x6i89SsBf1G!M_Eu%BU+5I8bz%s-uRpG3!`pCz&OM5o#lY#S!2MMDE<&%i9L>M z9r5O*p8TMf=yK+T2X-~B`Ro+szDeH}^lzGZ1+i|6bZLhnh^NhKx)^|ru z)0D%m7ivF6kXvE6m2!bXD^QK1_%tW%8(6F;Z@WQ{>$Ghm-{Q%a~fxT4s)}6-82xWf=`P zUM(k$uN4+KWx{OHM0yZ6$z#abQVLv~B;yfTEw3L}E54IIk84okWD@RdmnX}f5DAuS zzu)ImW3;-?4e@dz3hJueZT-+CpT*%+xvN91aLbelwPJ#7)3H`0sM)^k)HGGAv!R~P zAZ`(=ORLXa5HH_F>MywxckU$jZ>+&}k-F?gBuT!8TCC9zOso|FMc#!9w3g4Z0ptQa znpT!7LzhI;axaULOS;wyr)GJey-U6^xmNTS&Z&*1`tj(puv;w}u0IOws||l} zb6n&OCSL~5#p2o~PBv1y8k6TLH{{7`R5iX$8mgCNz(1>-7>xcvAS2Zm@C5?CEMGSA zq8@`}anBl&U_?^JqU>hoG@-@}3m+%S_fd!?a%}OX`Ee$zF%`%_s&hEiMD{~Bv{EA_ zYGujwktb7SA+Gld*Wt*6NDaw0!tISdmoJ^IRi|!?X4lW+e3Bw}ObUub=|#J%k?xnH zaokG&IjL3@Xw#hN_n~MZRTjZEE%TKT(SRvab$$Lu0eZqKorN{RDw9fUM01&5Tq_=t zhw`?H_KvBMac{42=IB=t-)7UkTd*rKxJ~lq)wQCdwyNop#=r#xCTm({jw{;U{!G+4 z|MsHB9$vPlR%}#?!;h4q-MepoT)3A_aw0}VTY3H z2fW^ZK)Wn!AXW8@HW<1{e~V%zUKaNc36tLY?OO5nXz`^%J73&BsdBDRRN2KF6t8G2 zcF&K~FX8ZAMYs!PX?;*MF=G;Bs9H%vZoHgxCMe8iU#d{uTH%{r(7SDeLe=BoeTqr7 z8#^7u04`|X3Gr7;81{Qh%9 z6a8DHy>{hwY4HWc)I{TL#!lk2cp6K%Pr0bPs4P^n4Go$y)ZNS2qx>=HpNSPto*x!O zKRxLWiZOD+)F2kvHi4k{SX=u2?qnI0hWpB-)Sy@+3vYS?**%DuJH`^!6FL@|iH64dF z(l=)|nz~gFG^TjSPx*vj1CK!f%K)UnbhSusxPS{YRWRrD!K}7c@@Czeb@hnz*6E)zO}YnJmlj zx@dyeOKKX|(Yo9v7)#OFkcQE#m3p%Wb+pO?BV+zs{wq?%e-%E`Z01yjq_|`Bv$G*O`zzOBUlW z;n^LqBDZwG!dHp4)1qUiE9WR!c5TYi09@qhhldBU)<9e7!qj zAU&>Cmn`ZS9SQeM35tbQSy<0Oc&H#K+{SF=sOuc;EDL6ElzIw-!oi@t5W7`$)!QSQ zDL6<|dSH;AxD|6x4nZbY_{t*}?VY2+wFo-H!Ibf`F}Q9P?jeu%A19(!ko%F%6RFp0 zvl_F#i)PW#Ss#~fBJ7s2o?r2kt!LGf%(BO5$gd#YhXawMC+ z0)cxKFb6DEh>DV#cGc=6Hfa(Ur^6I+z~o4P`awYIrhiVtNRC&|z826K<*Mo;OBaQ(Vg)*23qmF`^W*-@c1sTlvB;?%D7 zb+G1S+WxS;Zd-2aXERy%TUT3$SlyPRmd%zimX_*QYPEWc+R=R4{ET^yIbiz5^e@vQ zQ%~bx#y!TB#vG$f926TwzKB;olFK}Jhbk3XeVe4tmD|x2`WqXA;sv42-S!R|U9xfB zD~&Wd>fRZ3j|A;y(V+C-78KXW9Hdtz|qQ<6hbE>BI>C(sB=h{Br9>3^wHV4HL zi+1dy9X%B;+f@<7>M?8PhQ_r@<{&abetFE=xK!zT5$PquUDj{qYmo}5ZeQ<<`1`&0 zS;M*)*{&%gi>|h7HhL!fcWX1AI`R#c%y37$)3c(den@(cO6gZP$(^Cnd9=R5|pSplGfg8yZdPYmhc7 z7-E%jZU!c<{J1J82D3-X7X7nFu=4gvL!W@y27Nusx;wV}E5yGYHS4xzM z3%N>9;{a6Q$gE|;UwMEP{bEm0Y|^UNC;4U3K8~j!aJ5VHFPHT<>xxgF?^c63d`%r! zh5qH0nsTO3B&RCxM$j1!9*J$y7}Ohs^2qe9B2`xJ4T>kVncGDNo#k)E7f+w)z1>-k zS>eB_u8Lb&_JvjMXsw2zR^g&$-M1{I6lo7DwXTt%IUVyv%;cEnt`A)6Tsbbq`I>Wq)9?7nQR^shw6K3>kumXZ#I zc+QlbTa`eh6n)FlpjhFMvvNl(?V|lL^s68~D|?=+!DRLx=dH>SX`vlkJhnrmAN4O0 zXse*jw0@h^#(s?CU5mOpQLRet$eW#_{hpW>!0i{3)_Hbu*|1cMG~jd8dw!JCc2i+N ziYz{ys;tyMI1v{Vx=EIq=nx7>!7%z$UqmofaQ*FaDv-Ct>2|PqnlA|CesnPFdn=o=q(MN9SjxId`7m!{lDd#_-=cHeS!{hz(t2_Ld`ZPIGRu zcL~rsVo$fe49MGpFd1NPsf{TM;EBj>|o5L*jZP)^3^KF(lGG zfk0+->QBpSk218Bnhbxq2(x|;1r-{#V_iOKtbT!+A0$iFkmzUD4qO-#eG2`1M@Td` z*(?VQOO)dVQKWfySbM1UJS=!?wcWnB4knSIcG9Z6N|L~0T;$!;Lmu>CgqoDgmhZKK zg8T$6CN@R2E63e;i4$U<2+1orUoZ3HW??8+wZ?tTSwi&;k3?+z;KX;0XTa5TAi(q9 zztjEz(w;~fAE^FxeCoTkl=O?yp{x1>=<{RJhw;_aoQ@H4IeeUGP7MT9T*!|cd15GT zZS<=it>mGjkt@w6Tn#Jnh_GCIFiq|;ozNl>afxwGC1WQ7|0&Q`}dGHdjeUGY2m><&G)3}S6(ISGG~d@ zIQ&fTUxR#8^`ORAfU|uFOKTx~1Md?XT66WKmWQCp8E{N;j3uIH2YD`CpeT7J9E(c1ox7D|?vx8Rq*c+81Fz%dn-1%_|eaXRlD?r40}D`?D- z;VSwi-{glg(Sjy)%J68XM4n_F!}4o*09)k9Vq4?uFE-Vm(byVF*GsHh_^lOw!|Ic= zLZZfEv1J(+hz5h^?fc|RAsVz&-|a=R_u*kmjPwq`Dxtgjg+ymXcwVo>Kx$^fV0!Fr1988UOkJ