first commit

This commit is contained in:
2026-08-07 16:08:34 +08:00
commit e0b5228008
51 changed files with 5175 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
"""MACD 金叉死叉策略。"""
from __future__ import annotations
import pandas as pd
from ...indicators import macd
from ..broker import PaperBroker
from .base import Strategy
class MACDCrossStrategy(Strategy):
def __init__(self, fast: float = 12, slow: float = 26, signal: float = 9):
self.fast = int(fast)
self.slow = int(slow)
self.signal = int(signal)
self._ind: pd.DataFrame | None = None
self._prev_dif: float | None = None
self._prev_dea: float | None = None
def compute(self, close: pd.Series, high: pd.Series, low: pd.Series) -> pd.DataFrame:
self._ind = macd(close, self.fast, self.slow, self.signal)
return self._ind
def on_bar(self, i: int, row: pd.Series, broker: PaperBroker) -> None:
dif = float(self._ind["macd"].iloc[i])
dea = float(self._ind["signal"].iloc[i])
if self._prev_dif is None:
self._prev_dif, self._prev_dea = dif, dea
return
golden = self._prev_dif <= self._prev_dea and dif > dea # 金叉
death = self._prev_dif >= self._prev_dea and dif < dea # 死叉
price = float(row["close"])
ts = row["ts"]
if golden and pd.notna(dif):
broker.buy_max(ts, price)
elif death and broker.position > 0 and pd.notna(dif):
broker.sell_all(ts, price)
self._prev_dif, self._prev_dea = dif, dea