Add trend MACD spot strategy
This commit is contained in:
@@ -15,6 +15,7 @@ def add_indicators(candles: list[Candle]) -> list[Candle]:
|
||||
ema200 = _ema(closes, 200)
|
||||
rsi14 = _rsi(closes, 14)
|
||||
atr14 = _atr(highs, lows, closes, 14)
|
||||
macd, macd_signal, macd_hist = _macd(closes)
|
||||
volume_ma20 = _sma(volumes, 20)
|
||||
for index, candle in enumerate(candles):
|
||||
candle.ema_20 = ema20[index]
|
||||
@@ -22,6 +23,9 @@ def add_indicators(candles: list[Candle]) -> list[Candle]:
|
||||
candle.ema_200 = ema200[index]
|
||||
candle.rsi_14 = rsi14[index]
|
||||
candle.atr_14 = atr14[index]
|
||||
candle.macd = macd[index]
|
||||
candle.macd_signal = macd_signal[index]
|
||||
candle.macd_hist = macd_hist[index]
|
||||
candle.volume_ma_20 = volume_ma20[index]
|
||||
return candles
|
||||
|
||||
@@ -104,3 +108,33 @@ def _atr(highs: list[float], lows: list[float], closes: list[float], period: int
|
||||
atr = ((atr * (period - 1)) + true_ranges[index]) / period
|
||||
result[index] = atr
|
||||
return result
|
||||
|
||||
|
||||
def _macd(
|
||||
closes: list[float],
|
||||
fast_period: int = 12,
|
||||
slow_period: int = 26,
|
||||
signal_period: int = 9,
|
||||
) -> tuple[list[float | None], list[float | None], list[float | None]]:
|
||||
ema_fast = _ema(closes, fast_period)
|
||||
ema_slow = _ema(closes, slow_period)
|
||||
macd_line: list[float | None] = []
|
||||
compact_macd: list[float] = []
|
||||
compact_indexes: list[int] = []
|
||||
for index, (fast, slow) in enumerate(zip(ema_fast, ema_slow)):
|
||||
value = None if fast is None or slow is None else fast - slow
|
||||
macd_line.append(value)
|
||||
if value is not None:
|
||||
compact_macd.append(value)
|
||||
compact_indexes.append(index)
|
||||
|
||||
signal_line: list[float | None] = [None] * len(closes)
|
||||
hist: list[float | None] = [None] * len(closes)
|
||||
compact_signal = _ema(compact_macd, signal_period)
|
||||
for compact_index, original_index in enumerate(compact_indexes):
|
||||
signal = compact_signal[compact_index]
|
||||
macd_value = macd_line[original_index]
|
||||
signal_line[original_index] = signal
|
||||
if macd_value is not None and signal is not None:
|
||||
hist[original_index] = macd_value - signal
|
||||
return macd_line, signal_line, hist
|
||||
|
||||
Reference in New Issue
Block a user