Bitcoin favicon, more strategies, default timeframe 5m
- Add an SVG Bitcoin favicon and link it in index.html. - New indicators: macd() and roc(). - Five new strategies: macd_trend, bollinger_reversion, donchian_breakout, ema_cross, momentum (plus the existing sma_cross, rsi_reversion). - Default TIMEFRAME is now 5m (config, .env.example, compose, workflow, UI).
This commit is contained in:
1 parent
186a6949ee
commit
c500fb7572
18 files changed
+488
-11
No files matched your search
@@ -113,6 +113,44 @@ def rolling_std(values: Sequence[float], period: int) -> list[Number]:
|
||||
return out
|
||||
|
||||
|
||||
def macd(
|
||||
values: Sequence[float],
|
||||
fast: int = 12,
|
||||
slow: int = 26,
|
||||
signal: int = 9,
|
||||
) -> tuple[list[Number], list[Number], list[Number]]:
|
||||
"""Return (macd line, signal line, histogram), each aligned with ``values``."""
|
||||
ema_fast = ema(values, fast)
|
||||
ema_slow = ema(values, slow)
|
||||
macd_line: list[Number] = [
|
||||
(f - s) if f is not None and s is not None else None
|
||||
for f, s in zip(ema_fast, ema_slow, strict=True)
|
||||
]
|
||||
signal_line: list[Number] = [None] * len(values)
|
||||
start = next((i for i, value in enumerate(macd_line) if value is not None), None)
|
||||
if start is not None:
|
||||
valid = [value for value in macd_line[start:] if value is not None]
|
||||
for offset, value in enumerate(ema(valid, signal)):
|
||||
signal_line[start + offset] = value
|
||||
histogram: list[Number] = [
|
||||
(m - s) if m is not None and s is not None else None
|
||||
for m, s in zip(macd_line, signal_line, strict=True)
|
||||
]
|
||||
return macd_line, signal_line, histogram
|
||||
|
||||
|
||||
def roc(values: Sequence[float], period: int = 10) -> list[Number]:
|
||||
"""Rate of change over ``period`` bars, as a fraction (0.02 = +2%)."""
|
||||
if period <= 0:
|
||||
raise ValueError("period must be positive")
|
||||
out: list[Number] = [None] * len(values)
|
||||
for i in range(period, len(values)):
|
||||
previous = values[i - period]
|
||||
if previous:
|
||||
out[i] = (values[i] - previous) / previous
|
||||
return out
|
||||
|
||||
|
||||
def last(series: Sequence[Number]) -> Number:
|
||||
for value in reversed(series):
|
||||
if value is not None:
|
||||
|
||||
Reference in new issue
Block a user