prev_calculated - 페이지 2

 
Alexey Kozitsyn :
그리고 0일 때 전체 지표를 다시 계산하면? 제 생각에는 최고의 솔루션입니다.
수많은 그래픽이 있는 무거운 지표의 경우 최고와는 거리가 멀습니다. 아니요, 솔루션은 간단합니다. prev_calculated 대신 정적 또는 전역 변수를 사용하십시오. 그래도 이건 목발인데 하나 더 태우고 싶었어
 
Alexey Kozitsyn :
:) 그게 내가하는 일입니다...
나는 그것을 이해했습니다. 방금 귀하의 질문을 인용했지만 실제로 Alexander Puzanov 에 답변했습니다. :)
 
Alexander Puzanov :
수많은 그래픽이 있는 무거운 지표의 경우 최고와는 거리가 멀습니다. 아니요, 솔루션은 간단합니다. prev_calculated 대신 정적 또는 전역 변수를 사용하십시오. 그래도 이건 목발인데 하나 더 태우고 싶었어

"목발"이라는 단어를 사용하는 사람:

  • 또는 문서 읽기에 게으르다
  • 또는 그것이 어떻게 맞아야 하는지 아직 모릅니다.
유일한 올바른 솔루션은 prev_calculate==0인 경우 표시기를 다시 계산하는 것입니다.

 
Alexander Puzanov :
수많은 그래픽이 있는 무거운 지표의 경우 최고와는 거리가 멀습니다. 아니요, 솔루션은 간단합니다. prev_calculated 대신 정적 또는 전역 변수를 사용하십시오. 그래도 이건 목발인데 하나 더 태우고 싶었어
절대 목발이 아닙니다. 그게 내가 하는 일이다 .
 
Karputov Vladimir :
기록이 펌핑 된 경우 건너 뛰거나 이전에 계산되지 않은 새 막대 가있을 수 있습니다. 즉, 표시기 판독 값이 이미 올바르지 않습니다.

슬라바 :

prev_calculated=0이면 전체 재계산이 수행되어야 함을 의미합니다. 이 경우 모든 표준 지표가 완전히 다시 계산됩니다.

모든 것이 분명하지만, 이것이 이것을 부정하는 것은 아닙니다.

알렉산더 푸자노프 :

모두 유용하지만 의도한 목적으로 사용할 수 없습니다. '이전 호출에서 처리된 막대 수'를 표시하기 위해 - prev_calculated는 허용되지 않습니다.

지표는 다르며, 일부는 계산에 막대가 전혀 필요하지 않고, 다른 일부는 라이브 틱만 필요하고, 다른 일부는 재계산 깊이에 제한이 있습니다. 그들은 역사에서 변경된 사항, 네 번째 트랙 그래픽 개체 등을 신경 쓰지 않습니다. prev_calculated에 첨부된 기록의 변경 사항을 추적하기 위한 추가 기능은 필요하지 않으며 '이전 호출에서 처리된 막대'만 필요합니다. 이것은 아니다

일반적으로 uv 프로그래머는 목수가 '이벤트 잡기'를 방해하지 마십시오.

 
Alexey Kozitsyn :
그리고 0일 때 전체 지표를 다시 계산하면? 제 생각에는 최고의 솔루션입니다.

이것이 최선의 해결책이라고 말하지는 않겠습니다. 어쨌든, 아직 최고는 아닙니다.

나는 계정에 현재 손실을 등록 하는 지표를 작성 하기로 결정했으므로 기록에서 아무 것도 다시 계산할 필요가 없습니다. 첫 번째 줄은 이렇게 생겼습니다.

if (prev_calculated == 0 )   return (rates_total);
그러나 시작한 후 버퍼가 비어 있지 않고 재설정되지 않는다는 것을 알았습니다. 어디에서나 온 버퍼에 약간의 대가가 있습니다. 강제로 버퍼를 0으로 만들어야 했습니다... 그리고 또 다른 문제가 발견되었습니다. 문제의 것은 prev_calculate가 재설정되고 표시기가 다시 계산되어 각각 마지막 막대까지 모든 버퍼를 재설정합니다. 일반적으로 지금까지 이 벤처를 포기했습니다.
 
Alexey Viktorov :

이것이 최선의 해결책이라고 말하지는 않겠습니다. 어쨌든, 아직 최고는 아닙니다.

나는 계정에 현재 손실을 등록 하는 지표를 작성 하기로 결정했으므로 기록에서 아무 것도 다시 계산할 필요가 없습니다. 첫 번째 줄은 이렇게 생겼습니다.

if (prev_calculated == 0 )   return (rates_total);
그러나 시작한 후 버퍼가 비어 있지 않고 재설정되지 않는다는 것을 알았습니다. 버퍼에서 어떤 가격은 아무데도 오지 않습니다. 강제로 버퍼를 0으로 만들어야 했습니다... 그리고 또 다른 문제가 발견되었습니다. 문제의 것은 prev_calculate가 재설정되고 표시기가 다시 계산되어 각각 마지막 막대까지 모든 버퍼를 재설정합니다. 일반적으로 지금까지 이 벤처를 포기했습니다.

"... 아무데도 없는 가격..."은 표시기 버퍼 배열의 UNINITIALIZED 요소의 쓰레기입니다. 수행하는 방법:

  • prev_calculate==0이면 루프에서 표시기 버퍼의 모든 요소를 살펴보고 값을 할당합니다. 동시에 새 막대가 나타날 때 상황을 모니터링해야 합니다(rates_total 빼기 prev_calculate는 0보다 큼). 이 경우 표시기 버퍼가 그에 따라 증가하고 이 새 요소도 초기화되어야 합니다.

 

전역 변수 를 사용하지 않고 일반 값에서 쓰레기를 제거하는 방법에 대한 더 나은 예를 제공하십시오.

문서를 인용하는 것은 모두 많습니다.


 

누구에게도 빚진 사람은 없습니다. 즉, 표시기 버퍼에서 바인딩 후 배열의 모든 요소를 직접 초기화할 때까지 쓰레기가 있습니다.

추가됨:

예제를 만들어보자...

//+------------------------------------------------------------------+
//|                                              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);
  }
//+------------------------------------------------------------------+
M1에서 실행하십시오. 가장 오른쪽 막대만 다시 계산되는 것을 볼 수 있습니다.
파일:
 
Karputov Vladimir :

누구에게도 빚진 사람은 없습니다. 즉, 표시기 버퍼에서 바인딩 후 배열의 모든 요소를 직접 초기화할 때까지 쓰레기가 있습니다.

추가됨:

예제를 만들어보자...

//+------------------------------------------------------------------+
//|                                              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);
  }
//+------------------------------------------------------------------+
M1에서 실행하십시오. 가장 오른쪽 막대만 다시 계산되는 것을 볼 수 있습니다.

엉뚱한 질문에 답하는 놀라운 능력...

이제 다음과 같은 경우 어떻게 되는지 설명하세요.

1. 다시 계산된 100개의 막대, 0에서 99까지의 버퍼에 입력(방향을 시계열로 간주) 값 1.03

2. 갑자기 히스토리가 로드되고 prev_calculated가 0이 됨

표시기는 어느 막대에서 값 1.03을 표시합니까???