2021.08.18 - [Hi/Blockchain] - ์๋๋งค๋งค๋ด ์ ์๊ธฐ
์๋๋งค๋งค๋ด ์ ์๊ธฐ
์์ ์ ์ฃผ์๋ ํด๋ณด๊ณ ์ฝ์ธ๋ ํด๋ดค์๋๋ฐ, ์ ๋ณด๋ ์์ด ์ฌ๋์ ๋จธ๋ฆฌ๋ก ์๊ฐํ๊ณ ์์ผ๋ก ๊ฑฐ๋ํ๋ค๋ณด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋๊ฒ ๋ ์ปธ๋ ๊ฒ ๊ฐ๋ค. ์ด๋๋ณด๋ฉด ์์ฌ์ด ์๊ธฐ๊ณ , ์ํด๋ณด๋ฉด ์ธ์ ๊ฐ ์ค๋ฅด๊ฒ ์ง
forbetterdays.tistory.com
์์ ๊ธ ์ดํ๋ก ๋ง์ ์ฌ๋์ด ๊ด์ฌ์ด ๋ง์ ๊ฒ ๊ฐ์์ ์ดํ์ ์ ์ํ๋ ์๋๋งค๋งค ๋ด์ ์จ๋ณผ๊น ํฉ๋๋ค.
๋ณธ๋ฌธ์์ ์ฌ๋ฆฌ๋ ์ฝ๋๋ ํ๋ฝ์ฅ์ด๋ ์์น์ฅ์ด๋ ์กฐ๊ธ์ฉ๋ง ์ด๋๋ณด์๋ ์๋ฏธ๋ก ๋ง๋ค์๋ ์ฝ๋๋ก ํฐ ์์ต์ ๊ธฐ๋ํ์ง ์์ต๋๋ค. ์๋๋ RSI ๊ธฐ๋ฐ์ ์๋๋งค๋งค ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ๋ฉด์ ์ฐํ ๊ฐ๋ค ์ ๋๋ค. ํฌ๊ฒ ๋ฒ๊ฑฐ๋ ์์ง๋ ์์ง๋ง ๊พธ์คํ๊ฒ ์กฐ๊ธ์ฉ ์์ต์ด ์ฌ๋ผ์ต๋๋ค. ์์ ์ฑ์ ์ถ๊ตฌํ์์ต๋๋ค. ๋ฐฑํ ์คํ ์ ์งํํ ํ์ ํฌ์ํ์ธ์.


๋ชจ๋ ์ฝ์ธ ์ข ๋ชฉ์ ์ฃผ์ํ๋ฉด์ ์ผ์ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ ์ข ๋ชฉ์ ์ฃผ์ํ๋ค๊ฐ ๋จ์ด์ง ๋ ์ต์ ์ ์ด๋ผ ํ๋จ๋๋ฉด ๋งค์๋ฅผ ํ๊ณ ,
์ฌ๋ผ๊ฐ๋ค๊ฐ ์ผ์ ํผ์ผํธ ๋จ์ด์ง๊ฑฐ๋ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ๋งค๋๋ฅผ ํ๋ ์ฝ๋์ ๋๋ค.
๋จผ์ ๋ณธ ์ฝ๋๋ RSI ๊ธฐ๋ฐ์ผ๋ก ์กฐ๊ฑด์ ๋ฐ์ก์ผ๋ฉฐ, ์ด๋ฅผ ์ด์ฉํ ์ฝ๋๋ก ์์ฑ๋์ด ์์ต๋๋ค.
RSI์ ๋ํด์ ์์์ผํ๋๋ฐ, ์ด๋ ์๋๊ฐ๋์ง์(Relative Strength Index)๋ฅผ ๋ปํ๋ ๋ณด์กฐ ํฌ์ ์งํ์ ๋๋ค.
์ด ์งํ๋ ๊ฐ๊ฒฉ์ ์์น์๋ ฅ๊ณผ ํ๋ฝ์๋ ฅ ๊ฐ์ ์๋์ ์ธ ๊ฐ๋๋ฅผ ๋ํ๋ด๋ ์งํ์ ๋๋ค.
RSI ๊ฐ๋ (์ํค๋ฐฑ๊ณผ ์ถ์ฒ)
- RSI๋ ์ผ์ ๊ธฐ๊ฐ ๋์ ์ฃผ๊ฐ๊ฐ ์ ์ผ ๊ฐ๊ฒฉ์ ๋นํด ์์นํ ๋ณํ๋๊ณผ ํ๋ฝํ ๋ณํ๋์ ํ๊ท ๊ฐ์ ๊ตฌํ์ฌ, ์์นํ ๋ณํ๋์ด ํฌ๋ฉด ๊ณผ๋งค์๋ก, ํ๋ฝํ ๋ณํ๋์ด ํฌ๋ฉด ๊ณผ๋งค๋๋ก ํ๋จํ๋ ๋ฐฉ์์ด๋ค.
- ๊ณ์ฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ฃผ์ด์ง ๊ธฐ๊ฐ์ ๋ชจ๋ ๋ ์ ์ฃผ๊ฐ์ ๋ํด์
๊ฐ๊ฒฉ์ด ์ ์ผ ๊ฐ๊ฒฉ๋ณด๋ค ์์นํ ๋ ์ ์์น๋ถ์ U(up) ๊ฐ์ด๋ผ๊ณ ํ๊ณ ,
๊ฐ๊ฒฉ์ด ์ ์ผ ๊ฐ๊ฒฉ๋ณด๋ค ํ๋ฝํ ๋ ์ ํ๋ฝ๋ถ์ D(down) ๊ฐ์ด๋ผ๊ณ ํ๋ค.
U๊ฐ๊ณผ D๊ฐ์ ํ๊ท ๊ฐ์ ๊ตฌํ์ฌ ๊ทธ๊ฒ์ ๊ฐ๊ฐ AU(average ups)์ AD(average downs)๋ผ ํ๋ค.
AU๋ฅผ AD๊ฐ์ผ๋ก ๋๋ ๊ฒ์ RS(relative strength) ๊ฐ์ด๋ผ๊ณ ํ๋ค.
RS ๊ฐ์ด ํฌ๋ค๋ ๊ฒ์ ์ผ์ ๊ธฐ๊ฐ ํ๋ฝํ ํญ๋ณด๋ค ์์นํ ํญ์ด ํฌ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ๋ค์ ๊ณ์ฐ์ ์ํ์ฌ RSI ๊ฐ์ ๊ตฌํ๋ค.
RSI ๊ณ์ฐ ๊ณต์ :
RSI = RS / (1 + RS)
๋๋, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํด๋ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค.
RSI = AU / (AU + AD)
๋์ฒด๋ก ์ด ๊ฐ์ ๋ฐฑ๋ถ์จ๋ก ๋ํ๋ธ๋ค.
- ์ด ์งํ์ ํ๋ผ๋ฏธํฐ๋ก๋ ๊ธฐ๊ฐ์ ๋ฉฐ์น ๋์์ผ๋ก ํ ๊ฒ์ธ๊ฐ๊ฐ ์๋ค.
Welles Wilder๋ 14์ผ์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ ํ๋ค.
๋์ฒด๋ก ์ฌ์ฉ๋๋ ๊ฐ์ 9์ผ, 14~15์ผ, 25~28์ผ ๋ฑ์ด๋ค.
- RSI ๊ทธ๋ํ๋ ์ด๋ํ๊ท ์ ์ ํจ๊ป ๋ํ๋ด๋ ๊ฒ์ด ๋ณดํต์ด๋ฉฐ, ์ด๋ํ๊ท ์ ์ ๋ฉฐ์น ์ ์ผ๋ก ํ ๊ฒ์ธ๊ฐ ์ญ์ ํ๋ผ๋ฉํฐ๋ก ์ฃผ์ด์ง๋ค. RSI๋ฅผ 15์ผ์ ๋ํ์ฌ ๊ตฌํ๊ณ 5์ผ ์ด๋ํ๊ท ์ ์ ํจ๊ป ํ์ํ๋ ๊ฒฝ์ฐ ๊ทธ๋ํ์ (15, 5)๋ผ๊ณ ํ์ํด์ฃผ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.

์ด๋ฐ ์์ผ๋ก RSI ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ๊ณผ๋งค์ ์ํ์ธ์ง ๊ณผ๋งค๋ ์ํ์ธ์ง ํ๋จ์ด ๊ฐ๋ฅํด ์ง๋๋ค.
์ฆ, ๊ณผ๋งค๋ ์ํ์ผ๋ ๋งค์๋ฅผ ํ๊ณ ๊ณผ๋งค์ ์ํ์ผ๋ ๋งค๋๋ฅผ ํ๋ ์ ๋ต์ ์ธ์ธ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ ๊ฒ์ด ์๋์ ๊ฐ์ต๋๋ค.
def rsi(ohlc: pd.DataFrame, period: int = 14):
ohlc["close"] = ohlc["close"]
delta = ohlc["close"].diff()
up, down = delta.copy(), delta.copy()
up[up < 0] = 0
down[down > 0] = 0
_gain = up.ewm(com=(period - 1), min_periods=period).mean()
_loss = down.abs().ewm(com=(period - 1), min_periods=period).mean()
RS = _gain / _loss
return pd.Series(100 - (100 / (1 + RS)), name="RSI")
์ด๋ฅผ ์ด์ฉํ์ฌ ์กฐ๊ฑด์ ์ค์ ํ๊ณ ์์๋์ ๋ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ์ข ๋ชฉ์ ์ ๋ถ ์ํํ๋ฉฐ ํ์ธํ์์ต๋๋ค.
def searchRSI(settingRSI):
try :
tickers = pyupbit.get_tickers(fiat="KRW")
for symbol in tickers :
url = "https://api.upbit.com/v1/candles/minutes/10"
querystring = {"market":symbol,"count":"500"}
response = requests.request("GET", url, params=querystring)
data = response.json()
df = pd.DataFrame(data)
df=df.reindex(index=df.index[::-1]).reset_index()
df['close']=df["trade_price"]
def rsi(ohlc: pd.DataFrame, period: int = 14):
ohlc["close"] = ohlc["close"]
delta = ohlc["close"].diff()
up, down = delta.copy(), delta.copy()
up[up < 0] = 0
down[down > 0] = 0
_gain = up.ewm(com=(period - 1), min_periods=period).mean()
_loss = down.abs().ewm(com=(period - 1), min_periods=period).mean()
RS = _gain / _loss
return pd.Series(100 - (100 / (1 + RS)), name="RSI")
rsi = rsi(df, 14).iloc[-1]
#print(symbol)
#print('Upbit 10 minute RSI:', rsi)
#print('')
if rsi < settingRSI :
print("!!๊ณผ๋งค๋ ํ์ ๋ฐ๊ฒฌ!!")
return symbol
break
time.sleep(1)
except :
#print("์ฐพ๋์ค...")
time.sleep(2)
searchRSI()
๊ทธ๋ฌ๊ณ ์ข ๋ชฉ์ ๋ฐ๊ฒฌํ๋ฉด ์ด ์ข ๋ชฉ์ ์ฃผ์ํ๋ฉด์ ๋ ๋จ์ด์ง๋ ๊น์ง ๋๊ธฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค,
๋จ์ด์ง๋ค๊ฐ ์ต์ ์ ์ ์ฐ๊ณ ์ฌ๋ผ๊ฐ๋ ๊ฒ ๊ฐ์ผ๋ฉด ๊ทธ ๋ ๋งค์๋ฅผ ํ์์ต๋๋ค.
์ ์ฒด ์๋๋ฆฌ์ค๋ ์ด๋ฐ ์์ผ๋ก ์งํ๋ฉ๋๋ค.
#๋ฉ์ธ
while True:
try:
maxRSI = 0
minRSI = 100
TF = False
i = searchRSI(25) #๊ณผ๋งค๋ํ์ ์ฝ์ธ ์ฐพ๊ธฐ #RSI๊ฐ n๋ณด๋ค ๋จ์ด์ง๋ฉด
krw = upbit.get_balance("KRW")
#print("๊ตฌ๋งค ํ์ด๋ฐ ์ก๋์ค...")
while True :
firstRSI = search_onetime(i)
time.sleep(10)
if buyRSI(i,firstRSI) == True :
upbit.buy_market_order(i, krw*0.9995)
time.sleep(1)
print("<<<< " + str(i) + " ๊ตฌ๋งค์๋ฃ >>>>")
break
#elif buyRSI(i,firstRSI) == -1 :
# TF = True
# break
else :
time.sleep(1)
# ๊ฒฐ์ ๊ธ์ก
firstPrice = pyupbit.get_current_price(i)
time.sleep(1)
print("๊ตฌ๋งค๊ธ์ก : " + str(firstPrice))
while True :
firstRSI = search_onetime(i)
#time.sleep(15)
# ํ๋งค๋๊ธฐ
if sellRSI(i, firstRSI, firstPrice)== True:
useCoin = upbit.get_balance(i)
upbit.sell_market_order(i, useCoin)
print("<<<< " + str(i) + " ํ๋งค์๋ฃ >>>>")
time.sleep(5)
print("ํ์ฌ ๋ณด์ KRW : " + str(upbit.get_balance("KRW")))
break
else : time.sleep(1)
print('ํ๋งค์ฝ์ธ ํ์ฌ๊ฐ : ' + str(pyupbit.get_current_price(i)))
print()
time.sleep(5)
except :
time.sleep(1)
RSI๋ฅผ ํฌํจํ ์ฌ๋ฌ๊ฐ์ ์งํ๋ค๊ณผ ์์ ๋ง์ ํ๋จ ๋ฐ ์กฐ๊ฑด ์ค์ ์ ํตํด ๋งค๋๋ฅผ ์งํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
2021.08.18 - [Hi/Blockchain] - ์๋๋งค๋งค๋ด ์ ์๊ธฐ
์๋๋งค๋งค๋ด ์ ์๊ธฐ
์์ ์ ์ฃผ์๋ ํด๋ณด๊ณ ์ฝ์ธ๋ ํด๋ดค์๋๋ฐ, ์ ๋ณด๋ ์์ด ์ฌ๋์ ๋จธ๋ฆฌ๋ก ์๊ฐํ๊ณ ์์ผ๋ก ๊ฑฐ๋ํ๋ค๋ณด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋๊ฒ ๋ ์ปธ๋ ๊ฒ ๊ฐ๋ค. ์ด๋๋ณด๋ฉด ์์ฌ์ด ์๊ธฐ๊ณ , ์ํด๋ณด๋ฉด ์ธ์ ๊ฐ ์ค๋ฅด๊ฒ ์ง
forbetterdays.tistory.com
์์ ๊ธ ์ดํ๋ก ๋ง์ ์ฌ๋์ด ๊ด์ฌ์ด ๋ง์ ๊ฒ ๊ฐ์์ ์ดํ์ ์ ์ํ๋ ์๋๋งค๋งค ๋ด์ ์จ๋ณผ๊น ํฉ๋๋ค.
๋ณธ๋ฌธ์์ ์ฌ๋ฆฌ๋ ์ฝ๋๋ ํ๋ฝ์ฅ์ด๋ ์์น์ฅ์ด๋ ์กฐ๊ธ์ฉ๋ง ์ด๋๋ณด์๋ ์๋ฏธ๋ก ๋ง๋ค์๋ ์ฝ๋๋ก ํฐ ์์ต์ ๊ธฐ๋ํ์ง ์์ต๋๋ค. ์๋๋ RSI ๊ธฐ๋ฐ์ ์๋๋งค๋งค ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ๋ฉด์ ์ฐํ ๊ฐ๋ค ์ ๋๋ค. ํฌ๊ฒ ๋ฒ๊ฑฐ๋ ์์ง๋ ์์ง๋ง ๊พธ์คํ๊ฒ ์กฐ๊ธ์ฉ ์์ต์ด ์ฌ๋ผ์ต๋๋ค. ์์ ์ฑ์ ์ถ๊ตฌํ์์ต๋๋ค. ๋ฐฑํ ์คํ ์ ์งํํ ํ์ ํฌ์ํ์ธ์.


๋ชจ๋ ์ฝ์ธ ์ข ๋ชฉ์ ์ฃผ์ํ๋ฉด์ ์ผ์ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ ์ข ๋ชฉ์ ์ฃผ์ํ๋ค๊ฐ ๋จ์ด์ง ๋ ์ต์ ์ ์ด๋ผ ํ๋จ๋๋ฉด ๋งค์๋ฅผ ํ๊ณ ,
์ฌ๋ผ๊ฐ๋ค๊ฐ ์ผ์ ํผ์ผํธ ๋จ์ด์ง๊ฑฐ๋ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ๋งค๋๋ฅผ ํ๋ ์ฝ๋์ ๋๋ค.
๋จผ์ ๋ณธ ์ฝ๋๋ RSI ๊ธฐ๋ฐ์ผ๋ก ์กฐ๊ฑด์ ๋ฐ์ก์ผ๋ฉฐ, ์ด๋ฅผ ์ด์ฉํ ์ฝ๋๋ก ์์ฑ๋์ด ์์ต๋๋ค.
RSI์ ๋ํด์ ์์์ผํ๋๋ฐ, ์ด๋ ์๋๊ฐ๋์ง์(Relative Strength Index)๋ฅผ ๋ปํ๋ ๋ณด์กฐ ํฌ์ ์งํ์ ๋๋ค.
์ด ์งํ๋ ๊ฐ๊ฒฉ์ ์์น์๋ ฅ๊ณผ ํ๋ฝ์๋ ฅ ๊ฐ์ ์๋์ ์ธ ๊ฐ๋๋ฅผ ๋ํ๋ด๋ ์งํ์ ๋๋ค.
RSI ๊ฐ๋ (์ํค๋ฐฑ๊ณผ ์ถ์ฒ)
- RSI๋ ์ผ์ ๊ธฐ๊ฐ ๋์ ์ฃผ๊ฐ๊ฐ ์ ์ผ ๊ฐ๊ฒฉ์ ๋นํด ์์นํ ๋ณํ๋๊ณผ ํ๋ฝํ ๋ณํ๋์ ํ๊ท ๊ฐ์ ๊ตฌํ์ฌ, ์์นํ ๋ณํ๋์ด ํฌ๋ฉด ๊ณผ๋งค์๋ก, ํ๋ฝํ ๋ณํ๋์ด ํฌ๋ฉด ๊ณผ๋งค๋๋ก ํ๋จํ๋ ๋ฐฉ์์ด๋ค.
- ๊ณ์ฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ฃผ์ด์ง ๊ธฐ๊ฐ์ ๋ชจ๋ ๋ ์ ์ฃผ๊ฐ์ ๋ํด์
๊ฐ๊ฒฉ์ด ์ ์ผ ๊ฐ๊ฒฉ๋ณด๋ค ์์นํ ๋ ์ ์์น๋ถ์ U(up) ๊ฐ์ด๋ผ๊ณ ํ๊ณ ,
๊ฐ๊ฒฉ์ด ์ ์ผ ๊ฐ๊ฒฉ๋ณด๋ค ํ๋ฝํ ๋ ์ ํ๋ฝ๋ถ์ D(down) ๊ฐ์ด๋ผ๊ณ ํ๋ค.
U๊ฐ๊ณผ D๊ฐ์ ํ๊ท ๊ฐ์ ๊ตฌํ์ฌ ๊ทธ๊ฒ์ ๊ฐ๊ฐ AU(average ups)์ AD(average downs)๋ผ ํ๋ค.
AU๋ฅผ AD๊ฐ์ผ๋ก ๋๋ ๊ฒ์ RS(relative strength) ๊ฐ์ด๋ผ๊ณ ํ๋ค.
RS ๊ฐ์ด ํฌ๋ค๋ ๊ฒ์ ์ผ์ ๊ธฐ๊ฐ ํ๋ฝํ ํญ๋ณด๋ค ์์นํ ํญ์ด ํฌ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ๋ค์ ๊ณ์ฐ์ ์ํ์ฌ RSI ๊ฐ์ ๊ตฌํ๋ค.
RSI ๊ณ์ฐ ๊ณต์ :
RSI = RS / (1 + RS)
๋๋, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํด๋ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค.
RSI = AU / (AU + AD)
๋์ฒด๋ก ์ด ๊ฐ์ ๋ฐฑ๋ถ์จ๋ก ๋ํ๋ธ๋ค.
- ์ด ์งํ์ ํ๋ผ๋ฏธํฐ๋ก๋ ๊ธฐ๊ฐ์ ๋ฉฐ์น ๋์์ผ๋ก ํ ๊ฒ์ธ๊ฐ๊ฐ ์๋ค.
Welles Wilder๋ 14์ผ์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ ํ๋ค.
๋์ฒด๋ก ์ฌ์ฉ๋๋ ๊ฐ์ 9์ผ, 14~15์ผ, 25~28์ผ ๋ฑ์ด๋ค.
- RSI ๊ทธ๋ํ๋ ์ด๋ํ๊ท ์ ์ ํจ๊ป ๋ํ๋ด๋ ๊ฒ์ด ๋ณดํต์ด๋ฉฐ, ์ด๋ํ๊ท ์ ์ ๋ฉฐ์น ์ ์ผ๋ก ํ ๊ฒ์ธ๊ฐ ์ญ์ ํ๋ผ๋ฉํฐ๋ก ์ฃผ์ด์ง๋ค. RSI๋ฅผ 15์ผ์ ๋ํ์ฌ ๊ตฌํ๊ณ 5์ผ ์ด๋ํ๊ท ์ ์ ํจ๊ป ํ์ํ๋ ๊ฒฝ์ฐ ๊ทธ๋ํ์ (15, 5)๋ผ๊ณ ํ์ํด์ฃผ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.

์ด๋ฐ ์์ผ๋ก RSI ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ๊ณผ๋งค์ ์ํ์ธ์ง ๊ณผ๋งค๋ ์ํ์ธ์ง ํ๋จ์ด ๊ฐ๋ฅํด ์ง๋๋ค.
์ฆ, ๊ณผ๋งค๋ ์ํ์ผ๋ ๋งค์๋ฅผ ํ๊ณ ๊ณผ๋งค์ ์ํ์ผ๋ ๋งค๋๋ฅผ ํ๋ ์ ๋ต์ ์ธ์ธ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ ๊ฒ์ด ์๋์ ๊ฐ์ต๋๋ค.
def rsi(ohlc: pd.DataFrame, period: int = 14):
ohlc["close"] = ohlc["close"]
delta = ohlc["close"].diff()
up, down = delta.copy(), delta.copy()
up[up < 0] = 0
down[down > 0] = 0
_gain = up.ewm(com=(period - 1), min_periods=period).mean()
_loss = down.abs().ewm(com=(period - 1), min_periods=period).mean()
RS = _gain / _loss
return pd.Series(100 - (100 / (1 + RS)), name="RSI")
์ด๋ฅผ ์ด์ฉํ์ฌ ์กฐ๊ฑด์ ์ค์ ํ๊ณ ์์๋์ ๋ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ์ข ๋ชฉ์ ์ ๋ถ ์ํํ๋ฉฐ ํ์ธํ์์ต๋๋ค.
def searchRSI(settingRSI):
try :
tickers = pyupbit.get_tickers(fiat="KRW")
for symbol in tickers :
url = "https://api.upbit.com/v1/candles/minutes/10"
querystring = {"market":symbol,"count":"500"}
response = requests.request("GET", url, params=querystring)
data = response.json()
df = pd.DataFrame(data)
df=df.reindex(index=df.index[::-1]).reset_index()
df['close']=df["trade_price"]
def rsi(ohlc: pd.DataFrame, period: int = 14):
ohlc["close"] = ohlc["close"]
delta = ohlc["close"].diff()
up, down = delta.copy(), delta.copy()
up[up < 0] = 0
down[down > 0] = 0
_gain = up.ewm(com=(period - 1), min_periods=period).mean()
_loss = down.abs().ewm(com=(period - 1), min_periods=period).mean()
RS = _gain / _loss
return pd.Series(100 - (100 / (1 + RS)), name="RSI")
rsi = rsi(df, 14).iloc[-1]
#print(symbol)
#print('Upbit 10 minute RSI:', rsi)
#print('')
if rsi < settingRSI :
print("!!๊ณผ๋งค๋ ํ์ ๋ฐ๊ฒฌ!!")
return symbol
break
time.sleep(1)
except :
#print("์ฐพ๋์ค...")
time.sleep(2)
searchRSI()
๊ทธ๋ฌ๊ณ ์ข ๋ชฉ์ ๋ฐ๊ฒฌํ๋ฉด ์ด ์ข ๋ชฉ์ ์ฃผ์ํ๋ฉด์ ๋ ๋จ์ด์ง๋ ๊น์ง ๋๊ธฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค,
๋จ์ด์ง๋ค๊ฐ ์ต์ ์ ์ ์ฐ๊ณ ์ฌ๋ผ๊ฐ๋ ๊ฒ ๊ฐ์ผ๋ฉด ๊ทธ ๋ ๋งค์๋ฅผ ํ์์ต๋๋ค.
์ ์ฒด ์๋๋ฆฌ์ค๋ ์ด๋ฐ ์์ผ๋ก ์งํ๋ฉ๋๋ค.
#๋ฉ์ธ
while True:
try:
maxRSI = 0
minRSI = 100
TF = False
i = searchRSI(25) #๊ณผ๋งค๋ํ์ ์ฝ์ธ ์ฐพ๊ธฐ #RSI๊ฐ n๋ณด๋ค ๋จ์ด์ง๋ฉด
krw = upbit.get_balance("KRW")
#print("๊ตฌ๋งค ํ์ด๋ฐ ์ก๋์ค...")
while True :
firstRSI = search_onetime(i)
time.sleep(10)
if buyRSI(i,firstRSI) == True :
upbit.buy_market_order(i, krw*0.9995)
time.sleep(1)
print("<<<< " + str(i) + " ๊ตฌ๋งค์๋ฃ >>>>")
break
#elif buyRSI(i,firstRSI) == -1 :
# TF = True
# break
else :
time.sleep(1)
# ๊ฒฐ์ ๊ธ์ก
firstPrice = pyupbit.get_current_price(i)
time.sleep(1)
print("๊ตฌ๋งค๊ธ์ก : " + str(firstPrice))
while True :
firstRSI = search_onetime(i)
#time.sleep(15)
# ํ๋งค๋๊ธฐ
if sellRSI(i, firstRSI, firstPrice)== True:
useCoin = upbit.get_balance(i)
upbit.sell_market_order(i, useCoin)
print("<<<< " + str(i) + " ํ๋งค์๋ฃ >>>>")
time.sleep(5)
print("ํ์ฌ ๋ณด์ KRW : " + str(upbit.get_balance("KRW")))
break
else : time.sleep(1)
print('ํ๋งค์ฝ์ธ ํ์ฌ๊ฐ : ' + str(pyupbit.get_current_price(i)))
print()
time.sleep(5)
except :
time.sleep(1)
RSI๋ฅผ ํฌํจํ ์ฌ๋ฌ๊ฐ์ ์งํ๋ค๊ณผ ์์ ๋ง์ ํ๋จ ๋ฐ ์กฐ๊ฑด ์ค์ ์ ํตํด ๋งค๋๋ฅผ ์งํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.