지표가 리페인팅되는지 여부를 단순히 주장만 믿지 않고 직접 측정합니다. 이 도구는 차트에 연결되어, 이미 마감된 봉에 대해 테스트 대상 지표의 버퍼를 다시 읽어들이고, 그곳에서 감지되는 모든 변화를 집계합니다. 즉, 값이 이동하거나, 새로 나타나거나, 사라지는 경우를 모두 포함하며, 이러한 현상이 여전히 발생하는 가장 먼 과거 시점도 함께 기록합니다.

예시: XAUUSD M1 차트의 ZigZag(12,5,3). 이 패널은 실행 1시간 25분 12초 시점, 즉 중단되기 87초 전에 캡처되었기 때문에 아래 표의 합계 수치가 약간 더 높게 나타납니다. 스크린샷을 위해 패널 색상은 흰 바탕에 검은색으로 설정되었으며, 기본 설정은 어두운 패널에 밝은 색 텍스트입니다.
문제점
“리페인팅 없음”은 지표 설명에서 가장 자주 등장하는 주장이며, 확인하기 가장 어려운 부분이기도 합니다. 일반적인 테스트 방법은 차트를 보고 화살표가 있던 대략적인 위치를 기억한 뒤, 지표를 다시 불러와 다시 확인하는 것입니다. 하지만 이 테스트는 실제로 손실을 초래하는 두 가지 경우를 놓치게 됩니다.
첫 번째는 차트가 열려 있는 동안, 이미 한참 전에 마감된 막대의 값이 변경되는 경우입니다. 눈으로는 이를 포착하기 어렵습니다. 화살표가 몇 픽셀 정도 움직이거나, 사용자의 시선이 차트 오른쪽 가장자리에 쏠린 사이에 화살표가 사라지기 때문입니다.
두 번째는 지표가 활성화된 동안 정상적으로 작동하다가, 재로딩 후 다른 이력을 표시하는 경우인데, 이는 바로 시간대 변경, 터미널 재시작 또는 차트 새로 고침이 사용자에게 미치는 영향과 정확히 일치합니다.
두 경우 모두 측정 가능합니다. 필요한 것은 지표가 처음 데이터를 출력했을 때의 내용을 기록해 두고, 이후 지속적으로 확인하는 기능입니다.
측정 대상
샘플링 과정에서, 확인 간격보다 짧은 시간 동안만 존재하는 값은 누락될 수 있습니다. 이는 실제적인 한계이며, 이에 대한 측정 결과는 아래에서 설명합니다.
측정된 예시
아래의 모든 예시는 터미널에 기본으로 포함된 지표를 사용하므로 누구나 재현할 수 있습니다.
실시간, XAUUSD M1, 1시간 26분
동일한 터미널과 동일한 피드의 4개 차트에 4개의 인스턴스를 실행, 2026.09.30 서버 시간 02:19부터 03:46까지, 300개의 마감된 바를 관찰, 초당 1회 확인.
| 테스트 대상 지표 | 버퍼 | 비교 | 변경된 사항 | 출현 | 사라짐 | MaxShift | 결론 |
|---|---|---|---|---|---|---|---|
| 예시\지그재그 (12,5,3) | 0 | 1 315 713 | 0 | 0 | 17 | 15 | 재도색 |
| 예제\지그재그 (12,5,3) | 1 | 1 315 713 | 0 | 0 | 3 | 1 | 재도색 |
| 예제\지그재그 (12,5,3) | 2 | 1 315 713 | 0 | 0 | 10 | 3 | 재그리기 |
| 예시\사용자 정의 이동 평균 (13,0,2) | 0 | 1 305 513 | 0 | 0 | 0 | - | STABLE |
| 예시\프랙탈, 확인 지연 | 0 | 1 303 713 | 0 | 13 | 0 | 3 | 재도색 |
| 예시\프랙탈, 늦은 확인 | 1 | 1 303 713 | 0 | 12 | 0 | 3 | 재그리기 |
각각 4387, 4353, 4347건의 검사가 수행되었으며, 0 / 0 / 1건의 검사가 건너뛰어졌고, 0건의 재동기화, 0건의 핸들 재로딩이 발생했습니다. 이벤트 파일에는 30, 0, 25개의 행이 포함되어 있으며, 이는 각 경우의 세 이벤트 열의 합계와 일치합니다.
비교 횟수는 정수 값이 아니며, 그럴 필요도 없습니다. 실행 중에 87개의 새로운 M1 막대가 열렸으며, 막대가 막 열린 상태에서는 아직 마감된 막대의 이력이 없기 때문입니다. 각 사례에 대해 (검증 횟수 - 1) × 300 - 87을 계산하면 보고된 비교 횟수와 정확히 일치합니다.
하나의 테이블에 나타나는 세 가지 다른 특징:
전략 테스터, 10초 동안의 동일한 측정값
예시\ZigZag(12,5,3), XAUUSD M1, 2026.09.28 ~ 2026.09.29, 1분 OHLC 모델링, 300개의 종가 봉차 관찰:
| 카운터 | 값 |
|---|---|
| 판정 | 재그리기 |
| 검증 | 5 512 |
| 종료된 막대 그래프에 대한 비교 | 1,651,923 |
| 변경됨 / 나타남 / 사라짐 | 0 / 3 / 342 |
| 값을 잃은 고유 막대 수 | 341 |
| 이벤트가 하나 이상 발생한 고유 막대 수 | 343 |
| MaxShift | 28 |
| 건너뛴 검사/재동기화 횟수 | 0 / 0 |
| CSV 행 수 | 345 (= 342 + 3) |
한 거래일 동안 ZigZag는 당시 이미 마감된 봉에 대해 이미 게시했던 342개의 값을 삭제했으며, 그 중 한 건은 해당 봉이 마감된 지 28봉 후에 발생했습니다. 이미 마감된 바에 세 개의 값이 나타났습니다. 이 세 개 중 단 하나만이 다시 나타난 값이었습니다: 17:06 바에서 4126.184를 잃었고, 20초 후에 정확히 같은 수치를 되찾았으며, 그로부터 1분 후에 다시 잃었습니다. 이것이 바로 해당 실행에서 Max |delta| 값이 0.00000000으로 표시되는 이유이기도 합니다. 이는 측정값이지 갭이 아닙니다.

해당 날짜의 345개 이벤트는 감지된 시프트별로 분류된 것입니다. 대부분의 재그리딩은 한두 바 전에서 발생하므로, 마지막 마감된 바만 확인하는 것만으로는 충분하지 않습니다.

예시\Custom Moving Average(13,0,2), 위의 ZigZag과 동일한 종목 및 실행 창: 스크린샷 촬영 시점에 1,291,114회의 비교가 이루어졌으나 변경된 값은 단 하나도 없습니다. 비교 횟수는 의도적으로 판정 결과 옆에 표시됩니다 — ‘STABLE’의 가치는 바로 그 옆에 적힌 숫자만큼만 의미가 있습니다.
"0.0을 값 없음으로 처리" 옵션이 무엇을 변경하는지, 그리고 샘플링 간격이 얼마나 큰지
네 번째 복제본은 해당 스위치를 끄고 동일한 지그재그를 실행했으므로, 0.0은 일반 값으로 간주됩니다: 1,308,513회의 비교, 18 + 3 + 11 = 32건의 이벤트, 모두 ‘변경됨(Changed)’ 상태, 동일한 MaxShift 15, 메인 버퍼에서 Max |delta| 4184.08800000을 기록했습니다. 이 수치는 ‘변경’이 피크가 0.0으로 대체되는 것을 의미하므로 핵심 지표입니다. 두 설정 모두 동일한 재그리기 현상을 설명하지만, 기본 설정은 이를 올바르게 명명합니다.
두 복사본은 정확히 동일한 목록을 확인하지 못했으며, 이는 알아둘 가치가 있습니다. 네 번째 복사본은 첫 번째 복사본이 놓친 두 가지 이벤트를 기록했습니다: 버퍼 0과 2의 03:32:00 바가 03:33:01에 감지된 것입니다. 두 복사본은 14초 간격으로 시작되었으며, 해당 값은 하나의 확인 간격보다 짧은 시간 동안만 존재했기 때문에, 한 쪽은 이를 샘플링했지만 다른 쪽은 그렇지 못했습니다. M1에서 1초 간격으로 설정되어 있다면, 이것이 바로 해당 계측기의 분해능입니다.

0.0으로 읽힌 동일한 ZigZag 값도 값으로 집계되었습니다. 이제 모든 삭제 건은 가격 크기의 델타를 가진 ‘변경됨(Changed)’으로 표시됩니다. 교차 확인용으로는 유용하지만, 설명용으로는 오해의 소지가 있습니다.
수치 감사
카운터 값도 무비판적으로 신뢰하지는 않았습니다. 터미널에서 가져온 원시 캔들 데이터를 대상으로 Examples\ZigZag를 Python으로 독립적으로 재구현한 후, 이를 이벤트 파일과 비교했습니다:
입력 데이터
| 입력 | 기본값 | 설명 |
|---|---|---|
| 검사할 지표 (iCustom 경로, .ex5 제외; 예: Examples\ZigZag) | 비어 있음 | MQL5\Indicators를 기준으로 한 사용자 정의 지표의 경로로, 확장자를 제외하고 iCustom이 기대하는 형식과 정확히 일치해야 합니다. 의도적으로 비워둔 경우: 아무것도 입력하지 않으면 도구는 저널과 패널에 해당 사실을 표시하고, 터미널에 없을 수도 있는 지표를 가리키는 대신 아무것도 측정하지 않습니다. 실전 차트에서 경로가 잘못된 경우 도구는 연결된 상태를 유지하며 30초마다 재시도하므로, 도구를 제거하지 않고도 입력을 수정할 수 있습니다. 잘못된 경로로 XAUUSD M1 차트에서 측정해 본 결과: 도구는 오류 코드를 한 번 표시했고, 터미널은 시도할 때마다(30.4초 및 30.7초 간격) 자체적으로 “로드할 수 없음” 메시지를 추가했으며, 경로를 수정하자 도구를 분리하지 않은 채 측정이 시작되었습니다. |
| 매개변수, 쉼표로 구분 (비어 있음 = 지표 기본값) | 비어 있음 | 테스트 대상 지표의 입력 목록입니다(예: 12,5,3). 각 항목은 내용에 따라 유형이 지정됩니다. true 및 false는 bool이 되고, 소수점이나 지수가 포함된 숫자는 double이 되며, 일반 숫자는 int가 되고, 그 외의 모든 것은 string이 되며, 앞뒤 따옴표는 제거됩니다. 구문 분석된 목록은 시작 시 저널에 출력되므로, 잘못된 목록은 즉시 확인할 수 있습니다. 비워두면 지표가 자체 기본값으로 실행됩니다. |
| 감시할 버퍼 수 (1..32) | 1 | 읽어들이는 버퍼의 수입니다. 계산용 버퍼도 포함됩니다. 지표에 없는 버퍼가 있으면 전체 검사가 실패합니다. 이는 건너뛴 검사로 간주되며, 처음 몇 번의 발생 건은 오류 코드와 함께 저널에 기록되므로, 오류가 발생해도 조용히 넘어가지 않고 바로 확인할 수 있습니다. |
| 심볼 (비어 있음 = 차트 심볼) | 비어 있음 | 차트를 열지 않고 다른 종목의 지표를 검사합니다. |
| 시간대 | 현재 | 다른 시간대의 지표를 확인합니다. |
| 관찰 대상 종가 봉 (시프트 1..N) | 300 | 검증 깊이. 바 수에 버퍼를 곱한 값은 200,000 슬롯으로 제한되며, 이를 초과할 경우 깊이가 축소되고 저널에 한 줄이 기록됩니다. |
| 검증 간 최소 초 수, 테스터 내 모델링된 시간 (0 = 매 틱마다) | 1 | 스로틀. 1초 간격은 사람이 반응할 수 있는 모든 화면 갱신을 포착하며, 매 틱마다 처리하는 것보다 CPU 사용량이 훨씬 적지만, 이 간격보다 짧은 시간 동안 존재하는 값은 놓칠 수 있습니다. 전략 테스터에서는 실제 시계 대신 모델링된 시계가 사용되므로, 동일한 설정이 적용됩니다. |
| 이보다 작은 |변경|은 무시(0 = 모든 변경 사항 카운트) | 0.0 | 부동 소수점 값을 기반으로 재계산되며 마지막 자릿수에 미세한 변동이 발생하는 지표에 대한, 버퍼 단위의 절대 허용 오차. 0은 모든 차이를 카운트합니다. 허용 오차보다 크지 않은 변화는 전혀 기록되지 않습니다 — 이벤트도, CSV 행도, Max |delta|에 대한 기여도도 없습니다. |
| 0.0을 “값 없음”으로 처리(화살표/ZigZag 스타일 버퍼) | true | 많은 신호 지표는 “신호 없음”을 나타낼 때 EMPTY_VALUE 대신 0.0을 출력합니다. 이 옵션을 켜면 0.0이 빈 값으로 간주되며, 해당 이벤트는 ‘출현(Appeared)’ 및 ‘소멸(Vanished)’로 보고됩니다. 정확히 0이 유효한 값인 버퍼의 경우 이 옵션을 끄십시오. |
| N분마다 지표 핸들을 재생성합니다(0 = 절대 안 함) | 0 | 핸들을 해제하고 터미널에 새로운 핸들을 요청합니다. 이때 다른 프로그램이 동일한 매개변수를 가진 동일한 지표를 여전히 보유하고 있지 않은 한, 전체 재계산이 트리거됩니다. 기록된 이력은 지워지지 않으므로, 이 기능을 통해 실행 중에는 안정적이지만 재로딩 후에는 달라지는 지표를 포착할 수 있습니다. |
| N분 후 측정 중지 (0 = 제거될 때까지 실행) | 0 | 측정을 종료하고 보고서를 고정합니다. 이는 무인 실행 시 유용합니다. |
| 모든 이벤트를 MQL5\Files에 기록(CSV) | true | 이벤트 파일. |
| CSV 파일 이름 (비워두면 자동) | 비어 있음 | 자동 이름은 심볼, 시간대 및 시작 시간을 기반으로 생성됩니다. 같은 분에 다른 복사본이 시작되어 해당 이름의 파일이 현재 열려 있는 경우, 파일이 전혀 없는 상태로 복사본이 실행되는 대신 숫자 접미사가 추가됩니다. 같은 분에 실행된 이전 실행에서 동일한 이름의 닫힌 파일은 덮어쓰기되므로, 실행 결과가 중요한 경우에는 직접 이름을 지정하십시오. |
| 이 행 수 이후에는 쓰기를 중지합니다 | 100000 | 매 틱마다 다시 그려지는 지표에 대비하십시오. 제한을 초과해도 카운팅은 계속되며, 파일 크기만 더 이상 증가하지 않을 뿐이고, 저널에 한 줄로 그 사실이 기록됩니다. |
| 차트에 보고서 패널 표시 | true | 무인 실행이나 테스터 실행 시 이 기능을 비활성화하십시오. |
| 패널 X 거리, 96 dpi 기준 픽셀 | 12 | 위치. 패널은 화면 dpi에 따라 크기가 조정됩니다. |
| 패널 Y 거리, 96 dpi 기준 픽셀 수 | 20 | 위치. |
| 글꼴 크기, 포인트 (4 이상; 패널은 화면 DPI에 따라 크기가 조정됩니다) | 9 | 이 패널은 고정폭 글꼴로 된 표입니다. 고해상도 화면이나 차트가 작은 경우 크기를 줄이십시오. 위의 스크린샷은 4를 사용했습니다. |
| 패널 모서리 | 왼쪽 상단 | 고정 모서리. |
| 패널 배경색 | 짙은 회색 | 패널 색상. 다른 Expert Advisor와 마찬가지로 차트당 하나의 인스턴스가 생성되며, 여러 차트에서 동시에 인스턴스를 실행할 수 있습니다. |
| 패널 테두리 색상 | 옅은 회색 | |
| 패널 텍스트 색상 | 밝은 회색 | |
| 모든 버퍼가 안정 상태일 때의 헤더 색상 | 라임 그린 | |
| 버퍼가 다시 그려질 때의 헤더 색상 | 토마토색 |
보고서
이것은 위에서 실행 중이던 실시간 ZigZag가 중지되었을 때 도구가 저널에 출력한 요약 블록을 그대로 복사한 것입니다. 차트의 패널에는 실행 시간이 오른쪽 정렬된 동일한 표가 표시됩니다:
=== 리페인팅 인스펙터 요약 ===================================== 리페인팅 인스펙터 Examples\ZigZag (12,5,3) XAUUSD M1 300개의 마감된 막대 관측 실행 중 01:26:39 검증 4,387 건너뜀 0 재동기화 0 재로드 처리 0 버퍼 판정 비교 횟수 변경됨 나타남 사라짐 최대 이동량 최대 |델타| 0 재그리기 1 315 713 0 0 17 15 - 1 재그리기 1 315 713 0 0 3 1 - 2 REPAINTS 1 315 713 0 0 10 3 - CSV: RepaintInspector_XAUUSD_M1_20260930_0219.csv (30행) 서버 시간 기준 2026.09.30 02:19:31에 시작, 4387회 검사, 0회 건너뛰기, 0회 재동기화, 0회 핸들 재로드 이벤트 총 30개, CSV 행 30개 버퍼 0: REPAINTS, 비교 횟수 1315713, 변경 0, 새로 나타남 0, 사라짐 17, 영향을 받은 막대 17 버퍼 0: 최대 이동량 15 (2026.09.30 02:59 바에서 사라짐) 버퍼 0: 최대 |델타| 없음 버퍼 0: 첫 번째 이벤트 2026.09.30 02:23:02, 마지막 이벤트 2026.09.30 03:46:03
MQL5\Files에 있는 이벤트 파일은 이벤트당 한 행을 포함합니다:
detect_time;bar_time;shift_at_detect;buffer;event;old_value;new_value;delta;drift_from_first;after_reload 2026.09.28 17:11:20;2026.09.28 17:06:00;5;0;VANISHED;4126.18400000;EMPTY;;;0
빈 값은 EMPTY로 기록되며, 정의되지 않은 차이는 공백으로 남겨지므로, 독자가 누락된 숫자를 0으로 오해할 일이 없습니다. 두 번째 파일인 <name>_summary.csv는 버퍼당 한 행을 포함하며, 모든 카운터와 지표, 매개변수, 심볼, 시간대 및 깊이를 담고 있으며, 실행 중에는 15초마다 갱신되므로 로그를 파싱하지 않고도 이벤트 파일에서 수치를 재계산할 수 있습니다. 저널은 도구를 제거할 때 시작 블록, 처음 20개의 이벤트 전체 내용, 그리고 위의 요약 정보를 가져옵니다.
사용 방법
명확히 밝힌 한계
MetaQuotes Ltd에서 영어로 번역함.
원본 코드: https://www.mql5.com/en/code/77842
ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city
스탑이 어디에 위치해 있을 가능성이 높은지, 그리고 어떤 스탑이 방금 발동되었는지를 보여줍니다. 유동성 풀 = 가격이 아직 돌파하지 않은 확인된 스윙 고점과 저점, 동일한 고점/저점(더 큰 풀), 그리고 전날의 고점과 저점입니다. 봉이 풀을 넘어 거래되면 ‘스윕(swept)’으로 표시되며, 같은 봉이 다시 풀 내부로 마감되면 ‘잡혔다가 거부됨(grabbed & rejected)’으로 표시됩니다. 리페인팅 없음: 스윙은 양쪽에서 N개의 마감된 봉이 지난 후에만 사용됩니다. 이 패널은 CCanvas에 그려진 네온 도시입니다: 가격은 하늘을 나는 자동차, 매도 스탑은 그 아래의 타워, 매수 스탑은 그 위의 떠 있는 플랫폼, 어제의 수준은 황금색 광고판, 탐조등이 하늘을 비추고, 티커에는 오늘의 성과가 표시됩니다. 두 개의 버퍼는 전문가 자문가(Expert Advisor)에서 사용할 수 있도록 상하방에서 가장 가까운 활성 풀을 제공합니다. 지표 전용: 절대 매매를 수행하지 않습니다.
SessionEdgeTester - does a time-of-day rule beat spread and swap?
Tests "buy at hour X, exit Y hours later" on your broker's own history after spread, commission and swap, with an out-of-sample split, weekday/year breakdown and an all-hours baseline.
AlertKit, one alert per event and bar, no alert spam
A small include class that stops indicator alerts from firing on every tick. One alert per event and bar, silent about history on start, popup, push, email or sound, and an optional log of every decision. Comes with a working range break indicator as an example
Rolling VWAP Deviation Regime Filter
A regime-classification oscillator that measures how far, and how persistently, price deviates from a rolling volume-weighted VWAP in standard-deviation units, separating trending conditions from ranging ones.