Errores, fallos, preguntas - página 2652

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

¿Por qué te peleas? ¿Por qué no hacemos algo útil juntos?

Stanislav publicó un script fantásticamente útil en KB. Crea fácilmente archivos con archivos MQL y recursos.

Tengo un EA con cientos de archivos mqh. Usando el script ahora puedo transferir fácilmente mi EA al código fuente, controlar las versiones y compartir con otros.

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...
 
Los comentarios no relacionados con este tema han sido trasladados a "Cualquier pregunta de los novatos en MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos".
 
Vladislav Andruschenko:
Gracias. Intentaré desglosarlo y comprobar las opciones con los eventos del gráfico.

Echa un vistazo al hilo, recientemente se trató el tema en detalle -https://www.mql5.com/ru/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) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы)

 это так?

Sobre el tema de "obtener el índice de barras por tiempo copiado"

¡Horror, realmente lo es! La tarea consistía en obtener las barras del marco temporal M1 en el indicador, aunque el propio indicador funciona en el marco temporal M5.

1. tuvimos que inicializar el marco temporal deseado en OnCalculate() para cargarlo antes del inicio del indicador (después de la inicialización el FirstStartFlag = false;). Recuerda que en los indicadores, si no está cargado, dará -1 o no está completamente cargado, por lo que comprobamos cuánto está cargado, si no es suficiente, vamos al principio dereturn(0);

declarar la matriz MqlRates rates[]; al principio, dondecnt_bars*5; - recalcular el número de barras M5 en M1

//--- загрузка данных М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);  
      }

Después, actualizamos los datos históricos de M1 en el cuerpo de la función requerida cada vez que realizamos cálculos:

//--- загрузка актуальных данных М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);  

Además, en el bucle de barras M5, hacemos un bucle incrustado de búsqueda del índice de la barra M1 correspondiente,siendo time[s] la barra M5 actual del marco temporal que se está procesando:

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

Y luego usamos este índice para encontrar los datos necesarios de la barra M1, en mi caso son rates[IndexRates-5].time y rates[IndexRates-k-4].close

Menos mal que este bucle anidado recorre las barras rápidamente, incluso en un historial de 90 días. Pero me gustaría poder buscar índices de barras en el array rates[].time como una búsqueda binaria utilizando la función ArrayBsearch

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
¿Cuáles son las diferencias para el compilador de las siguientes líneas?
Print("123" "456");
Print("123" + "456");
Print("123", "456");
 
Los MQLs se desmoralizan poco a poco:
#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 

Breve resumen del fallo:
Cuando hay herencia de clases A <= B <= C <= D
y se implementan dos funciones de sobrecarga, por ejemplo, una con el parámetro A* y otra con el parámetro B*,
Cuando se pasa un objeto C* o D* a una función de este tipo, el MQL provoca un error de compilación "llamada ambigua a una función sobrecargada".

Pregunta: ¿Existe una solución más sensata para este error idiota que la presentada anteriormente?
 
Aquí vamos con más hojas de "Por qué MQL != C++"...
 
Сергей Таболин:
Aquí vamos con más "Por qué MQL != C++"...

¿Por qué comentar algo si no se ha llegado al fondo del asunto?

 
Sergey Dzyublik:

¿Por qué comentar algo si no se ha llegado al fondo del asunto?

Porque hace tiempo que abrí un tema para esas aclaraciones (porque nadie como tú podría hacerlo por sí mismo).

¡Y luego que la diferencia de idiomas no tiene nada que ver con los errores o bugs!

MQL v C++. Что хотелось бы, чего нет, что не так, куда копать.
MQL v C++. Что хотелось бы, чего нет, что не так, куда копать.
  • 2019.08.02
  • www.mql5.com
Общую тему багов и вопросов просто уже снасильничали такими разборками. Предложил открыть специализированную ветку, никто не чешется...
 
Sergey Dzyublik:
El MQL está desmoralizando poco a poco:

Breve resumen del fallo:
Cuando hay herencia de clases A <= B <= C <= D
y se implementan dos funciones, por ejemplo, una para A* y otra para B*,
Al pasar un objeto C* o D* a una función de este tipo, el MQL provoca un error de compilación "llamada ambigua a una función sobrecargada".

Pregunta: ¿Existe una solución más sensata para este error idiota que la presentada anteriormente?

Pues bien, el STL no se transpone uno a uno. Hay que fijarse bien en los detalles. La forma más fácil es escribir toda la funcionalidad posible en los métodos abstractos de una clase base o interfaz, y en los descendientes - ya sea implementación o =delte. En este caso, es necesario pasar punteros o referencias del mismo tipo a los métodos de la clase base. Aunque hay un mal inevitable en la forma de una tabla virtual, pero es mejor arreglar la arquitectura de tal manera que no haya ramificaciones dinámicas_cast costosas en ninguna parte.