From 9659d2757db72e0ca9993422b86ba7e02080df0c Mon Sep 17 00:00:00 2001 From: hccode0419 <67219037+hccode0419@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:13:20 +0900 Subject: [PATCH] Add files via upload --- backend/__pycache__/function.cpython-38.pyc | Bin 1920 -> 1925 bytes backend/__pycache__/home.cpython-38.pyc | Bin 2431 -> 2848 bytes backend/__pycache__/init.cpython-38.pyc | Bin 417 -> 422 bytes backend/__pycache__/position.cpython-38.pyc | Bin 753 -> 758 bytes backend/__pycache__/strategy.cpython-38.pyc | Bin 0 -> 2942 bytes backend/home.py | 49 +++--- backend/static/goto.css | 1 + backend/static/home.css | 7 +- backend/static/home.js | 4 +- backend/static/img/history.png | Bin 0 -> 16951 bytes backend/static/img/history2.png | Bin 0 -> 11307 bytes .../strategys/__pycache__/env.cpython-38.pyc | Bin 331 -> 339 bytes .../__pycache__/function.cpython-38.pyc | Bin 1930 -> 1940 bytes .../strategys/__pycache__/init.cpython-38.pyc | Bin 422 -> 432 bytes .../__pycache__/strategy.cpython-38.pyc | Bin 2919 -> 4722 bytes backend/strategys/env.py | 2 +- backend/strategys/strategy.py | 160 +++++++++++++++++- backend/templates/goto.html | 113 ++++++++++--- backend/templates/history.html | 30 ++++ backend/templates/home.html | 140 +++++++++++---- backend/templates/mypage.html | 30 ++++ backend/templates/symbols_info.html | 30 ++++ 22 files changed, 474 insertions(+), 92 deletions(-) create mode 100644 backend/__pycache__/strategy.cpython-38.pyc create mode 100644 backend/static/img/history.png create mode 100644 backend/static/img/history2.png create mode 100644 backend/templates/history.html create mode 100644 backend/templates/mypage.html create mode 100644 backend/templates/symbols_info.html diff --git a/backend/__pycache__/function.cpython-38.pyc b/backend/__pycache__/function.cpython-38.pyc index e0789c6cded8d7437f6692bfc21762c8ebf12ac0..30111a697d45462f60ddf4830069e5d697c42ca2 100644 GIT binary patch delta 41 vcmZqRZ{_C><>lpK0D_|PJsY{VGBJ8gKFDOunUt8Eotl>tqqq47QwIwG->D2v delta 36 qcmZqWZ{X(+<>lpK00Q6rH5<9NGBG+&KFDOulAD;BxA`wq2MYk9x(ZhS diff --git a/backend/__pycache__/home.cpython-38.pyc b/backend/__pycache__/home.cpython-38.pyc index 9e2455e1bceabc9149c5d855802ffd49257690f9..ce184c534e8186aedd6a6cfef1b87319f402b4dd 100644 GIT binary patch delta 1402 zcma)5%}*0S6yMp8e$ax&kOqVzAN|@=y0nOxU=(9CF-AgAFUx@xW?HJbkn4V za?}H9VmxrbBWGgb-J5^HUOjR0YP{&1=_1=`46~Wv{^tGOzPIz{&9Cbx@%+o-;UNLW z*Y9sD?}2?|3;zhgVjZR>i%0p-Nh7Hzjg+230v2$jp4QX+ozXJ{bp<_3vai&mABk`d z$O4IwTyGjpbn>uT#N#A@C*Fxf#5ax+p2Sm!au?|Zt|bPvX?&Aw8fZ&+#?vG`+ePFr ztjI(pMN%Tmq=@H^6+DlVhYCa<<&je)(D9{B;|vddi;LNTv?|VVZG~$K16m$0a_u(P z3Im#km$MXaXTun3)JszBA=2YEZP01HRa*tfkE zxzM30FwhJG=10{(kOSt*%rOhh5&;B}<^i2+8fn;s?leuSX4lL{;Z))O;0COgv1`_8 z9K7^UoxCBmTqSz=Vqeyt!oqk1ct>D{FEFi5fVPa$Ymvrnp^e&NTk1+kXym{uf;Dd= zpLGnZ5?I%5@zQEbCo-0?(iUpyqX@MQY|u%FOQ#ql7^E4nf~g8fTLT&^AZ5Fyiwp*9 zL8D+}+qXsl1Tln0P=7{6u0dI=rfou5iyKau(aY2MPlcJ|DhumXSOe}1YyC=EJGDlI zhwM0`e$!P#NBtkH`BE&g6d`TDX4xif?IBoR493}!JcMb*0Bqp|VT8rrwj9Au)cfWt z>4To{eHO~wToJev)QnaW`r_Y-dr#%bM^2>ga+N%RzAOJ@FHH&3sCUks;2Mfwo;}>7 zgWV=I_lRZnK85lfeqp34u_?P2ytiE$n%Z_H=vY^&)Xg&RTEnL7R4A((Wm}*ufv-P! zr|=6Cx@(yDpib_wLh_y-M==!jo*0@zNi+t16A}Zc_bfa&7L%f=G!#YbeKCIncCa$V delta 1130 zcmb7Czi(495cc`KB(G^IB7{l{l>W*~`jRwhQ3oU{K&n_6x)hc$R3YakMM)F+J&+nj z%8(8$3@8&)hjycL7sSec@m5Bp{s9OCcWweHWdK`uzWeOYpU?Ku@;Eb?v+#Bg)QI1)lvK;yarV&0Ih;R;5UZfvqbx2Q z11@6fKoC+ih)YNsGX|M6$kH(^podultr#dri}JW^kX0Pt5?^%SUu|=s_JWdASFe;VS5?I(-mr1(kbNTa3*-XPfgS*laxhwEgd>U2 zq1le?SSSze?y;mgtWCX0G`&R5v%*MA@9qV9mZ8)T*DgoKr6~$+J~9)0mKM?h?m9Sv-t2ljm z(lfQ@iLIyExn1KgIxf#luTe16;^m~JRYmQ#g8$PBV*}dd(nwz$J$|;kBYK>-W5vdP zi(i|P3+-=L`Kz=rdd|A6HWVw;X6t0WOz^f+GvM7hJ#+3s|3N(8<);s=stPp!&(Ll) z{UEgHlbiQ77q9t*hWMwB`5w-Cqlqu;>ORmi|1r5KNJ3)JlQ0J9> diff --git a/backend/__pycache__/position.cpython-38.pyc b/backend/__pycache__/position.cpython-38.pyc index 5e9887eaf1cbb8089943535504b269394b8f8ef7..23288bf36a09ab8b4529caa507560d54d3c6f3f3 100644 GIT binary patch delta 41 vcmey!`i+%4l$V!_0SJV<>Nau*GBSEhj%76FOiE17PR&b+(c3(QF_sYk+P@18 delta 36 qcmeyy`jM48l$V!_0SLZqsM*LJ$jInCIhN6wB{wlMZ}UvXSVjQ7iV9!= diff --git a/backend/__pycache__/strategy.cpython-38.pyc b/backend/__pycache__/strategy.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6fab6899af288df6fc589d053259c4576347d02 GIT binary patch literal 2942 zcmb7G&5zqe6rZsj$NB!)bU)fH1lR+S%5E$6fGWD$w%e)~R!HskU<&N z%NM;L>xBG@%>0mm*@ip(9Ee3M>JlBFl1n{FmnhC~s=O&RHfmZ!*(^Y1eeGdcn}=as6)Kn%r?6et3=9W!L)JYoLwhDEcLU$BoL+r7HsG_z{6l4Gr_I~V+w>Li%KfVr zV$NdZr?CnV1)pLh11&`~lKW_-PPOGo0(oVsl|TzC%(T_1RV~U`bxsnkw86qz$00C5ytX^E0D|1|& zuOy(-47l=hSfZtciwkoV_=d1oAnKpDu3v8Ng*FS@w}#I313PfrJ9gOT!Jz&A?q0j= z4m<6R!#BHu=4AWJ1R>mnUSbZ~%y@B*Qb263JYh$YYgfk2Mq8md4q!1~7y0s3AO#bHJ%HE)N_+ zWuhwpr_Hz`aJd;*igHn*59>tPzOqfC63>Yzwel;FcVF5jJSF){m>HcLG4*eRHZU3hz$poj?wFcaHVrT2uy) z2a!A`9CjCFBMovz_$HGq94RGUPO1u06=B^f-&ZM#s^InW3q2}x9@MI=5b&wqhqFJb z97znS^`BPC%vP#_*X94WlHYitef8^_ReD4z`FK$PZf%#r=}B4=Lp+I9QylD1Gr+JK z68sg+r!FproTVtM#iN`7|O5~?s?wv1#2i73V!IKwiqH6-VN#91daaPPVX6R~~0Fcleq z6M8WfBPU=dA+MryKE)8@66O=$1VSW5lBo2Ts+6Uotja~W8giLVFL_N`leeTTS)~eX z&}B&ldiDgjDmN&*gz+`Q@Jz=yjMfsnfC9zw9i9|LyaQ1qQ68-~^twnqN};U>aU literal 0 HcmV?d00001 diff --git a/backend/home.py b/backend/home.py index ddbd871..863da55 100644 --- a/backend/home.py +++ b/backend/home.py @@ -7,8 +7,8 @@ from strategys.position import enter_position, exit_position from strategys.function import get_cur_price, get_balance, dataFrame, calAmount, VolatilityBreakout, get_symbol_info from strategys.env import profit_percent, loss_percent, purchase_percent, con_diffma40_4, timeframe, symbols, k -from strategys.strategy import strategy_1 - +from strategys.strategy import strategy_1, strategy_2, strategy_3 +import subprocess import time app = FastAPI() @@ -37,29 +37,34 @@ async def init(request: Request): return templates.TemplateResponse("home.html", {"request": request}) -@app.post("/home", response_class=HTMLResponse) -async def home(request: Request, symbol : str = Form(...), perchase_percent : str = Form(...), leverage : str = Form(...)): - print(symbol) - print(perchase_percent) - print(leverage) - return templates.TemplateResponse("home.html", {"request": request, "symbol":symbol, "perchase_percent":perchase_percent, "leverage":leverage}) - - -@app.get("/ETC") -def ETC(): - return {"message":"ETC"} +@app.get("/home", response_class=HTMLResponse) +async def home(request: Request): + return templates.TemplateResponse("home.html", {"request": request}) -@app.get("/symbols") -def symbols(): - return {"message":"symbols"} +@app.post("/enter_position", response_class=HTMLResponse) +async def enter_position(request: Request, symbol: str = Form(...), purchase_percent: float = Form(...), leverage: int = Form(...), strategys:str = Form(...)): + if strategys == "strategy_1": + strategy_1(symbol, purchase_percent, leverage) + elif strategys == "strategy_2": + strategy_2(symbol, purchase_percent, leverage) + elif strategys == "strategy_3": + strategy_3(symbol, purchase_percent, leverage) + + return templates.TemplateResponse("home.html", {"request": request}) -@app.get("/receipt") -def receipt(): - return {"message":"receipt"} +@app.get("/goto", response_class=HTMLResponse) +async def goto(request: Request): + return templates.TemplateResponse("goto.html", {"request": request}) -@app.get("/mypage") -def mypage(): - return {"message":"mypage"} +@app.get("/symbols_info", response_class=HTMLResponse) +async def symbols_info(request: Request): + return templates.TemplateResponse("symbols_info.html", {"request": request}) +@app.get("/history", response_class=HTMLResponse) +def history(request: Request): + return templates.TemplateResponse("history.html", {"request": request}) +@app.get("/mypage", response_class=HTMLResponse) +def mypage(request: Request): + return templates.TemplateResponse("mypage.html", {"request": request}) diff --git a/backend/static/goto.css b/backend/static/goto.css index 4d0e3fe..85800c5 100644 --- a/backend/static/goto.css +++ b/backend/static/goto.css @@ -9,6 +9,7 @@ header { padding-left: 40px; padding-bottom: 5px; } + #img_setting { float: right; width: 35px; diff --git a/backend/static/home.css b/backend/static/home.css index 3033f35..7ea069e 100644 --- a/backend/static/home.css +++ b/backend/static/home.css @@ -43,7 +43,7 @@ main { margin-left: 15px; } -#section_input input { +#section_input .input_info { width: 130px; height: 30px; border-radius: 10px; @@ -73,8 +73,6 @@ main { text-align: center; } - - #enter:hover { box-shadow: 3px 4px 11px 0px #00000040; } @@ -91,6 +89,7 @@ main { overflow: hidden; background: rgba(0,0,0,0.5); } + .modal #detail_popup { /*팝업*/ position: absolute; @@ -101,7 +100,7 @@ main { background: #ffffff; border-radius: 20px; } -.modal_btn_container { +.modal_btn_container form { display: flex; flex-direction: row; justify-content: space-around; diff --git a/backend/static/home.js b/backend/static/home.js index be2fafe..b332884 100644 --- a/backend/static/home.js +++ b/backend/static/home.js @@ -7,7 +7,7 @@ document.addEventListener("DOMContentLoaded", function() { function update_description() { const symbol = document.getElementById('symbol').value; - const purchase_percent = document.getElementById('perchase_percent').value; + const purchase_percent = document.getElementById('purchase_percent').value; const leverage = document.getElementById('leverage').value; const strategy = document.getElementById('strategy').value; @@ -59,7 +59,7 @@ document.getElementById('strategy').addEventListener('change', update_descriptio document.addEventListener("DOMContentLoaded", function() { const modal = document.querySelector('.modal'); const modalOpen = document.querySelector('#enter'); - const modalClose = document.querySelector('#close_detail'); + const modalClose = document.querySelector('#no_detail'); // Open modal when the button is clicked modalOpen.addEventListener('click', function(){ diff --git a/backend/static/img/history.png b/backend/static/img/history.png new file mode 100644 index 0000000000000000000000000000000000000000..6006da4a5225554240ff29bbb665914668d9752e GIT binary patch literal 16951 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 literal 0 HcmV?d00001 diff --git a/backend/static/img/history2.png b/backend/static/img/history2.png new file mode 100644 index 0000000000000000000000000000000000000000..a396cb55ea37edda96d6bac88709ca00545e4f51 GIT binary patch literal 11307 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 diff --git a/backend/strategys/__pycache__/init.cpython-38.pyc b/backend/strategys/__pycache__/init.cpython-38.pyc index cf05ed5ee575fca82bdd34ccf47f01ad01724be3..cdcb7dd8962a3ef647499d94cfbd6ccdf7c8b795 100644 GIT binary patch delta 50 zcmZ3+yn&fJl$V!_0SM-u@7c($&&cRE*_zQ2NqH_K&{z-WEiMcRljD{{JK^58&<<#uogfj&y4qo z)ns*6VCH+&T67vtl_`Cd6|f=MJqX5PH6K?-Jm{lohxcI3xa0+4m|?ZinD_SV(8(y3 zUNG!3x8L{ejq}}&xFB5L>C3h9;l95UcwtNjy*zF#9XKz*a}A#Gzpz&U-_QZ2_*T-l z8WEQRn0(BqG0J6T9M%}5i9)R}P>BYjTpR4TU=>5(qfCRxIL zFU$2>$Fvh(ot7M}NtRDaOWFx9pPAYDg*2?UOioCjnc4n@Ct!OCrL*`j0;l)c?a8f6 zj~lPOeSQ7rjjgvIC-)G4Qu-5&t5&Y^XQxZeDUDuv#&q@0`YMT7zweRP|+bwe!ib% zHsIs+R2wz2@!;Q|K6v-DR4b#-CX%{|@x{3M%JQ zJ^p*dH132W8P5c?kyr|$dCZib14@WrBZ2*zRHHgoe&o2P9y&7{i!jNG`s)x227AQT zi+h`DfW zF3hx{^hz$@O1UMeeS4-2#a3DmZXfff&8QCReGutzmLMvT85P0TTBJqlK_22<5@m?F z9u=UOX{>TrrzBbcjV~W5T}h=iR)rI(vD#g@7DWw^|NaS9$Ym=u4;6my$yXRQA1Pb? zxW>vyl#;)ZTx4FC%DICvPtlRPmb01TTHxMi!8Qa0D9BZp=0UPIISxw%MHu=Lb~!o%m&4?C$Cr_X zp7R!h(+Fft)^LW=;Mg$u831wK4Z9cu%YccDf>lgOT_}uJX+}ouWL+?4MYH?o7r|I~ z9RN`@MS+T-YbJ$?sOqYrmeiVBq3K6mQC8GVWmDCmb~I^I(E*-%2wPU0lwSl}Pbw)iW6!4HI?E0VS+8?5YtvH=?X@vw(~Zv1L5ja6rO=lFL8m+euu)+(6h z_}hus5#W7Xc4ygDI3^rNU*^(WCVU%cv2oE4*w}M6@rDs%=QL=E*610!q8W>3p?0Nq F^=DACEaU(H delta 973 zcmb7@&ubGw6vyA2{hef!OOFdW*9t0t%^x#d37pY3(v<0`Obvg%y8FEN( zQi$w95DyCe1K#{A`~&tT9=!Jt5Z`Rfwn!12W#8=gecxx^?67;>``KN67=|^Vu~Hmv zzv}?}Fyi!JB>Hq8yn4I39|pX32#?Nl+<>(HrFi3@mv6h*$EOKe1p>P78tMu095rx? zoPA&#C2(tk_h8B%_cfC!8OH=Bs4ZztK-p&FQ%-*8jMTk{-_K z`RaSaxj)XBZmT9We6K7GlHN~w%BS6i3KdK|1R2Wa>|iPDa?11Ok&B=rqQ0F;v`!Jo zTL};o9XZ6brcBUzRh`EFYUNa|+JxQuzgDC8%=+kKn}?qe;boV@24I>W2b=c`_u%!5 z;oh#eNS~g#LZNWwK {entry_price - entry_price * profit_percent > cur_price}") print(f"short loss end : {entry_price + entry_price * loss_percent} /// {cur_price} => {entry_price + entry_price * loss_percent < cur_price}") +def set_leverage(symbol, leverage=1): + # leverage 설정 + markets = binance.load_markets() + market = binance.market(symbol) + resp = binance.fapiprivate_post_leverage({ + "symbol":market["id"], + "leverage":leverage + }) + +def strategy_1(symbol = symbols, purchase_percent=purchase_percent, leverage=1): + # while(True): + entry_price = 0 + position = { + "type":None, + "amount":0 + } + set_leverage(symbol, leverage) + for _ in range(5): + # 현재가 + cur_price = get_cur_price(symbol) + + # 잔고 + balance = get_balance() + + # dataFrame + df = dataFrame(symbol) + + # 구매 수량 + amount = calAmount(balance, cur_price, purchase_percent) # 50% + + # 변동성 돌파전략 + long_target, short_target = VolatilityBreakout(dataFrame(symbol)) + + # sma 설정 + sma4 = df["sma4"].iloc[-1] + sma8 = df["sma8"].iloc[-1] + sma30 = df["sma30"].iloc[-1] + sma40 = df["sma40"].iloc[-1] + diffma40_4 = df["diffMa40_4"].iloc[-1] + + # long position 진입 조건 + is_long = ((sma4 > sma30) & (cur_price > long_target) & (diffma40_4 > con_diffma40_4) & (position["type"] == None)) + # short position 진입 조건 + is_short = ((sma4 < sma30) & (cur_price < short_target) & (diffma40_4 > con_diffma40_4) & (position["type"] == None)) + + # long position 청산 조건 + is_long_end = (((entry_price + entry_price * profit_percent < cur_price) and position["type"] == "long") or ((entry_price - entry_price * loss_percent > cur_price) and position["type"] == "long") ) + # short position 청산 조건 + is_short_end = (((entry_price - entry_price * profit_percent > cur_price) and position["type"] == "short") or ((entry_price + entry_price * loss_percent < cur_price) and position["type"] =="short")) + # print(df) + # position 진입 + if is_long: + entry_price = cur_price + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + enter_position(binance, symbol=symbol, cur_price = cur_price, amount=amount, target=1, position=position) + + if is_long_end: + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + exit_position(binance, symbol=symbol, cur_price=cur_price, amount = position["amount"], position=position) + + + if is_short: + entry_price = cur_price + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + enter_position(binance, symbol=symbol, cur_price = cur_price, amount=amount, target=-1, position=position) + + if is_short_end: + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + exit_position(binance, symbol=symbol, cur_price=cur_price, amount = position["amount"], position=position) + + else: + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + time.sleep(1) + +def strategy_2(symbol = symbols, purchase_percent=purchase_percent, leverage=1): + # while(True): + entry_price = 0 + position = { + "type":None, + "amount":0 + } + set_leverage(symbol, leverage) + for _ in range(5): + # 현재가 + cur_price = get_cur_price(symbol) + + # 잔고 + balance = get_balance() + + # dataFrame + df = dataFrame(symbol) + + # 구매 수량 + amount = calAmount(balance, cur_price, purchase_percent) # 50% + + # 변동성 돌파전략 + long_target, short_target = VolatilityBreakout(dataFrame(symbol)) + + # sma 설정 + sma4 = df["sma4"].iloc[-1] + sma8 = df["sma8"].iloc[-1] + sma30 = df["sma30"].iloc[-1] + sma40 = df["sma40"].iloc[-1] + diffma40_4 = df["diffMa40_4"].iloc[-1] + + # long position 진입 조건 + is_long = ((sma4 > sma30) & (cur_price > long_target) & (diffma40_4 > con_diffma40_4) & (position["type"] == None)) + # short position 진입 조건 + is_short = ((sma4 < sma30) & (cur_price < short_target) & (diffma40_4 > con_diffma40_4) & (position["type"] == None)) + + # long position 청산 조건 + is_long_end = (((entry_price + entry_price * profit_percent < cur_price) and position["type"] == "long") or ((entry_price - entry_price * loss_percent > cur_price) and position["type"] == "long") ) + # short position 청산 조건 + is_short_end = (((entry_price - entry_price * profit_percent > cur_price) and position["type"] == "short") or ((entry_price + entry_price * loss_percent < cur_price) and position["type"] =="short")) + # print(df) + # position 진입 + if is_long: + entry_price = cur_price + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + enter_position(binance, symbol=symbol, cur_price = cur_price, amount=amount, target=1, position=position) + + if is_long_end: + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + exit_position(binance, symbol=symbol, cur_price=cur_price, amount = position["amount"], position=position) + + + if is_short: + entry_price = cur_price + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + enter_position(binance, symbol=symbol, cur_price = cur_price, amount=amount, target=-1, position=position) + + if is_short_end: + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + exit_position(binance, symbol=symbol, cur_price=cur_price, amount = position["amount"], position=position) + + else: + print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) + time.sleep(1) + -def strategy_1(): +def strategy_3(symbol = symbols, purchase_percent=purchase_percent, leverage=1): # while(True): entry_price = 0 position = { "type":None, "amount":0 } + set_leverage(symbol, leverage) for _ in range(5): # 현재가 - cur_price = get_cur_price(symbols[0]) + cur_price = get_cur_price(symbol) # 잔고 balance = get_balance() # dataFrame - df = dataFrame(symbols[0]) + df = dataFrame(symbol) # 구매 수량 amount = calAmount(balance, cur_price, purchase_percent) # 50% # 변동성 돌파전략 - long_target, short_target = VolatilityBreakout(dataFrame(symbols[0])) + long_target, short_target = VolatilityBreakout(dataFrame(symbol)) # sma 설정 sma4 = df["sma4"].iloc[-1] @@ -70,22 +212,22 @@ def strategy_1(): if is_long: entry_price = cur_price print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) - enter_position(binance, symbol=symbols[0], cur_price = cur_price, amount=amount, target=1, position=position) + enter_position(binance, symbol=symbol, cur_price = cur_price, amount=amount, target=1, position=position) if is_long_end: print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) - exit_position(binance, symbol=symbols[0], cur_price=cur_price, amount = position["amount"], position=position) + exit_position(binance, symbol=symbol, cur_price=cur_price, amount = position["amount"], position=position) if is_short: entry_price = cur_price print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) - enter_position(binance, symbol=symbols[0], cur_price = cur_price, amount=amount, target=-1, position=position) + enter_position(binance, symbol=symbol, cur_price = cur_price, amount=amount, target=-1, position=position) if is_short_end: print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) - exit_position(binance, symbol=symbols[0], cur_price=cur_price, amount = position["amount"], position=position) + exit_position(binance, symbol=symbol, cur_price=cur_price, amount = position["amount"], position=position) else: print_info(df, long_target, short_target, cur_price, diffma40_4, position, entry_price) - time.sleep(1) \ No newline at end of file + time.sleep(1) diff --git a/backend/templates/goto.html b/backend/templates/goto.html index cc7de6f..a90f240 100644 --- a/backend/templates/goto.html +++ b/backend/templates/goto.html @@ -2,31 +2,98 @@ 코인 전략 선택 - + - + + -
- Bit4Coin - -
-
- - - - -
- - - -
- - - - - -
+
+ Bit4Coin + +
+
+
+
+ + + +
Binance
+
+
+ + + +
TradingView
+
+
+ +
History
+
+
+ + + +
GitHub
+
+
+
+
+ + + + + +
- diff --git a/backend/templates/history.html b/backend/templates/history.html new file mode 100644 index 0000000..3b7c967 --- /dev/null +++ b/backend/templates/history.html @@ -0,0 +1,30 @@ + + + + 코인 전략 선택 + + + + + +
+ Bit4Coin + +
+
+ + +
+ + + +
+ + + + + +
+ + + diff --git a/backend/templates/home.html b/backend/templates/home.html index 6a8545e..38c3bf3 100644 --- a/backend/templates/home.html +++ b/backend/templates/home.html @@ -3,8 +3,86 @@ 코인 전략 선택 - + +
@@ -20,14 +98,14 @@ -
- -
-
- - - - +
+
+ +
+ + + +
- +
- -
+
+ -
-
-
- -
- - - - + +
- - + + - +
diff --git a/backend/templates/mypage.html b/backend/templates/mypage.html new file mode 100644 index 0000000..3b7c967 --- /dev/null +++ b/backend/templates/mypage.html @@ -0,0 +1,30 @@ + + + + 코인 전략 선택 + + + + + +
+ Bit4Coin + +
+
+ + +
+ + + +
+ + + + + +
+ + + diff --git a/backend/templates/symbols_info.html b/backend/templates/symbols_info.html new file mode 100644 index 0000000..3b7c967 --- /dev/null +++ b/backend/templates/symbols_info.html @@ -0,0 +1,30 @@ + + + + 코인 전략 선택 + + + + + +
+ Bit4Coin + +
+
+ + +
+ + + + + + +