오류, 버그, 질문 - 페이지 12

 

밤에 한 가지 매우 이상한 점을 발견했습니다. 막대의 시작 시간이 오류로 처리됩니다. 오류는 1분 이상이었습니다. 이제 확인하기로 결정하고 테스트 지표를 만들었습니다.

 #property indicator_chart_window
datetime old_time= 0 ;
int      MaxBars= 10 ;    // ограничение 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()  { return ( 0 );}
//+------------------------------------------------------------------+
//| 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 (rates_total< 10 ) return ( 0 );  // ничего не считаем и ничего не рисуем на графике         
   
   int      start_pos,   // точка старта
            count_tick;
   MqlDateTime str1,str2;
   

   if (prev_calculated== 0 ) 
      {
      old_time= 0 ;
      count_tick= 0 ;
      start_pos=rates_total- 3 ;
      }
   else start_pos=prev_calculated- 1 ;
//--- расчет 
   for ( int i=start_pos;i<rates_total;i++)
     {
      TimeToStruct ( TimeCurrent (),str1); // время сервера
      TimeToStruct (time[i],      str2); // время бара  
      if (str1.min!=str2.min) {
      // Сбой - тик принадлежит не своему бару
         count_tick++;
         Print ( "тик №=" ,count_tick, " i=" , i, " c=" ,close[i], " time[i]=" ,time[i], " time=" , TimeCurrent (), " delta=" ,str1.sec);
      }   
      } // end for(...
   return (rates_total);
  }
통나무

2010.06.18 10:42:03   prov_tick (EURUSD,M1)       #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59   prov_tick (EURUSD,M1)       눈금 #=5 ​i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01   prov_tick (EURUSD,M1)       #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03   prov_tick (EURUSD,M1)       #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30   prov_tick (EURUSD,M1)       #=2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30   prov_tick (EURUSD,M1)       #=1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

처음 두 틱은 명확합니다. 이것은 지표의 시작입니다. 그리고 다음은... 서버 시간에 따라 새로운 바가 오랫동안 진행되고 있으며이 틱은 이전 바에 속해 있음이 밝혀졌습니다. 밤에이 델타는 일반적으로 악몽입니다 ...

개발자에게 질문이 버그입니까? 아니면 의도한 대로였습니까?

Z.Y. 이것을 로그에 쓰는 동안

2010.06.18 10:45:09   prov_tick (EURUSD,M1)       눈금 #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12 delta=12

파일:
prov_tick.mq5  2 kb
 
Prival :

밤에 한 가지 매우 이상한 점을 발견했습니다. 막대의 시작 시간이 오류로 처리됩니다. 오류는 1분 이상이었습니다. 이제 확인하기로 결정하고 테스트 지표를 만들었습니다.


rate_total 값을 출력에 추가하면 현재 분과 이전 막대의 분을 비교할 때 오류가 발생하는 것을 볼 수 있습니다.

 2010.06 . 18 11 : 53 : 18     prov_tick_src (EURUSD,M1)       тик №= 4 i= 51420 rates_total= 51422 c= 1.23997 time[i]= 2010.06 . 18 09 : 51 : 00 time= 2010.06 . 18 09 : 52 : 06 delta= 6
2010.06 . 18 11 : 52 : 12     prov_tick_src (EURUSD,M1)       тик №= 3 i= 51419 rates_total= 51421 c= 1.24061 time[i]= 2010.06 . 18 09 : 50 : 00 time= 2010.06 . 18 09 : 51 : 00 delta= 0

즉, 시간[rate_total-2]입니다.

또한 델타의 출력이 완전히 명확하지 않습니다.

https://www.mql5.com/ru/docs/basis/function/events#oncalculate 말한다:

open[], high[], low[] 및 close[] 매개변수에는 현재 기간의 시가, 고가, 저가 및 종가가 포함된 배열이 포함됩니다. time[] 매개변수에는 개장 시간 값 이 있는 배열이 포함되고, spread[] 매개변수에는 스프레드 기록이 포함된 배열이 포함됩니다(이 거래 상품에 대해 스프레드가 제공되는 경우). volume[] 및 tick_volume[] 매개변수에는 각각 거래 내역 및 틱 볼륨이 포함됩니다.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Prival :

밤에 한 가지 매우 이상한 점을 발견했습니다. 막대의 시작 시간이 오류로 처리됩니다. 오류는 1분 이상이었습니다. 이제 확인하기로 결정하고 테스트 지표를 만들었습니다.

통나무

2010.06.18 10:42:03    prov_tick (EURUSD,M1)        #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59    prov_tick (EURUSD,M1)        눈금 #=5 ​i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01    prov_tick (EURUSD,M1)        #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03    prov_tick (EURUSD,M1)        #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30    prov_tick (EURUSD,M1)        #=2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30    prov_tick (EURUSD,M1)        #=1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

처음 두 틱은 명확합니다. 이것은 지표의 시작입니다. 그리고 다음은... 서버 시간에 따라 오랜 시간 동안 새로운 바가 진행되고 있었고, 이 틱은 기존 바에 속해 있는 것으로 나타났습니다. 밤에이 델타는 일반적으로 악몽입니다 ...

개발자에게 질문이 버그입니까? 아니면 의도한 대로였습니까?

Z.Y. 이것을 로그에 쓰는 동안

2010.06.18 10:45:09    prov_tick (EURUSD,M1)        눈금 #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12 delta=12

다음과 같이 확인해보세요. 주기가 없습니다.

       TimeToStruct ( TimeCurrent (),      str1); // время сервера
       TimeToStruct (time[ rates_total- 1 ],str2); // время последнего бара  

본문에서 더.

 
stringo :

다음과 같이 확인해보세요. 주기가 없습니다.

본문에서 더.

알았어. 감사하다. 나는 루프 내부를 확인했다

   if (old_time<time[i]) 
         {
         Print ( "НОВЫЙ бар" );
         old_time=time[i];
         //...
         }  
// а нужно вот так
   if (old_time<time[rates_total- 1 ]) // работаем только по завершенным барам
         {
         Print ( "НОВЫЙ бар" );
         old_time=time[rates_total- 1 ];
         //...
         } 

새로운 바 등장 당시 나는 변하지 않았다. 경제적이지 않고 동일한 데이터가 다시 계산됩니다. 하지만...

https://book.mql4.com/ru/samples/icustom fig.119가 MQL5에서 제외되는 상황이 아니라면? 그리고 그러한 지표 템플릿은 항상 정확한 마감을 제공할 것입니까? 아니면 함정이 있습니까?

 input int   MaxBars= 240 ;
datetime old_time= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()  { return ( 0 );}
//+------------------------------------------------------------------+
//| 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 ) 
      {
      //... расчитать историю
      //...
      old_time=time[rates_total- 1 ];
      }
// работаем только по завершенным барам
   if (old_time<time[rates_total- 1 ]) 
      {
      old_time=time[rates_total- 1 ];
      Print ( "НОВЫЙ бар close[1]=", close[rates_total- 2 ]);
      }  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
Z.Y. 과학에 감사합니다
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294 :
나는 또한 테스터와 함께 일종의 악마 같은 일이 일어나고 있습니다. 나는 고문을 시작하기 시작했습니다. 테스터에서 전체 터미널이 충돌하고 차트에 던지면 모든 것이 정상입니다. 다른 Expert Advisors는 테스터에서 정상적으로 작동합니다.

약 110개의 매개변수(즉, 질문)를 보증으로 소화할 수 있음이 실험적으로 얻어지고 입증되었습니다. 120에서 테스터에 EA가 지정되면 터미널이 충돌합니다.


이미 PM에서 몇 가지 솔루션을 제공했지만, 이 질문으로 개발자에게 문의할 수도 있습니다. 나는 그들이이 한계를 극복하는 데 도움이되어야한다고 생각합니다 ...

 
Interesting :

약 110개의 매개변수(즉, 질문)를 보증으로 소화할 수 있음이 실험적으로 얻어지고 입증되었습니다. 120에서 테스터에 EA가 지정되면 터미널이 충돌합니다.


이미 PM에서 몇 가지 솔루션을 제공했지만, 이 질문으로 개발자에게 문의할 수도 있습니다. 나는 그들이이 한계를 극복하는 데 도움이되어야한다고 생각합니다 ...

물론 그러한 제한이 테스터에게 영향을 미친다는 것은 이상한 일입니다. 넷째, 예를 들어 그러한 문제가 없습니다.
 

주말 견적은 현재 실행되지 않습니다. 나는 스크립트를 실행

인쇄( 시간 현재() );

결과

2010.06.20 00:26:06 00 (USDJPY,M1) 2010.06.18 22:35:52

마지막 바는 시간이 있어도 2010.06.18 23:00:00

이상하게도 일부 기능의 올바른 작동을 테스트하는 것은 매우 불편합니다.

 

표시기 설정 창에 "적용" 버튼이 없습니다.


 
Interesting :

약 110개의 매개변수(즉, 질문)를 보증으로 소화할 수 있음이 실험적으로 얻어지고 입증되었습니다. 120에서 테스터에 EA가 지정되면 터미널이 충돌합니다.

이미 PM에서 몇 가지 솔루션을 제공했지만, 이 질문으로 개발자에게 문의할 수도 있습니다. 나는 그들이이 한계를 극복하는 데 도움이되어야한다고 생각합니다 ...

최대 64개의 매개변수를 최적화할 수 있습니다.
 
stringo :
최대 64개의 매개변수를 최적화할 수 있습니다.
최적화 64 및 테스터에서 약 110 을 사용합니다(최적화 없음). 물론 110은 그 자체로 Expert Advisor에 대한 "악몽"의 매개변수이지만(하지만 실제로 발생합니다)...