버퍼 레이아웃이 정확합니다: 2개의 플롯(히스토그램 데이터 + 색상 인덱스, 그리고 MA 선)에 3개의 버퍼가 할당되어 있습니다.
색상 목록은 클래식 Better Volume 팔레트와 일치합니다. 인덱스 0부터 5까지는 주석과 일치합니다.
IntTimesRange == IntMaxTimesRange와 같은 등식 검사는 여기서 안전합니다. 윈도우 최대값은 동일한 식으로 계산되므로, 현재 막대가 최대값일 때 double 값이 정확히 일치합니다.
prev_calculated - 1을 기준으로 재계산하면 형성 중인 바가 올바르게 업데이트됩니다.
버그, 가장 심각한 것부터 순서대로
1. 짧은 기간의 시계열에서 범위 초과로 인한 충돌(63~69행). ` ` 제한은 첫 번째 호출 시에만 클램핑됩니다. 예를 들어, 주간 또는 월간 차트에 50개의 바가 있고 `minbars`가 100이라고 가정해 봅시다. 첫 번째 호출에서는 루프를 건너뛰고 `rates_total`을 반환합니다. 다음 틱에서 `prev_calculated`는 50이므로 `limit`은 49가 됩니다. 그러면 MA 루프에서 `n = -1`로 인식하여 지표가 "배열 범위 초과" 오류로 종료됩니다. 수정 방법:
2. 클라이맥스 처른(Climax Churn, 마젠타색)이 하락 바에서 누락됩니다(116~121행). “Climax Sell” 블록이 “Climax Churn” 블록보다 나중에 실행되어 이를 덮어씁니다. 따라서 거래량-범위 클라이맥스이자 처른 바인 바는 종가가 중간점 이상일 때만 마젠타색으로 표시됩니다. 종가가 중간점 미만일 경우 일반 흰색으로 표시됩니다. 의도된 우선순위는 클라이맥스 처른이 다른 모든 것을 우선한다는 것입니다.
3. “추가 처른 확인”은 절대 실행되지 않습니다(123–125행). IntCandleRange > IntMiddlePrice * 2는 high - low > high + low로 전개되는데, 이는 low < 0일 때만 성립합니다. 일반적인 금융 상품의 경우 이 조건은 사멸 코드입니다. 의도된 바는 아마도 평균 범위나 이와 유사한 값과의 비교였을 것이므로, 단순히 수정하는 것보다 재정의가 필요합니다.
4. 하드코딩된 20은 InpLookBack을 무시합니다(105행). 다른 모든 부분은 InpLookBack을 사용하지만, 저거래량 테스트에서는 i - 19, 20을 사용합니다. 20 이외의 값을 사용하면 클래스 간 일관성이 깨집니다. InpLookBack이 20 이상으로 설정되어도, 저거래량 감지 기능은 여전히 20개의 바만 확인합니다.
5. 거래량이 0인 데이터는 오신호를 유발하며, 기본값은 함정입니다.
기본값은 VOLUME_REAL이며, 이는 대부분의 외환 및 CFD 종목에서 0입니다.
거래량이 모두 0인 경우, IntTimesRange (0) == IntMaxTimesRange (0) 및 IntDividedRange (0) == IntMaxDividedRange (0)이 모두 참이 됩니다. 차트는 클라이맥스 및 클라이맥스-처른 색상으로 채워집니다.
플래그를 > 0으로 제한하고, 기본값을 VOLUME_TICK으로 설정하십시오.
OnInit에서 입력 유효성 검사가 없습니다. InpMAPeriod <= 0은 0으로 나눈 값을 발생시킵니다. InpLookBack <= 0은 윈도우 로직을 깨뜨립니다. 이러한 경우 INIT_PARAMETERS_INCORRECT를 반환하십시오.
세부 사항
NormalizeDouble(..., 0)은 이동평균(MA)을 정수로 반올림하여, 거래량이 적은 종목에서 선이 왜곡됩니다. 이 함수는 필요하지 않습니다.
minbars 이전의 봉은 절대 기록되지 않으며, PLOT_DRAW_BEGIN이 설정되어 있지 않습니다. 초기 봉에 무의미한 데이터가 표시되지 않도록 이 값을 설정하고 버퍼를 초기화하십시오.
이동평균(MA)은 MAPeriod가 아닌 MAPeriod - 1에서 시작할 수 있습니다. 바마다 100개의 바를 다시 합산하는 대신 누적 합계를 사용하는 것도 더 빠를 것입니다.
반복되는 InpVolumeType == VOLUME_TICK ? ... : ... 삼항 연산자는 하나의 작은 보조 함수로 통합하면 더 깔끔해질 것입니다.
Claude가 수정하고 영어로 번역한 버전을 첨부합니다. (파일을 보려면 “토론으로 이동”을 클릭하세요)
MT5에 이 지표를 적용했지만 아무것도 표시되지 않습니다... 위로
이걸 클로드 소네 5.5에 입력했더니 다음과 같은 결과가 나왔습니다:
장점
버그, 가장 심각한 것부터 순서대로
1. 짧은 기간의 시계열에서 범위 초과로 인한 충돌(63~69행). `
` 제한은 첫 번째 호출 시에만 클램핑됩니다. 예를 들어, 주간 또는 월간 차트에 50개의 바가 있고 `minbars`가 100이라고 가정해 봅시다. 첫 번째 호출에서는 루프를 건너뛰고 `rates_total`을 반환합니다. 다음 틱에서 `prev_calculated`는 50이므로 `limit`은 49가 됩니다. 그러면 MA 루프에서 `n = -1`로 인식하여 지표가 "배열 범위 초과" 오류로 종료됩니다. 수정 방법:
if(rates_total <= minbars) return(0); limit = (prev_calculated == 0) ? minbars : MathMax(prev_calculated - 1, minbars);
2. 클라이맥스 처른(Climax Churn, 마젠타색)이 하락 바에서 누락됩니다(116~121행).
“Climax Sell” 블록이 “Climax Churn” 블록보다 나중에 실행되어 이를 덮어씁니다. 따라서 거래량-범위 클라이맥스이자 처른 바인 바는 종가가 중간점 이상일 때만 마젠타색으로 표시됩니다. 종가가 중간점 미만일 경우 일반 흰색으로 표시됩니다. 의도된 우선순위는 클라이맥스 처른이 다른 모든 것을 우선한다는 것입니다.
3. “추가 처른 확인”은 절대 실행되지 않습니다(123–125행).
IntCandleRange > IntMiddlePrice * 2는 high - low > high + low로 전개되는데, 이는 low < 0일 때만 성립합니다. 일반적인 금융 상품의 경우 이 조건은 사멸 코드입니다. 의도된 바는 아마도 평균 범위나 이와 유사한 값과의 비교였을 것이므로, 단순히 수정하는 것보다 재정의가 필요합니다.
4. 하드코딩된 20은 InpLookBack을 무시합니다(105행).
다른 모든 부분은 InpLookBack을 사용하지만, 저거래량 테스트에서는 i - 19, 20을 사용합니다. 20 이외의 값을 사용하면 클래스 간 일관성이 깨집니다. InpLookBack이 20 이상으로 설정되어도, 저거래량 감지 기능은 여전히 20개의 바만 확인합니다.
5. 거래량이 0인 데이터는 오신호를 유발하며, 기본값은 함정입니다.
OnInit에서 입력 유효성 검사가 없습니다.
InpMAPeriod <= 0은 0으로 나눈 값을 발생시킵니다. InpLookBack <= 0은 윈도우 로직을 깨뜨립니다. 이러한 경우 INIT_PARAMETERS_INCORRECT를 반환하십시오.
세부 사항
Claude가 수정하고 영어로 번역한 버전을 첨부합니다. (파일을 보려면 “토론으로 이동”을 클릭하세요)