Centaur_Quant_Architecture/00_CONCEPT/EXP003_RESULTS/diagnostic_pattern_density.py

39 lines
1.5 KiB
Python

# -*- coding: utf-8 -*-
import json
p = r'D:\TradingTerminal\MetaTrader 5\MQL5\Files\Temp\goose_mcp_response_MFPkgs.txt'
raw = open(p, 'rb').read().decode('utf-8')
i = raw.find('[')
depth = 0; j = i
for j in range(i, len(raw)):
if raw[j] == '[': depth += 1
elif raw[j] == ']':
depth -= 1
if depth == 0: break
bars = json.loads(raw[i:j+1])
rows = [(b['time'], float(b['open']), float(b['high']), float(b['low']), float(b['close'])) for b in bars]
rows.sort(key=lambda r: r[0])
print('bars:', len(rows), '| range:', rows[0][0], '->', rows[-1][0])
def count_patterns(rows, exp_min):
bull = bear = 0
idx_bull, idx_bear = [], []
for i in range(2, len(rows)):
_, o_i, h_i, l_i, c_i = rows[i]
_, o_im, h_im, l_im, c_im = rows[i-1]
_, o_im2, h_im2, l_im2, _ = rows[i-2]
ob_range = h_i - l_i
imp_range = h_im - l_im
if ob_range <= 0 or imp_range < exp_min * ob_range:
continue
if c_i < o_i and c_im > o_im and c_im > h_i and l_im2 > h_i:
bull += 1; idx_bull.append(rows[i][0])
if c_i > o_i and c_im < o_im and c_im < l_i and h_im2 < l_i:
bear += 1; idx_bear.append(rows[i][0])
return bull, bear, idx_bull, idx_bear
for em in (1.0, 1.2):
b, r_, ib, ir = count_patterns(rows, em)
print(f'exp>={em}: bull={b} bear={r_} total={b+r_} | density={(b+r_)/(len(rows)/96/21):.2f}/bulan (estimasi ~{len(rows)/96:.1f} hari)')
if em == 1.2 and b + r_ <= 20:
print(' contoh timestamps:', (ib + ir)[:10])