| # SPDX-License-Identifier: LicenseRef-PolyForm-Noncommercial-1.0.0 (see LICENSE)
|
| """Python twin of Seq.mqh: the 9-13 setup and countdown in the variant of docs/SPEC.md, step for step, so the
|
| indicators' output can be compared bar by bar (tests/check_parity.py).
|
|
|
| from reference import run
|
| rows = run(high, low, close) # one dict per bar
|
| """
|
|
|
|
|
| def run(high, low, close):
|
| n = len(close)
|
| bcnt = scnt = 0
|
| bcd = scd = 0 # countdown counts; active flags below
|
| b_on = s_on = False
|
| b_c8 = s_c8 = 0.0
|
| b_lvl = s_lvl = None # level of the setup that started the active countdown
|
| rows = []
|
| for k in range(n):
|
| ev_setup = 0 # +1 buy 9, -1 sell 9
|
| perf = False
|
| ev_cd = 0 # +1 buy 13, -1 sell 13
|
| defer = 0
|
| bmark = smark = 0 # countdown number printed on this bar (0 none)
|
| if k >= 5:
|
| c = close
|
| if c[k] < c[k - 4]:
|
| if bcnt > 0:
|
| bcnt += 1
|
| elif c[k - 1] > c[k - 5]:
|
| bcnt = 1
|
| else:
|
| bcnt = 0
|
| if c[k] > c[k - 4]:
|
| if scnt > 0:
|
| scnt += 1
|
| elif c[k - 1] < c[k - 5]:
|
| scnt = 1
|
| else:
|
| scnt = 0
|
| if bcnt == 9:
|
| ev_setup = 1
|
| perf = min(low[k], low[k - 1]) <= min(low[k - 3], low[k - 2])
|
| res = max(high[k - 8:k + 1]) # the setup's resistance
|
| bcnt = 0
|
| s_on, scd = False, 0 # a buy setup cancels the sell countdown
|
| b_on, bcd, b_lvl = True, 0, res # and starts (or recycles) the buy countdown
|
| elif scnt == 9:
|
| ev_setup = -1
|
| perf = max(high[k], high[k - 1]) >= max(high[k - 3], high[k - 2])
|
| sup = min(low[k - 8:k + 1]) # the setup's support
|
| scnt = 0
|
| b_on, bcd = False, 0
|
| s_on, scd, s_lvl = True, 0, sup
|
| if k >= 2:
|
| if b_on and close[k] > b_lvl:
|
| b_on, bcd = False, 0 # closed above the setup's resistance: cancelled
|
| if s_on and close[k] < s_lvl:
|
| s_on, scd = False, 0
|
| if b_on and close[k] <= low[k - 2]:
|
| if bcd < 12:
|
| bcd += 1
|
| bmark = bcd
|
| if bcd == 8:
|
| b_c8 = close[k]
|
| elif low[k] <= b_c8:
|
| bcd, ev_cd, b_on, bmark = 13, 1, False, 13
|
| else:
|
| defer = 1
|
| if s_on and close[k] >= high[k - 2]:
|
| if scd < 12:
|
| scd += 1
|
| smark = scd
|
| if scd == 8:
|
| s_c8 = close[k]
|
| elif high[k] >= s_c8:
|
| scd, ev_cd, s_on, smark = 13, -1, False, 13
|
| else:
|
| defer = -1
|
| rows.append(dict(bcnt=bcnt if ev_setup != 1 else 9, scnt=scnt if ev_setup != -1 else 9,
|
| bcd=bcd if (b_on or ev_cd == 1) else 0, scd=scd if (s_on or ev_cd == -1) else 0,
|
| ev_setup=ev_setup, perf=perf, bmark=bmark, smark=smark, ev_cd=ev_cd, defer=defer))
|
| if ev_cd == 1:
|
| bcd = 0
|
| if ev_cd == -1:
|
| scd = 0
|
| return rows
|