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

 
Алексей Тарабанов :

당신은 무엇을 두려워합니까? 유용한 일을 함께 합시다.

Stanislav는 KB에 매우 유용한 스크립트를 게시 했습니다. mq? 파일 및 리소스가 포함된 MQL 작업으로 아카이브를 쉽게 생성합니다.

수백 개의 mqh 파일이 있는 EA가 있습니다. 이제 스크립트의 도움으로 어드바이저를 소스 코드로 쉽게 전송하고 버전을 제어하고 다른 사람과 공유할 수 있습니다.

MQL5 Program Packer
MQL5 Program Packer
  • www.mql5.com
This script allows you to assemble a zip-file of your MQL5-program with all dependencies automatically. The dependencies are: included source files via #include directive (both modes of absolute () and relative ("") references are supported); icons linked by #property icon directive; resources (images, sounds, and other types) embedded by...
 
이 주제와 관련이 없는 댓글은 " MQL4 및 MQL5에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 "으로 이동되었습니다.
 
Vladislav Andruschenko :
고맙습니다. 차트의 이벤트에 대한 옵션을 분석하고 확인하려고합니다.

지점을 살펴보세요. 최근에 문제를 자세히 정리했습니다. - https://www.mql5.com/en/forum/327888

EventChartCustom => indicator is too slow
EventChartCustom => indicator is too slow
  • 2019.12.06
  • www.mql5.com
Использую в советнике для получения тиков с других инструментов "индикатор-шпион": Периодически в журнале появляются записи "indicator is too slow...
 
Anton Shpilyuk:

2 ) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы)

 это так?

"시간 복사율로 막대 색인 가져오기" 주제에 대해

끔찍해, 정말! 지표 자체가 M5 기간에 작동하지만 작업은 지표에 M1 기간의 막대를 가져오는 것이었습니다.

1. OnCalculate()에서 필요한 시간 프레임을 초기화하여 표시기가 시작되기 전에 로드되도록 해야 했습니다(초기화 후 FirstStartFlag 플래그 = false;). 표시기에서 로드되지 않은 경우 -1을 제공하거나 완전히 로드되지 않았으므로 로드된 양을 확인하고 충분하지 않은 경우 시작 반환 ( 0 )으로 이동합니다.

배열 MqlRates 비율 선언[]; 처음에 cnt_bars* 5 ; - M1의 M5 막대 수를 다시 계산합니다.

 //--- загрузка данных М1 таймфрейма для поминутной экспирации в оптимизаторе   
   if (FirstStartFlag) 
      {
         int count = cnt_bars* 5 ;
         int copied= CopyRates ( _Symbol , PERIOD_M1 , 0 ,count,rates);
         if (copied> 0 ) 
            {
               if (debug) Print ( "Скопировано баров: " + IntegerToString (copied)+ ", надо было " + IntegerToString (count)); 
               if (copied<count)
                  {
                       Print ( "Не удалось получить достаточно исторических данных, ждем" );
                       return ( 0 );
                  }
                
            }
         else   
            {
               Print ( "Не удалось получить исторические данные, ждем" );
               return ( 0 );
            } 
         ArraySetAsSeries (rates, true );  
      }

그런 다음 원하는 함수의 본문에서 계산하는 동안 매번 M1 에 대한 기록 데이터를 업데이트합니다 .

 //--- загрузка актуальных данных М1 таймфрейма для поминутной экспирации в оптимизаторе    
   int count = cnt_bars* 5 ;
   copied= CopyRates ( _Symbol , PERIOD_M1 , 0 ,count,rates);
   if (copied> 0 ) 
      {
         Print ( "cnt_Statist() Скопировано баров: " + IntegerToString (copied)+ ", надо было " + IntegerToString (count)); 
         if (copied<count)
            {
                 Print ( "cnt_Statist() Не удалось получить достаточно исторических данных" );
            }
          
      }
   else   
      {
         Print ( "cnt_Statist() Не удалось получить исторические данные" ); 
      } 
   ArraySetAsSeries (rates, true );  

다음으로, M5 막대 반복 루프에서 해당 M1 막대의 인덱스에 대한 중첩 검색 루프를 만듭니다. time[s] - 타임프레임의 현재 처리된 M5 막대 :

                           for (h=copied- 1 ;h> 0 ;h--)
                              {
                                 if (rates[h].time == time[s])
                                    {
                                       IndexRates = h;
                                       break ;
                                    }
                              }

음, 그런 다음 이 인덱스를 사용하여 M1 막대에 필요한 데이터를 찾습니다. 제 경우에는 rate[IndexRates-5].time 및 Rates[IndexRates-k-4].close입니다.

이 중첩 루프는 막대를 빠르게 반복합니다. 90일 역사에서도. 그래서 ArrayBsearch 함수를 사용하여 이진 검색 유형별로 Rates[].time 배열에서 막대 인덱스를 검색할 수 있기를 원합니다.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
다음 줄에 대한 컴파일러 차이점은 무엇입니까?
 Print ( "123" "456" );
Print ( "123" + "456" );
Print ( "123" , "456" );
 
MQL은 천천히 사기를 떨어뜨리고 있습니다.
 #ifdef __cplusplus
     #include<iostream>
     #include<stdio.h>
#endif

class input_iterator_tag  {};
class output_iterator_tag {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};

struct MyIterator{
public :
   int index;
   class iterator_category : public random_access_iterator_tag{};
   
   MyIterator( int __index = 0 ):index(__index){}
   
   bool operator !=(MyIterator &it){
       return index != it.index;
   }
   
   int operator -(MyIterator &it){
       return index - it.index;
   };
   
   MyIterator operator ++(){
      index+= 1 ;
#ifdef __cplusplus
       return * this ;
#else
       return this ;
#endif 
   } 
};

template < typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, input_iterator_tag*){
     int __r= 0 ;
     for (; __first != __last; ++__first)
        ++__r;
     return __r;
}

template < typename _RandIter>
int __distance(_RandIter &__first, _RandIter &__last, forward_iterator_tag*){
     return __last - __first;
}


//+------------------------------------------------------------------+
//| MQL realization                                                  |
//+------------------------------------------------------------------+
#ifdef __MQL5__
// Bypass the bug (https://www.mql5.com/ru/forum/1111/page2648#comment_15015191)
template < typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, forward_iterator_tag* __category){
   return __distance(__first, __last, (input_iterator_tag*) __category);
};

template < typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, random_access_iterator_tag* __category){
   return __distance(__first, __last, (bidirectional_iterator_tag*) __category);
};


// Bypass Compilation ERROR: '_InputIter' - struct undefined    
template < typename T>
class GetStructType{
public :
   struct type : public T{};
};


template < typename _InputIter>
int distance_mql(_InputIter &__first, _InputIter &__last){
   //_InputIter::iterator_category category;                      //Compilation ERROR: '_InputIter' - struct undefined  
   GetStructType<_InputIter>::type::iterator_category category;
   GetStructType<_InputIter>::type::iterator_category* ptr = &category;
   
   // Bypass the bug (https://www.mql5.com/ru/forum/1111/page2648#comment_15015191)
   random_access_iterator_tag* ptr_ra = dynamic_cast <random_access_iterator_tag*>(ptr);
   if (ptr_ra != NULL ){
       return __distance(__first, __last, ptr_ra);
   };
   
   bidirectional_iterator_tag* ptr_bd = dynamic_cast <bidirectional_iterator_tag*>(ptr);
   if (ptr_bd != NULL ){
       return __distance(__first, __last, ptr_bd);
   };
   
   forward_iterator_tag* ptr_fw = dynamic_cast <forward_iterator_tag*>(ptr);
   if (ptr_fw != NULL ){
       return __distance(__first, __last, ptr_fw);
   };
   
   input_iterator_tag* ptr_in = dynamic_cast <input_iterator_tag*>(ptr);
   if (ptr_in != NULL ){
       return __distance(__first, __last, ptr_in);
   };
   
   //TODO RAISE EXCEPTION
   return - 1 ;
}

void OnStart (){
   MyIterator it1( 1 );
   MyIterator it2( 5 );
   printf ( "result:%d" , distance_mql(it1, it2));            
}
#endif 


//+------------------------------------------------------------------+
//|  C++ realization, online: https://onlinegdb.com/S1tcVt9XU 	     |
//+------------------------------------------------------------------+
#ifdef __cplusplus
template < typename _InputIter>
int distance_cplusplus(_InputIter &__first, _InputIter &__last){
     return __distance(__first, __last, ( typename _InputIter::iterator_category*)( NULL ));
}

int main(){
   MyIterator it1( 1 );
   MyIterator it2( 5 );
   printf ( "result:%d" , distance_cplusplus(it1, it2)); 
   
   return 0 ;
}
#endif 

버그 에 대한 간략한 요약:
클래스 상속이 있는 경우 A <= B <= C <= D
두 개의 오버로딩 함수가 구현됩니다. 예를 들어 하나는 매개변수 A*로, 다른 하나는 B*로,
그런 다음 MQL의 C* 또는 D* 개체를 이러한 함수에 전달하면 "모호 오버로드된 함수 호출" 컴파일 오류가 발생합니다.

질문: 이 바보 같은 버그에 대해 위에 제시된 것보다 더 정상적인 해결 방법이 있습니까?
 
다음 시트 보내기 "왜 MQL != C++"...
 
Сергей Таболин :
다음 시트 보내기 "왜 MQL != C++"...

문제의 본질을 이해하지 못했다면 왜 댓글을 달았습니까?

 
Sergey Dzyublik :

문제의 본질을 이해하지 못한다면 왜 댓글을 달까요?

왜냐하면 나는 오래전 에 그러한 설명을 위한 주제를 열었 기 때문입니다.

그리고 언어의 차이는 오류나 버그에 적용되지 않는다는 것!

MQL v C++. Что хотелось бы, чего нет, что не так, куда копать.
MQL v C++. Что хотелось бы, чего нет, что не так, куда копать.
  • 2019.08.02
  • www.mql5.com
Общую тему багов и вопросов просто уже снасильничали такими разборками. Предложил открыть специализированную ветку, никто не чешется...
 
Sergey Dzyublik :
MQL은 천천히 사기를 떨어뜨리고 있습니다.

버그 에 대한 간략한 요약:
클래스 상속이 있는 경우 A <= B <= C <= D
두 가지 기능이 구현됩니다. 예를 들어, 하나는 매개변수 A*에 대해, 두 번째는 B*에 대해,
그런 다음 MQL의 C* 또는 D* 개체를 이러한 함수에 전달하면 "모호 오버로드된 함수 호출" 컴파일 오류가 발생합니다.

질문: 이 바보 같은 버그에 대해 위에 제시된 것보다 더 정상적인 해결 방법이 있습니까?

글쎄, STL은 일대일로 이동하지 않습니다. 여기서 구체적인 사항을 자세히 살펴볼 필요가 있습니다. 가장 쉬운 방법은 기본 클래스나 인터페이스, 그리고 상속자(구현 또는 =delte)에서 추상 메서드를 사용하여 가능한 모든 기능을 작성하는 것입니다. 이 경우 동일한 기본 클래스 유형의 포인터 또는 참조가 메서드에 전달됩니다. 가상의 테이블 형태로 불가피한 악이 있는 것은 사실이지만, 신의 축복이 있기는 하지만 dynamic_cast를 통해 어디에도 값비싼 분기가 없도록 아키텍처를 구축하는 것이 바람직하다.