prev_calculated - 페이지 6

 
너트로 다리미를 찌르지 마십시오.
 
Alexey Viktorov :
이것은 문서에 없습니다! 따라서 이들은 자유로운 주제에 대한 에세이입니다. 자동 초기화에 대한 내 진술뿐만 아니라 훨씬 더 시원합니다. 적어도 내 것은 경고와 함께 ...

문서에서 모든 것을 설명할 수는 없습니다.

"prev_calculate==0"을 얻었습니다. 이는 전체 표시기 버퍼 를 거쳐야 함을 의미합니다. "prev_calculate!=0"이 이 경우 가장 오른쪽 막대 또는 몇 개의 새로운 막대만 계산한다는 의미인 경우(사용 제한 ):

                 const int &spread[])
  {
//---
   if (prev_calculated== 0 )
     {
       Print ( "prev_calculated==0" );
             for ( int i= 0 ;i<rates_total;i++)
              {
               //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
      
              }
       return (rates_total);
     }
//--- экономный пересчёт только самого правого бара или новых баров
   int limit=rates_total-prev_calculated+ 1 ;

//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
   for ( int i=0;i<limit;i++)
     {
      ExtBuffer[i]=чевой-то там;
     }
 
Karputov Vladimir :

문서에서 모든 것을 설명할 수는 없습니다.

"prev_calculate==0"을 얻었습니다. 이는 전체 표시기 버퍼 를 거쳐야 함을 의미합니다. "prev_calculate!=0"이 이 경우 가장 오른쪽 막대 또는 몇 개의 새로운 막대만 계산한다는 의미인 경우(사용 제한 ):

                 const int &spread[])
  {
//---
   if (prev_calculated== 0 )
     {
       Print ( "prev_calculated==0" );
             for ( int i= 0 ;i<rates_total;i++)
              {
               //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
      
              }
       return (rates_total);
     }
//--- экономный пересчёт только самого правого бара или новых баров
   int limit=rates_total-prev_calculated+ 1 ;

//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
   for ( int i=0;i<limit;i++)
     {
      ExtBuffer[i]=чевой-то там;
     }




무엇을 의미 하는가??? 가장 오른쪽 막대 외에 다른 값은 필요하지 않습니다. 하지만 !!! 그러면 이 맨 오른쪽이 왼쪽으로 이동하면 거기에 넣은 이 데이터를 저장해야 합니다...

모든 버퍼를 작성할 필요는 없지만 내 바램을 고려하여 하나를 작성할 수 있습니다. 이것이 첫 번째 실행인 경우 전체 기록이 비어 있어야 합니다. 스와핑 히스토리의 결과로 prev_calculated 의 0이 발생하면 버퍼에 있던 모든 것이 변경되지 않은 상태로 유지되어야 합니다. 구멍이 있어도.

 
Karputov Vladimir :

예비 결론:

1. 표시기 에서는 OnInit()의 표시기 배열 초기화에 의존할 수 없습니다.

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
...
   ArrayInitialize (balance, 0.0 );     // принудительная
   ArrayInitialize (equityMax, 0.0 );   // инициализация
   ArrayInitialize (equityMaxB, 0.0 ); // всех
   ArrayInitialize (equityMin, 0.0 );   // буферов
   ArrayInitialize (equityMinB, 0.0 ); // индикатора

...
//---
   return ( INIT_SUCCEEDED );
  }

2. 표시기에서는 전체 배열을 통하거나 OnCalculate()에서 변경된 요소만 통과해야 합니다.

왜 헛소리를 합니까? 이러한 초기화가 OnCalculate에 입력되면 사이클 없이 쾅 소리와 함께 0으로 재설정됩니다. 하지만 prev_calculated가 리셋되면 작업 중에 누적된 모든 데이터가 리셋됩니다...
 
Alexey Viktorov :
왜 헛소리를 합니까? 이러한 초기화가 OnCalculate에 입력되면 사이클 없이 쾅 소리와 함께 0으로 재설정됩니다. 하지만 prev_calculated가 리셋되면 작업 중에 누적된 모든 데이터가 리셋됩니다...
표현을 선택해주세요. 그리고 표준 제공의 지표 예를 살펴보십시오. data directory\MQL5\Indicators\Examples\
 
Alexey Viktorov :

무엇을 의미 하는가??? 가장 오른쪽 막대 외에 다른 값은 필요하지 않습니다. 하지만 !!! 그러면 이 맨 오른쪽이 왼쪽으로 이동하면 거기에 넣은 이 데이터를 저장해야 합니다...

...

나는 이미 다음과 같은 방법을 제안했습니다.

여는 시간 에 의한 동기화이지만 여기에 뉘앙스가 있을 수 있습니다. 예를 들어 막대 여는 시간(파일에 저장)은 2016.09.05입니다. 25:02 , 그리고 이제 시간이 2016.09.05인 차트에 막대가 있습니다. 25:01.

지표는 데이터베이스나 저장소가 아닙니다.

따라서 표시기가 기록에 대해 계산할 수 없는 데이터를 표시하면 표시기 버퍼를 파일에 저장한 다음(이력 교환의 경우) 파일과 막대를 읽고 동기화하면 됩니다.
 
Karputov Vladimir :

나는 이미 다음과 같은 방법을 제안했습니다.

지표는 데이터베이스나 저장소가 아닙니다.

따라서 표시기가 기록에 대해 계산할 수 없는 데이터를 표시하면 표시기 버퍼를 파일에 저장한 다음(이력 교환의 경우) 파일과 막대를 읽고 동기화하면 됩니다.

알렉세이 빅토로프 :

... 파일에 쓰지 않는 것이 좋으며 GV에서는 더욱 그렇습니다.

prev_calculated
prev_calculated
  • www.mql5.com
Форум трейдеров MQL5.community
 

Vladimir, 이 주제를 prev_calculated의 전문가로 선정했으므로 이 특정 주제에 유용하도록 만드십시오. 먼저 이 변수로 인해 일반적으로 발생하는 문제를 식별해야 합니다. 이러한 문제에 익숙하지 않은 경우 공식화하겠습니다.

---

그리고 - 적어도 그것이 말하는 도움말에서

prev_calculated   // обработано баров на предыдущем вызове

당신은 이것을 위해 그것을 사용할 수 없습니다 - 그것은 언제든지 무화과를 보여줄 수 있습니다. 그 이유는 (도움말에 작성 + 개발자가 말한) 체크섬이 변경되면 일반적으로 기록 페이징으로 인해 변수가 0으로 재설정되기 때문입니다.

---

b - Prev_calculated == 0을 OnCalculate의 첫 번째 실행에 대한 플래그로 사용할 수 없습니다. 같은 이유로

---

c - 그리고 히스토리 페이징 플래그로 prev_calculated == 0도 사용할 수 없습니다.

---

사용자의 갈퀴 마모를 줄이려면 간단하고 명확하게 공식화하는 것이 바람직 합니다. 현재 OnCalculate 호출에서 히스토리 페이징이 발생하지 않은 경우 prev_calculated에는 이전 호출에서 처리된 막대 수가 포함됩니다. 발생하면 재설정됩니다.

---

나열된 3개의 플러그 모두 목발로 우회할 수 있습니다. 그러나 정의상 MT5에는 목발이 있을 수 없기 때문에 Vladimir인 당신은 이 3가지 작업에 대한 아름다운 솔루션을 생각해 냈을 것입니다. 다음과 같은 추악한 것:

#property indicator_chart_window
#property indicator_buffers    0
#property indicator_plots      0


struct BROWNIE {
   int    i_Prew_Calculated;   // кол-во посчитанных баров
   bool   b_First_Run;         // флаг первого запуска
   bool   b_History_Updated;   // флаг обновления истории
  
  BROWNIE() {
    i_Prew_Calculated = WRONG_VALUE ;
    b_First_Run = true ;
    b_History_Updated = false ;
  }
  
   void f_Reset( bool b_Reset_First_Run = true ) {
    i_Prew_Calculated = WRONG_VALUE ;
     if (b_Reset_First_Run) b_First_Run = true ;
    b_History_Updated = false ;
  }
  
   void f_Update( int i_New_Prew_Calculated = WRONG_VALUE ) {
     if (i_New_Prew_Calculated > - 1 ) {
      b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE ;
       if (b_First_Run) b_First_Run = false ;
      
       if (i_Prew_Calculated == WRONG_VALUE ) i_Prew_Calculated = i_New_Prew_Calculated;
       else if (i_New_Prew_Calculated > 0 ) i_Prew_Calculated = i_New_Prew_Calculated;
    }
  }
};
BROWNIE go_Brownie;


int OnInit ( void ) { return ( INIT_SUCCEEDED );}


void OnDeinit ( const int reason) {
  go_Brownie.f_Reset(reason != REASON_CHARTCHANGE );
}



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 &TickVolume[],
     const long & Volume [],
     const int &Spread[]
) {
   if (go_Brownie.b_First_Run) { /* обработка 1го запуска */ }
   if (go_Brownie.b_History_Updated) { /* обработка обновления истории */ }
  go_Brownie.f_Update(prev_calculated);
  
   return (rates_total);
}

면책 조항: 코드는 단순한 아이디어이며 차트에서 실행하지 않았습니다.

OnDeinit에는 샘플이 있습니다. 버퍼를 사용하지 않는 표시기에 대한 처리는 시간 프레임 및 기호에 대해 신경 쓰지 않으며, 시간 프레임/기호가 변경될 때마다 처음부터 모든 것을 시작할 필요가 없습니다. 예를 들어 기존 그래픽 요소와 함께 작동하고 계정 상태, 주문 등에 대한 정보를 표시합니다.

---

그런데

Karputov Vladimir :

그런 다음 표시기 버퍼를 파일에 저장한 다음(이력을 스와핑하는 경우) 파일과 막대를 읽고 동기화하는 것만 남습니다.

나사를 괴롭힐 필요가 없으며 차트의 그래픽 요소에 저장할 수 있습니다.
 
Alexey Viktorov :
... 파일에 쓰지 않는 것이 좋으며 GV에서는 더욱 그렇습니다.
아마도 이것이 당신에게 어울릴 것입니까?
 
Konstantin Gruzdev :
아마도 이것이 당신에게 어울릴 것입니까?

나는 세부 사항을 탐구하지 않았지만 이것은이 코드 줄로 해결됩니다. 인덱스 시프트를 사용하여 배열 자체를 복사합니다.

double arr[ 5 ];
ArrayCopy (arr, arr, 0 , 1 , 4 );
// и дальнейшее заполнение 4го индекса массива.
0부터 뒤집고 복사하고 첫 번째부터 붙여넣을 수 있습니다. 그런 다음 배열의 0 인덱스가 채워집니다. 그리고 이것은 완전히 다른 오페라에서 나온 것입니다 ...)))