레디스 및 구조 수정중

This commit is contained in:
2026-02-25 16:56:34 +09:00
parent 89f54bae55
commit ec02f27200
10 changed files with 428 additions and 131 deletions

View File

@@ -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: