Karputov Vladimir : 기록이 펌핑 된 경우 건너 뛰거나 이전에 계산되지 않은 새 막대 가있을 수 있습니다. 즉, 표시기 판독 값이 이미 올바르지 않습니다.
슬라바 :
prev_calculated=0이면 전체 재계산이 수행되어야 함을 의미합니다. 이 경우 모든 표준 지표가 완전히 다시 계산됩니다.
모든 것이 분명하지만, 이것이 이것을 부정하는 것은 아닙니다.
알렉산더 푸자노프 :
모두 유용하지만 의도한 목적으로 사용할 수 없습니다. '이전 호출에서 처리된 막대 수'를 표시하기 위해 - prev_calculated는 허용되지 않습니다.
지표는 다르며, 일부는 계산에 막대가 전혀 필요하지 않고, 다른 일부는 라이브 틱만 필요하고, 다른 일부는 재계산 깊이에 제한이 있습니다. 그들은 역사에서 변경된 사항, 네 번째 트랙 그래픽 개체 등을 신경 쓰지 않습니다. prev_calculated에 첨부된 기록의 변경 사항을 추적하기 위한 추가 기능은 필요하지 않으며 '이전 호출에서 처리된 막대'만 필요합니다. 이것은 아니다
Alexey Kozitsyn : 그리고 0일 때 전체 지표를 다시 계산하면? 제 생각에는 최고의 솔루션입니다.
이것이 최선의 해결책이라고 말하지는 않겠습니다. 어쨌든, 아직 최고는 아닙니다.
나는 계정에 현재 손실을 등록 하는 지표를 작성 하기로 결정했으므로 기록에서 아무 것도 다시 계산할 필요가 없습니다. 첫 번째 줄은 이렇게 생겼습니다.
if (prev_calculated == 0 ) return (rates_total);
그러나 시작한 후 버퍼가 비어 있지 않고 재설정되지 않는다는 것을 알았습니다. 어디에서나 온 버퍼에 약간의 대가가 있습니다. 강제로 버퍼를 0으로 만들어야 했습니다... 그리고 또 다른 문제가 발견되었습니다. 문제의 것은 prev_calculate가 재설정되고 표시기가 다시 계산되어 각각 마지막 막대까지 모든 버퍼를 재설정합니다. 일반적으로 지금까지 이 벤처를 포기했습니다.
나는 계정에 현재 손실을 등록 하는 지표를 작성 하기로 결정했으므로 기록에서 아무 것도 다시 계산할 필요가 없습니다. 첫 번째 줄은 이렇게 생겼습니다.
if (prev_calculated == 0 ) return (rates_total);
그러나 시작한 후 버퍼가 비어 있지 않고 재설정되지 않는다는 것을 알았습니다. 버퍼에서 어떤 가격은 아무데도 오지 않습니다. 강제로 버퍼를 0으로 만들어야 했습니다... 그리고 또 다른 문제가 발견되었습니다. 문제의 것은 prev_calculate가 재설정되고 표시기가 다시 계산되어 각각 마지막 막대까지 모든 버퍼를 재설정합니다. 일반적으로 지금까지 이 벤처를 포기했습니다.
"... 아무데도 없는 가격..."은 표시기 버퍼 배열의 UNINITIALIZED 요소의 쓰레기입니다. 수행하는 방법:
prev_calculate==0이면 루프에서 표시기 버퍼의 모든 요소를 살펴보고 값을 할당합니다. 동시에 새 막대가 나타날 때 상황을 모니터링해야 합니다(rates_total 빼기 prev_calculate는 0보다 큼). 이 경우 표시기 버퍼가 그에 따라 증가하고 이 새 요소도 초기화되어야 합니다.
그리고 0일 때 전체 지표를 다시 계산하면? 제 생각에는 최고의 솔루션입니다.
:) 그게 내가하는 일입니다...
수많은 그래픽이 있는 무거운 지표의 경우 최고와는 거리가 멀습니다. 아니요, 솔루션은 간단합니다. prev_calculated 대신 정적 또는 전역 변수를 사용하십시오. 그래도 이건 목발인데 하나 더 태우고 싶었어
"목발"이라는 단어를 사용하는 사람:
수많은 그래픽이 있는 무거운 지표의 경우 최고와는 거리가 멀습니다. 아니요, 솔루션은 간단합니다. prev_calculated 대신 정적 또는 전역 변수를 사용하십시오. 그래도 이건 목발인데 하나 더 태우고 싶었어
기록이 펌핑 된 경우 건너 뛰거나 이전에 계산되지 않은 새 막대 가있을 수 있습니다. 즉, 표시기 판독 값이 이미 올바르지 않습니다.
prev_calculated=0이면 전체 재계산이 수행되어야 함을 의미합니다. 이 경우 모든 표준 지표가 완전히 다시 계산됩니다.
모든 것이 분명하지만, 이것이 이것을 부정하는 것은 아닙니다.
모두 유용하지만 의도한 목적으로 사용할 수 없습니다. '이전 호출에서 처리된 막대 수'를 표시하기 위해 - prev_calculated는 허용되지 않습니다.
지표는 다르며, 일부는 계산에 막대가 전혀 필요하지 않고, 다른 일부는 라이브 틱만 필요하고, 다른 일부는 재계산 깊이에 제한이 있습니다. 그들은 역사에서 변경된 사항, 네 번째 트랙 그래픽 개체 등을 신경 쓰지 않습니다. prev_calculated에 첨부된 기록의 변경 사항을 추적하기 위한 추가 기능은 필요하지 않으며 '이전 호출에서 처리된 막대'만 필요합니다. 이것은 아니다
일반적으로 uv 프로그래머는 목수가 '이벤트 잡기'를 방해하지 마십시오.
그리고 0일 때 전체 지표를 다시 계산하면? 제 생각에는 최고의 솔루션입니다.
이것이 최선의 해결책이라고 말하지는 않겠습니다. 어쨌든, 아직 최고는 아닙니다.
나는 계정에 현재 손실을 등록 하는 지표를 작성 하기로 결정했으므로 기록에서 아무 것도 다시 계산할 필요가 없습니다. 첫 번째 줄은 이렇게 생겼습니다.
이것이 최선의 해결책이라고 말하지는 않겠습니다. 어쨌든, 아직 최고는 아닙니다.
나는 계정에 현재 손실을 등록 하는 지표를 작성 하기로 결정했으므로 기록에서 아무 것도 다시 계산할 필요가 없습니다. 첫 번째 줄은 이렇게 생겼습니다.
"... 아무데도 없는 가격..."은 표시기 버퍼 배열의 UNINITIALIZED 요소의 쓰레기입니다. 수행하는 방법:
전역 변수 를 사용하지 않고 일반 값에서 쓰레기를 제거하는 방법에 대한 더 나은 예를 제공하십시오.
문서를 인용하는 것은 모두 많습니다.
누구에게도 빚진 사람은 없습니다. 즉, 표시기 버퍼에서 바인딩 후 배열의 모든 요소를 직접 초기화할 때까지 쓰레기가 있습니다.
추가됨:
예제를 만들어보자...
//| prev_calculated.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGray
#property indicator_label1 "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
SetIndexBuffer ( 0 ,ExtBuffer, INDICATOR_DATA );
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if (prev_calculated== 0 )
{
//--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
for ( int i= 0 ;i<rates_total;i++)
ExtBuffer[i]= 1.01 ;
return (rates_total);
}
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
int limit=rates_total-prev_calculated+ 1 ;
for ( int i=rates_total-limit;i<rates_total;i++)
{
//--- визуализация пересчёта самого правого бара
static bool drive= false ;
if (!drive)
ExtBuffer[i]= 1.03 ;
else
ExtBuffer[i]= 1.02 ;
drive=!drive;
}
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
누구에게도 빚진 사람은 없습니다. 즉, 표시기 버퍼에서 바인딩 후 배열의 모든 요소를 직접 초기화할 때까지 쓰레기가 있습니다.
추가됨:
예제를 만들어보자...
//| prev_calculated.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGray
#property indicator_label1 "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
SetIndexBuffer ( 0 ,ExtBuffer, INDICATOR_DATA );
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if (prev_calculated== 0 )
{
//--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
for ( int i= 0 ;i<rates_total;i++)
ExtBuffer[i]= 1.01 ;
return (rates_total);
}
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
int limit=rates_total-prev_calculated+ 1 ;
for ( int i=rates_total-limit;i<rates_total;i++)
{
//--- визуализация пересчёта самого правого бара
static bool drive= false ;
if (!drive)
ExtBuffer[i]= 1.03 ;
else
ExtBuffer[i]= 1.02 ;
drive=!drive;
}
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
엉뚱한 질문에 답하는 놀라운 능력...
이제 다음과 같은 경우 어떻게 되는지 설명하세요.
1. 다시 계산된 100개의 막대, 0에서 99까지의 버퍼에 입력(방향을 시계열로 간주) 값 1.03
2. 갑자기 히스토리가 로드되고 prev_calculated가 0이 됨
표시기는 어느 막대에서 값 1.03을 표시합니까???