80 lines
2.8 KiB
Python
# SPDX-License-Identifier: LicenseRef-PolyForm-Noncommercial-1.0.0 (see LICENSE)
| |||
"""Python twin of Gann.mqh (HiLo activator, 2-bar swing chart, pivots, new trends), operation for operation, for the
| |||
parity check (tests/check_parity.py).
| |||
| |||
from reference import run
| |||
rows, pivots = run(high, low, close, hilo=3, swing_confirm=True)
| |||
"""
| |||
| |||
| |||
def run(h, l, c, hilo=3, swing_confirm=True):
| |||
"""Per bar: line, trend, side, ev (+1/-1 new trend); pivots: list of (confirm_bar, pivot_bar, price, type)."""
| |||
n = len(c)
| |||
rows, pivots = [], []
| |||
hi_prev = lo_prev = None
| |||
trend = sd = side = 0
| |||
cur_min = cur_max = 0.0
| |||
cur_min_bar = cur_max_bar = 0
| |||
for k in range(n):
| |||
ev = 0
| |||
t = trend
| |||
if hi_prev is not None:
| |||
eps = 1e-9 * abs(c[k])
| |||
if c[k] - hi_prev > eps:
| |||
t = 1
| |||
elif lo_prev - c[k] > eps:
| |||
t = -1
| |||
trend = t
| |||
hi = lo = None
| |||
if k >= hilo - 1:
| |||
sh = sl = 0.0
| |||
for j in range(k - hilo + 1, k + 1):
| |||
sh += h[j]
| |||
sl += l[j]
| |||
hi, lo = sh / hilo, sl / hilo
| |||
line = lo if t > 0 else (hi if t < 0 else None)
| |||
hi_prev, lo_prev = hi, lo
| |||
if k == 0:
| |||
cur_min, cur_max, cur_min_bar, cur_max_bar = l[0], h[0], 0, 0
| |||
if k >= 2:
| |||
up = h[k] > h[k - 1] and h[k - 1] > h[k - 2]
| |||
dn = l[k] < l[k - 1] and l[k - 1] < l[k - 2]
| |||
nw = sd
| |||
if up and dn:
| |||
nw = 1 if c[k] > c[k - 1] else -1
| |||
elif up:
| |||
nw = 1
| |||
elif dn:
| |||
nw = -1
| |||
if nw != sd:
| |||
if nw == 1:
| |||
m, mb = cur_min, cur_min_bar
| |||
if l[k] < m:
| |||
m, mb = l[k], k
| |||
if sd != 0:
| |||
pivots.append((k, mb, m, -1))
| |||
cur_max, cur_max_bar = h[k], k
| |||
else:
| |||
m, mb = cur_max, cur_max_bar
| |||
if h[k] > m:
| |||
m, mb = h[k], k
| |||
if sd != 0:
| |||
pivots.append((k, mb, m, 1))
| |||
cur_min, cur_min_bar = l[k], k
| |||
sd = nw
| |||
else:
| |||
if l[k] < cur_min:
| |||
cur_min, cur_min_bar = l[k], k
| |||
if h[k] > cur_max:
| |||
cur_max, cur_max_bar = h[k], k
| |||
prev = side
| |||
if not swing_confirm:
| |||
side = t
| |||
elif t == 1 and sd == 1:
| |||
side = 1
| |||
elif t == -1 and sd == -1:
| |||
side = -1
| |||
if side != prev and side != 0 and k >= hilo + 2 and prev != 0:
| |||
ev = side
| |||
rows.append(dict(line=line, trend=t, side=side, sd=sd, ev=ev))
| |||
return rows, pivots
|