레디스 및 구조 수정중
This commit is contained in:
@@ -158,10 +158,11 @@ def analyze_macd(chart_data: list) -> dict:
|
||||
|
||||
|
||||
def analyze_rsi(chart_data: list) -> dict:
|
||||
if len(chart_data) < 15:
|
||||
rsi_period = settings.RSI_PERIOD # 기본값 14
|
||||
if len(chart_data) < rsi_period + 1:
|
||||
return {"signal": None, "description": "데이터 부족"}
|
||||
|
||||
prices = [float(item.get("stck_clpr", 0)) for item in chart_data[-15:]]
|
||||
prices = [float(item.get("stck_clpr", 0)) for item in chart_data[-(rsi_period+1):]]
|
||||
gains = []
|
||||
losses = []
|
||||
for i in range(1, len(prices)):
|
||||
@@ -173,8 +174,8 @@ def analyze_rsi(chart_data: list) -> dict:
|
||||
gains.append(0)
|
||||
losses.append(abs(change))
|
||||
|
||||
avg_gain = sum(gains[-14:]) / 14
|
||||
avg_loss = sum(losses[-14:]) / 14
|
||||
avg_gain = sum(gains[-rsi_period:]) / rsi_period
|
||||
avg_loss = sum(losses[-rsi_period:]) / rsi_period
|
||||
|
||||
if avg_loss == 0:
|
||||
rsi = 100
|
||||
@@ -182,8 +183,8 @@ def analyze_rsi(chart_data: list) -> dict:
|
||||
rs = avg_gain / avg_loss
|
||||
rsi = 100 - (100 / (1 + rs))
|
||||
|
||||
if len(chart_data) >= 16:
|
||||
prev_prices = [float(item.get("stck_clpr", 0)) for item in chart_data[-16:-1]]
|
||||
if len(chart_data) >= rsi_period + 2:
|
||||
prev_prices = [float(item.get("stck_clpr", 0)) for item in chart_data[-(rsi_period+2):-(1)]]
|
||||
prev_gains = []
|
||||
prev_losses = []
|
||||
for i in range(1, len(prev_prices)):
|
||||
@@ -195,8 +196,8 @@ def analyze_rsi(chart_data: list) -> dict:
|
||||
prev_gains.append(0)
|
||||
prev_losses.append(abs(change))
|
||||
|
||||
prev_avg_gain = sum(prev_gains[-14:]) / 14
|
||||
prev_avg_loss = sum(prev_losses[-14:]) / 14
|
||||
prev_avg_gain = sum(prev_gains[-rsi_period:]) / rsi_period
|
||||
prev_avg_loss = sum(prev_losses[-rsi_period:]) / rsi_period
|
||||
if prev_avg_loss == 0:
|
||||
rsi_prev = 100
|
||||
else:
|
||||
@@ -218,16 +219,18 @@ def analyze_rsi(chart_data: list) -> dict:
|
||||
|
||||
|
||||
def analyze_bollinger(chart_data: list) -> dict:
|
||||
if len(chart_data) < 20:
|
||||
bb_period = settings.BOLLINGER_PERIOD # 기본값 20
|
||||
bb_stddev = settings.BOLLINGER_STDDEV # 기본값 2.0
|
||||
if len(chart_data) < bb_period:
|
||||
return {"signal": None, "description": "데이터 부족"}
|
||||
|
||||
prices = [float(item.get("stck_clpr", 0)) for item in chart_data[-20:]]
|
||||
ma20 = sum(prices) / len(prices)
|
||||
variance = sum((p - ma20) ** 2 for p in prices) / len(prices)
|
||||
prices = [float(item.get("stck_clpr", 0)) for item in chart_data[-bb_period:]]
|
||||
ma_bb = sum(prices) / len(prices)
|
||||
variance = sum((p - ma_bb) ** 2 for p in prices) / len(prices)
|
||||
std_dev = variance ** 0.5
|
||||
|
||||
upper_band = ma20 + (2 * std_dev)
|
||||
lower_band = ma20 - (2 * std_dev)
|
||||
upper_band = ma_bb + (bb_stddev * std_dev)
|
||||
lower_band = ma_bb - (bb_stddev * std_dev)
|
||||
current_price = prices[-1]
|
||||
|
||||
if current_price < lower_band:
|
||||
@@ -239,13 +242,17 @@ def analyze_bollinger(chart_data: list) -> dict:
|
||||
|
||||
|
||||
def analyze_moving_average(chart_data: list) -> dict:
|
||||
if len(chart_data) < 60:
|
||||
ma_long = settings.MA_LONG_PERIOD # 기본값 60
|
||||
ma_short = settings.MA_MEDIUM_PERIOD # 기본값 20
|
||||
ma_quick = settings.MA_SHORT_PERIOD # 기본값 5
|
||||
|
||||
if len(chart_data) < ma_long:
|
||||
return {"signal": None, "description": "데이터 부족"}
|
||||
|
||||
prices = [float(item.get("stck_clpr", 0)) for item in chart_data[-60:]]
|
||||
ma5 = sum(prices[-5:]) / 5
|
||||
ma20 = sum(prices[-20:]) / 20
|
||||
ma60 = sum(prices[-60:]) / 60
|
||||
prices = [float(item.get("stck_clpr", 0)) for item in chart_data[-ma_long:]]
|
||||
ma5 = sum(prices[-ma_quick:]) / ma_quick
|
||||
ma20 = sum(prices[-ma_short:]) / ma_short
|
||||
ma60 = sum(prices[-ma_long:]) / ma_long
|
||||
current_price = prices[-1]
|
||||
|
||||
if ma5 > ma20 and current_price > ma5:
|
||||
|
||||
Reference in New Issue
Block a user