Erros, bugs, perguntas - página 2652

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

Porque é que estás a lutar? Porque não fazemos algo útil juntos?

Stanislav publicou um guião fantasticamente útil em KB. Cria facilmente arquivos com ficheiros MQL e recursos.

Tenho um EA com centenas de ficheiros mqh. Usando o script posso agora facilmente transferir a minha EA para o código fonte, controlar as versões e partilhar com outros.

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...
 
Comentários não relacionados com este tópico foram movidos para"Quaisquer perguntas de novatos sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos".
 
Vladislav Andruschenko:
Obrigado. Vou tentar decompor e verificar as opções com os eventos do gráfico.

Dê uma vista de olhos ao tópico, tratado recentemente em pormenor -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 o tema "obter índice de barras por copiratos do tempo".

Horror, é mesmo! A tarefa era obter as barras de tempo M1 no indicador, embora o indicador em si funcione no período de tempo M5.

1. tivemos de inicializar o prazo desejado em OnCalculate() para carregá-lo antes do início do indicador (após a inicialização o FirstStartFlag = falso;). Lembre-se, nos indicadores, se não estiver carregada, dará -1 ou não totalmente carregada, por isso verificamos quanto está carregada, se não for suficiente, vamos para o início doregresso(0);

declarar taxas MqlRates de array[]; no início, ondecnt_bars*5; - recalcular o número de barras M5 em 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);  
      }

Depois disso, actualizamos os dados históricos sobre M1 no corpo da função requerida sempre que efectuamos 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);  

Além disso, no laço de barras M5, fazemos um laço embutido de procura do índice da barra M1 correspondente,sendo o tempo[s] a barra M5 actual do intervalo de tempo em cálculo:

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

E depois usamos este índice para encontrar os dados necessários da barra M1, no meu caso são taxas[IndexRates-5].tempo e taxas[IndexRates-k-4].fechar

Graças a Deus, este loop aninhado atravessa as barras rapidamente, mesmo numa história de 90 dias. Mas gostaria de poder pesquisar o índice de barras nas taxas de matriz[].tempo usando a função de pesquisa binária ArrayBsearch

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Quais são as diferenças para o compilador das seguintes linhas?
Print("123" "456");
Print("123" + "456");
Print("123", "456");
 
Os MQLs são pouco a pouco desmoralizantes:
#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 síntese do insecto:
Quando há herança de classe A <= B <= C <= D
e duas funções de sobrecarga são implementadas, por exemplo, uma com o parâmetro A* e outra com o parâmetro B*,
Ao passar um objecto C* ou D* para tal função, o MQL causa um erro de compilação de "chamada ambígua para função sobrecarregada".

Pergunta: Haverá uma solução mais sensata para este insecto idiota do que a apresentada acima?
 
Aqui vamos com mais folhas "Porquê MQL != C++"...
 
Сергей Таболин:
Aqui vamos com mais "Porquê MQL != C++"...

Porquê comentar algo se não se chegou ao fundo da questão?

 
Sergey Dzyublik:

Porquê comentar algo se não se chegou ao fundo da questão?

Porque há muito tempo abri um tópico para tais esclarecimentos (porque ninguém como vós o poderia fazer sozinho).

E depois que a diferença de línguas não tem nada a ver com erros ou bugs!

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

Breve síntese do insecto:
Quando há herança de classe A <= B <= C <= D
e duas funções são implementadas, por exemplo, uma para A* e uma para B*,
Ao passar um objecto C* ou D* para tal função, o MQL causa um erro de compilação de "chamada ambígua para função sobrecarregada".

Pergunta: Haverá uma solução mais sensata para este insecto idiota do que a acima referida?

Bem, o STL não é transposto um a um. É necessário analisar atentamente as especificidades aqui. A forma mais fácil é escrever toda a funcionalidade possível nos métodos abstractos numa classe base ou interface, e nos descendentes - ou implementação ou =delte. Neste caso, é necessário passar indicações ou referências do mesmo tipo para os métodos da classe base. Embora exista um mal inevitável sob a forma de uma mesa virtual, mas é melhor organizar a arquitectura de tal forma que não haja ramificações dispendiosas via dynamic_cast em qualquer lugar.