first commit
This commit is contained in:
60
app/engine/strategies/conditional.py
Normal file
60
app/engine/strategies/conditional.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from app.engine.strategies.base import BaseStrategy, Signal
|
||||
|
||||
|
||||
class ConditionalStrategy(BaseStrategy):
|
||||
"""조건부 지정가/시장가 전략"""
|
||||
|
||||
def evaluate(self, current_price: dict, price_history: list[dict], holding_qty: int) -> Signal:
|
||||
price = current_price.get("current_price", 0)
|
||||
if price <= 0:
|
||||
return Signal(action="hold", stock_code=self.stock_code)
|
||||
|
||||
buy_price = self.params.get("buy_price", 0)
|
||||
sell_price = self.params.get("sell_price", 0)
|
||||
change_rate_limit = self.params.get("change_rate_limit", 0)
|
||||
qty = self.params.get("qty", 1)
|
||||
|
||||
if change_rate_limit:
|
||||
change_rate = current_price.get("change_rate", 0)
|
||||
if change_rate <= -change_rate_limit and price > 0:
|
||||
return Signal(
|
||||
action="buy",
|
||||
stock_code=self.stock_code,
|
||||
qty=qty,
|
||||
price=price,
|
||||
reason=f"하락률 조건 충족: {change_rate:.2f}% <= -{change_rate_limit}%",
|
||||
confidence=min(abs(change_rate) / change_rate_limit, 1.0),
|
||||
)
|
||||
if change_rate >= change_rate_limit and holding_qty > 0:
|
||||
return Signal(
|
||||
action="sell",
|
||||
stock_code=self.stock_code,
|
||||
qty=min(qty, holding_qty),
|
||||
price=price,
|
||||
reason=f"상승률 조건 충족: {change_rate:.2f}% >= {change_rate_limit}%",
|
||||
confidence=min(abs(change_rate) / change_rate_limit, 1.0),
|
||||
)
|
||||
|
||||
if buy_price and price <= buy_price and holding_qty == 0:
|
||||
return Signal(
|
||||
action="buy",
|
||||
stock_code=self.stock_code,
|
||||
qty=qty,
|
||||
price=price,
|
||||
reason=f"매수 조건 충족: 현재가 {price} <= 목표가 {buy_price}",
|
||||
confidence=1.0,
|
||||
)
|
||||
|
||||
if sell_price and price >= sell_price and holding_qty > 0:
|
||||
return Signal(
|
||||
action="sell",
|
||||
stock_code=self.stock_code,
|
||||
qty=min(qty, holding_qty),
|
||||
price=price,
|
||||
reason=f"매도 조건 충족: 현재가 {price} >= 목표가 {sell_price}",
|
||||
confidence=1.0,
|
||||
)
|
||||
|
||||
return Signal(action="hold", stock_code=self.stock_code)
|
||||
Reference in New Issue
Block a user