Spread Profile by Hour
- 유틸리티
-
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself. - 버전: 1.0
Spread Profile by Hour는 사용 중인 브로커 자체의 틱 히스토리로부터 한 심볼의 스프레드 분포를 서버 기준 하루의 시간대별로 구성하여 24개의 막대로 그립니다. 막대의 진한 부분은 해당 시간대의 스프레드 중앙값이고, 더 밝은 윗부분은 90백분위수까지 이어집니다. 평소 사용하는 손절 폭을 입력하면 각 막대에 중앙값 스프레드가 그 손절 폭에서 차지하는 비율이 표시되므로, 비용을 리스크와 같은 단위로 볼 수 있습니다.
이 프로그램은 측정 도구입니다. 주문을 내지 않고, DLL과 WebRequest를 사용하지 않으며, 사용자가 켠 CSV 내보내기 외에는 어떤 파일도 쓰지 않습니다.
만든 이유: 데이 트레이딩과 스캘핑 규칙에서는 진입 신호가 아니라 스프레드가 우위의 생존 여부를 결정하는 경우가 많습니다. 터미널은 현재 순간의 스프레드를 보여주고, 바 히스토리는 바마다 스프레드 값 하나만 보관하므로 그 시간 안에서 무슨 일이 있었는지가 가려집니다. 같은 규칙이 조용한 시간대에는 통하다가 일일 롤오버나 세션 개장 시에는 단지 그때의 스프레드가 몇 배 넓다는 이유만으로 손실을 낼 수 있습니다. 이 지표는 호가 자체, 즉 CopyTicksRange를 통해 최근 N 달력일의 모든 매수·매도 호가 틱을 읽어 서버 시간 기준 시간대별로 묶습니다.
각 서버 시간대에 대해 계산하는 항목입니다. 기간은 오늘을 제외한 최근 N 달력일이므로, 거래하는 동안 결과가 바뀌지 않습니다:
- 패널에는 시간대별 포인트 단위 스프레드 중앙값과 90백분위수, CSV 내보내기에는 평균, 최대값, 각 시간대의 바탕이 된 호가 수.
- 두 가지 샘플링 모드. Tick count: 모든 호가를 한 번씩 셉니다. Time-weighted: 각 호가를 유효했던 시간만큼, 최대 60초까지 반영합니다. 틱 단위 집계는 빠른 시장을 과대 반영하는데, 빠른 시장은 스프레드가 넓은 경우가 많습니다. 시간 가중 방식은 그 시간대의 임의의 순간에 마주쳤을 스프레드가 얼마인지에 답합니다.
- 주중 하루에만 거래하는 규칙을 위한 월요일~금요일 요일 필터. 20 달력일에는 같은 요일이 두세 번밖에 없으므로, 이 필터를 쓸 때는 히스토리 깊이를 늘리십시오.
- 비용 보기: 포인트 단위 손절 폭을 입력하면 모든 막대에 중앙값 스프레드가 그 손절 폭에서 차지하는 백분율이 표시되고, 헤더에는 현재 시간대의 중앙값과 90백분위수가 같은 단위로 표시됩니다. 창이 너무 좁아 모든 막대에 라벨을 붙일 수 없으면 중앙값이 가장 높은 막대만 라벨을 유지합니다.
- 현재 시간대의 중앙값 스프레드를 1.00 랏당 계좌 통화 금액으로 표시하며, 심볼의 틱 가치와 틱 크기로 계산합니다.
- 헤더에는 중앙값 순위의 양 끝 시간대가 각각 최대 세 개까지 표시됩니다. 중앙값이 같은 시간대는 함께 나열되거나 "Cheapest: 23 hours at 6 pt"처럼 요약되므로, 같은 값이 순위처럼 제시되는 일은 없습니다. 모든 시간대의 중앙값이 같으면 헤더에 그렇게 표시됩니다.
- 현재 서버 시간대는 강조 표시되고, 실시간 스프레드는 막대들을 가로지르는 점선으로 그려집니다.
- 시간대별 표를 MQL5\Files\SpreadProfile_<symbol>_<yyyymmdd>.csv 파일에 UTF-8로 내보내는 선택적 CSV 내보내기로, 계산이 끝날 때마다 기록됩니다.
틱 히스토리를 다루는 방식입니다. 수치를 믿을 수 있는지는 이 부분에 달려 있습니다. 타이머 단계마다 하루치를 불러오고 곧바로 해제하므로, 하루 틱이 100,000개를 넘는 금이나 암호화폐에서도 차트가 원활하게 반응합니다. 터미널이 아직 다운로드 중인 날은 몇 초 동안 재시도하고, 틱이 그날의 M1 바를 모두 커버하지 못하는 날은 사용하기 전에 재시도합니다. 날짜는 가장 최근부터 과거 방향으로 읽습니다. 세 거래일 연속으로 틱이 반환되지 않거나(요일 필터 사용 시에는 해당 요일 세 번 연속), 열흘 연속으로 틱도 M1 바도 없으면, 잠시 후 그 날들을 한 번 더 읽고, 그래도 비어 있으면 불러오기를 중단하며 헤더에 실제로 사용된 가장 오래된 날의 날짜를 표시합니다. 브로커의 틱 저장소 안에 그만한 길이의 공백이 있어도 같은 방식으로 불러오기가 끝납니다. 헤더에는 부분 사용일(틱이 마지막 M1 바까지 이르지 못한 날)과 사용 불가일(M1 바는 있으나 틱이 없는 날)의 수도 표시됩니다. 틱 히스토리가 전혀 없는 심볼은 빈 패널을 그리는 대신 약 이십 초 안에 그 사실을 알립니다. 저널에는 계산마다 요약 한 줄(사용된 날 수, 읽은 틱 수, 채워진 시간대 수)이 기록되고, 내보내기가 켜져 있으면 CSV 파일 이름을 알리는 한 줄이 추가됩니다.
패널 읽는 법. 각 막대는 서버 시간 기준 하루 중 한 시간대입니다. 진한 부분은 중앙값입니다. 호가의 절반(Time-weighted 모드에서는 시간의 절반)이 이 값 이하의 스프레드를 가졌습니다. 더 밝은 윗부분은 90백분위수입니다. 호가 열 개 중 한 개는 이보다 넓었습니다. 다음은 스크린샷의 측정값으로, 데모 계좌에서 20 달력일(그중 17일에 틱이 있음) 동안 측정했습니다:
- EURUSD, Tick count 모드, 50포인트 손절: 24개 시간대 중 23개에서 중앙값이 6포인트입니다. 일일 롤오버인 서버 시간 21:00에는 34포인트이며 90백분위수는 58입니다. 하루 대부분은 손절 폭의 12퍼센트, 그 한 시간에는 68퍼센트입니다.
- GBPUSD, Time-weighted 모드, 손절 폭 미입력: 23개 시간대에서 7포인트, 21:00에는 중앙값 46, 90백분위수 94. Tick count 모드에서는 같은 시간대가 54와 100으로 나타나는데, 스프레드가 넓은 롤오버 전후에 호가가 몰리기 때문입니다.
- XAUUSD, Tick count 모드, 1500포인트 손절: 데이터가 있는 모든 시간대에서 중앙값이 182포인트로, 손절 폭의 12퍼센트이자 1.00 랏당 18.20 USD입니다. 따라서 헤더는 같은 값을 순위로 매기는 대신 그 사실을 표시합니다. 21:00의 일일 휴장 시간은 틱 수가 최소 틱 수보다 적어 대시로 표시됩니다.
실제 용도는 시간대에 대한 결정입니다. 시스템이 중앙값 스프레드가 손절 폭의 큰 비중을 차지하는 시간대에 거래한다면, 그 시간대를 건너뛰거나, 손절 폭을 넓히거나, 예상 움직임이 그 비용을 감당하는지 확인하십시오. 90백분위수는 나쁘지만 드물지 않은 체결이 어떤 모습인지 보여줍니다.
독립 검증. 시간대별 통계를 같은 원시 틱으로부터 별도의 Python 구현으로 다시 계산했습니다. 두 샘플링 모드 모두에서 모든 시간대의 중앙값, 90백분위수, 평균, 최대값, 틱 수가 일치했습니다. 예를 들어 틱 10,692개의 EURUSD 20:00과 틱 8,097개의 21:00, 그리고 두 모드의 GBPUSD 21:00입니다. 같은 컴퓨터에서의 로드 테스트: XAUUSD 20일치 4.29백만 틱을 1~3초에, 월요일만 필터링한 60일치 2.60백만 틱을 1.3초에, EURUSD 365일치(틱이 있는 232일, 9.37백만 틱)를 약 30초에 처리했으며, 마지막 경우는 틱 히스토리가 시작되기 이전 날들을 한 번 더 읽는 시간을 포함합니다. 실제 소요 시간은 브로커의 틱 밀도와 틱이 이미 디스크에 있는지에 따라 달라집니다.
입력값: 달력일 기준 히스토리 깊이(1~365, 기본값 20), 샘플링 모드, 요일 필터, 오버플로 구간이 있는 포인트 단위 히스토그램 범위, 시간대를 표시하기 위한 최소 틱 수, 포인트 단위 손절 폭(0이면 백분율 라벨이 꺼짐), 창 높이, 일곱 가지 색상(그중 네 가지는 None으로 두면 자동으로 정해짐: 배경은 차트에서, 텍스트와 격자는 그 배경에서, 90백분위수 윗부분은 막대 색상에서), 글꼴 크기, CSV 스위치. 모든 입력값은 터미널에서 각자의 주석으로 설명되어 있습니다.
참고 및 한계. 틱 히스토리 깊이는 브로커와 터미널이 이미 다운로드한 내용에 따라 달라집니다. 긴 깊이로 맨 처음 실행하면 터미널이 아직 틱을 다운로드하는 중일 수 있습니다. 아직 수신 중인 날은 몇 초 동안 재시도한 뒤 부분 사용일로 쓰이거나 건너뛰므로, 불러오기가 일찍 멈추면 다운로드가 끝난 뒤 지표를 다시 부착하십시오. 두 번째 실행은 디스크에서 읽습니다. 모든 시간은 서버 시간이므로 롤오버 같은 이벤트는 서머타임과 표준시 사이에 서버 시간으로 한 시간 이동할 수 있으며, 전환 시점을 포함하는 기간에서는 그 이벤트가 이웃한 두 시간대에 나뉘어 나타납니다. 데모 계좌와 실계좌, 그리고 스탠다드, 로우, 제로 계좌 유형은 같은 심볼이라도 스프레드가 크게 다를 수 있으므로, 실제로 거래하는 계좌에서 측정하십시오. 스프레드 히스토리는 미래 스프레드를 예측하지 않습니다. 뉴스, 휴일, 얇은 유동성은 여기 표시된 90백분위수를 훨씬 웃도는 스프레드를 만들 수 있습니다. 랏당 비용은 현재 틱 가치를 사용하며, 크로스 통화쌍에서는 틱 가치가 환율에 따라 변합니다. 프로필은 새 서버일마다 한 번, 그리고 입력값, 심볼 또는 타임프레임이 바뀔 때마다 다시 계산됩니다. 지표는 별도의 창에서 열리며, 한 차트에서 여러 사본을 각자의 창에서 실행할 수 있습니다.
