Fehler, Irrtümer, Fragen - Seite 2652

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

Warum kämpft ihr? Warum machen wir nicht gemeinsam etwas Sinnvolles?

Stanislav hat ein fantastisch nützliches Skript in KB veröffentlicht. Es erstellt auf einfache Weise Archive mit MQL-Dateien und Ressourcen.

Ich habe einen EA mit Hunderten von mqh-Dateien. Mit Hilfe des Skripts kann ich nun meinen EA einfach in den Quellcode übertragen, die Versionen kontrollieren und mit anderen teilen.

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...
 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von Neulingen zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes" verschoben.
 
Vladislav Andruschenko:
Ich danke Ihnen. Ich werde versuchen, es aufzuschlüsseln und die Optionen mit Diagrammereignissen zu überprüfen.

Schauen Sie sich den Thread an, in dem das Thema kürzlich ausführlich behandelt wurde -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) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы)

 это так?

Zum Thema "Balkenindex nach Zeitcopyrights erhalten"

Horror, das ist es wirklich! Die Aufgabe bestand darin, die Balken des M1-Zeitrahmens in den Indikator zu übernehmen, obwohl der Indikator selbst auf dem M5-Zeitrahmen arbeitet.

1. Wir mussten den gewünschten Zeitrahmen in OnCalculate() initialisieren, um ihn vor dem Start des Indikators zu laden (nach der Initialisierung ist das FirstStartFlag = false;). Denken Sie daran, in Indikatoren, wenn es nicht geladen ist, wird es -1 oder nicht vollständig geladen, so dass wir prüfen, wie viel geladen ist, wenn nicht genug, gehen wir an den Anfang derRückkehr(0);

declare array MqlRates rates[]; at the beginning, wherecnt_bars*5; - recalculate the number of bars M5 in 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);  
      }

Danach aktualisieren wir die historischen Daten zu M1 im Hauptteil der gewünschten Funktion jedes Mal, wenn wir Berechnungen durchführen:

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

Außerdem wird in der Schleife der M5-Balken in einer eingebetteten Schleife nach dem Index des entsprechenden M1-Balkens gesucht, wobeitime[s] der aktuelle M5-Balken des zu berechnendenZeitrahmens ist:

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

Und dann verwenden wir diesen Index, um die erforderlichen M1-Bar-Daten zu finden, in meinem Fall sind es rates[IndexRates-5].time und rates[IndexRates-k-4].close

Gott sei Dank geht diese verschachtelte Schleife schnell durch die Balken, selbst bei einem Verlauf von 90 Tagen. Aber ich möchte in der Lage sein, für Bar-Indizes in der rates[].time-Array wie eine binäre Suche mit der ArrayBsearch-Funktion zu suchen

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Was sind die Unterschiede für den Compiler bei den folgenden Zeilen?
Print("123" "456");
Print("123" + "456");
Print("123", "456");
 
MQLs demoralisieren nach und nach:
#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 

Kurzer Hinweis auf den Fehler:
Wenn es eine Klassenvererbung gibt A <= B <= C <= D
und es werden zwei Überladungsfunktionen implementiert, z.B. eine mit Parameter A* und eine mit Parameter B*,
Bei der Übergabe eines C*- oder D*-Objekts an eine solche Funktion verursacht MQL einen Kompilierungsfehler "ambiguous call to overloaded function".

Frage: Gibt es eine vernünftigere Abhilfe für diesen idiotischen Fehler als die oben beschriebene?
 
Hier geht's weiter mit mehr "Warum MQL != C++"-Blättern...
 
Сергей Таболин:
Hier geht es weiter mit mehr "Warum MQL != C++"...

Warum sollte man etwas kommentieren, wenn man nicht auf den Grund gegangen ist?

 
Sergey Dzyublik:

Warum sollte man etwas kommentieren, wenn man nicht auf den Grund gegangen ist?

Denn ich habe schon längst ein Thema für solche Klärungen eröffnet (weil niemand wie Sie es selbst tun konnte).

Und dann, dass der Unterschied in den Sprachen nichts mit Fehlern oder Bugs zu tun hat!

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

Kurzer Hinweis auf den Fehler:
Wenn es eine Klassenvererbung gibt A <= B <= C <= D
und zwei Funktionen implementiert werden, zum Beispiel eine für A* und eine für B*,
Bei der Übergabe eines C*- oder D*-Objekts an eine solche Funktion verursacht die MQL einen Kompilierungsfehler "ambiguous call to overloaded function".

Frage: Gibt es eine vernünftigere Abhilfe für diesen idiotischen Fehler als die oben beschriebene?

Nun, STL wird nicht eins-zu-eins transponiert. Hier muss man genau hinschauen. Am einfachsten ist es, alle möglichen Funktionen in die abstrakten Methoden einer Basisklasse oder Schnittstelle zu schreiben, und in die Nachkommen - entweder als Implementierung oder als =delte. In diesem Fall müssen Sie Zeiger oder Referenzen desselben Typs an die Methoden der Basisklasse übergeben. Zwar gibt es ein unvermeidliches Übel in Form einer virtuellen Tabelle, aber es ist besser, die Architektur so zu gestalten, dass es nirgendwo zu teuren dynamic_cast-Verzweigungen kommt.