# -*- 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])