gann-hilo-swing/tests/reference.py
Allan Niñal Allan Niñal b7c3d46695 Gann HiLo Swing: free MT5 and MT4 indicator source, Python reference, tests and README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 01:03:02 +08:00
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