Fehler, Irrtümer, Fragen - Seite 577

 
papaklass:

...

Ja. Ihr Standpunkt ist klar.
 

Es ist sogar schwierig, sich einen solchen EA vorzustellen, dem es an der Kraft eines Kerns im wirklichen Leben fehlt. Wenn zum Beispiel der Expert Advisor im Tester einen Durchlauf von einem Symbol pro Tag in der Historie eines Jahres macht (das ist zu viel! Vielleicht sollten wir den Code umschreiben!), dann wird er im wirklichen Leben die CPU im Durchschnitt mit 1/250 der Leistung = 0,4 % belasten.

Bei einem EA mit zehn Symbolen erhalten Sie eine durchschnittliche Auslastung von 4 %. Es macht nicht viel Sinn, die anderen Kerne zu belasten.

 

Was die Idee von Konstantin(Lizar) angeht, so finde ich sie gut. Aber für diese Art von Lösung müssen wir die Ereignisse, die direkt aus dem Diagramm kommen, von denen trennen, die benutzerdefiniert generiert werden. Für benutzerdefinierte Ereignisse können wir zwei Ereigniswarteschlangen und zwei Handler haben, wie OnUserEvents.

Ein interessanter Zusatz zu benutzerdefinierten Ereignissen wäre die Möglichkeit, ihre Priorität explizit anzugeben (z. B. von 0 bis 9), wodurch der Benutzer die Möglichkeit hätte, das Vorziehen und die Behandlung bestimmter Ereignisse zu steuern. Eine solche Funktion würde es beispielsweise ermöglichen, Ereignisse mit einem niedrigeren Wert auszuführen und solche mit einem höheren Wert aus der Warteschlange zu entfernen (wenn die Warteschlange mit wichtigeren Ereignissen gefüllt ist, werden keine neuen Ereignisse in die Warteschlange aufgenommen).

papaklass:

Ich habe noch nie Software entwickelt, kann also die technische Sprache der Softwareentwickler nicht sprechen. Ich werde beschreiben, was ich von meinem 4-Kern-Computer und MT5 erwarten würde. Im Allgemeinen sieht das so aus:


Der Umgang mit mehreren Tools ist nun möglich und die Entwickler haben eine perfekt funktionierende Lösung geschaffen.

2. Über die Arbeit des Testers und einen Haufen von Kernen. Es handelt sich um einen Sonderfall, und es ist nicht korrekt, diesen Mechanismus mit dem realen Handel zu vergleichen. Die Lösung des Problems des Testers besteht darin, dass es bei mehreren Expert Advisor-Varianten (bzw. einem Expert Advisor und vielen einzigartigen Parametersätzen) sinnvoll ist, die Berechnungen auf alle verfügbaren Kerne/Agenten zu verteilen. So entsteht Asynchronität für die Gesamtheit der Aufgaben, aber vom Standpunkt eines einzelnen Agenten aus gesehen ist alles synchronisiert.

3. Beim Multithreading geht es nicht um die gleichzeitige Verarbeitung mehrerer Werkzeuge, sondern um die gleichzeitige Verarbeitung mehrerer Ereignisse (und zwar innerhalb eines bestimmten Agenten). Das gab es in keiner Version des Terminals.

Die Entwickler sind auch verständlich: zu viel Overhead, eine zu bunte Mischung von Nutzern, zu viele Probleme mit der Synchronisierung von Daten, auf die ein "Multi-Threaded" Expert Advisor Zugriff hat, usw.

Auf der anderen Seite wird die Idee mit den Ereignissen nicht zu Ende gedacht. Ok, es ist teuer und problematisch, "Multithreading" zu implementieren, aber es ist möglich, Prozesse und Informationsflüsse innerhalb des Terminals selbst maximal zu parallelisieren und eine Reihe von Handlern zu erstellen, die ausreichen, um die maximale Anzahl von Aufgaben zu lösen (und mit einem normalen Satz von Parametern).

 
papaklass:

Mein Expert Advisor auf M5, auf den Zeitraum 04.01.2010 - 01.09.2011 auf 12 Währungen macht einen einzigen Durchgang in 1436 sec (24 Minuten) und zur gleichen Zeit macht 5687 Trades. Nur ein Kern ist belastet, die anderen drei sind im Leerlauf. Das heißt, bei jedem einzelnen Durchgang verliere ich 3/4 der Zeit, weil die Plattform keine Computerleistung nutzt. Dies ist ein wesentlicher Nachteil der Plattform bei der Fehlersuche in einer Strategie. Die Kerne sind nur während der Optimierung voll ausgelastet. Aber Optimierung ist viel seltener als einzelne Läufe. Und es wird viel Zeit für einzelne Läufe verschwendet.

Der Ansatz "3/4 der Zeit verlieren" deutet darauf hin, dass Sie glauben, dass die Verwendung von Multithreading eine verpasste Gelegenheit und ein klarer Fehler der Entwickler ist.

Leider ist Multi-Threading bei sequenziellen Aufgaben (und ein einzelner Prüfdurchlauf ist eine sequenzielle Aufgabe) nicht kostenlos. In der Realität hat Multi-Threading enorme (manchmal mehrfache) Verluste für die Prozesssynchronisation. In der Tat müssen alle Zugriffe auf gemeinsame Ressourcen mit Synchronisierern verbunden werden.

Wir haben den Tester absichtlich aus dem Terminal in einen separaten Prozess verschoben, damit er zu 99 % der Testzeit in einem einzigen Thread ohne Sperren arbeiten kann. Dies führte zu einem erheblichen Geschwindigkeitsgewinn.

Der Vorschlag "lasst uns Multitasking in jeden EA stecken" beruht auf einem völligen Missverständnis der Kosten (totale Verlangsamung) von Multithreading in diesem Fall und der Folgen (Verlangsamung + Überforderung von 99 % der nicht-professionellen Entwickler).


Wir haben die Probleme bei der Anwendung von Multitasking im Terminal und im Tester effektiv gelöst und eine fast unbegrenzte Skalierung der Leistung in den Modi Remote Agent und MQL5 Cloud Network ermöglicht.


Wenn ich 12 Charts öffne und einen Indikator auf jeden von ihnen lege, kann ich sehen, wie das Terminal zu bestimmten Zeiten hinkt. Nach den Meldungen im Forum zu urteilen, passiert das nicht nur mir. Es sind also 12 Instrumente mit einem Indikator, und wenn ich die Anzahl der Instrumente und Indikatoren erhöhen möchte, stürzt das Terminal ab. Und ein Kern wird benutzt, während der andere ruht. Macht es also Sinn, weitere Kerne zu belasten? Wenn wir die Terminalprozesse auf die Kerne verteilen, d.h. die Leistung des Computers voll ausnutzen, können wir Aufgaben auf einer anderen Ebene lösen. Das ist es, was ich meine.

Wenn es 12 verschiedene Chartas mit unterschiedlichen Symbolen gibt, bedeutet dies, dass jedes Symbol eines jeden Chars offensichtlich in seinem eigenen Thread läuft, ohne die anderen zu beeinflussen.

Wenn die Charts anfangen, sich zu verlangsamen, ist der Grund banal - einer der Indikatoren ist sehr unwirtschaftlich. In diesem Fall hilft kein noch so großes Multitasking, denn die Wurzel ist das Werk des Programmierers, der die Indikatoren im Kopf schreibt, ohne sich um die Effizienz zu kümmern.

 

Ich kann das umgekehrte Diagramm nicht bekommen, irgendetwas ist falsch, der neue Balken stört bei dieser Variante

Der ursprüngliche Indikator, an dem ich herumgebastelt habe, ist beigefügt

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[])
  {
//---- проверка количества баров на достаточность для расчета
   for(int numb=0; numb<8; numb++) if(BarsCalculated(RSI_Handle[numb])<rates_total) return(RESET);
   if(rates_total<min_rates_total) return(RESET);

//---- объявления локальных переменных 
   int to_copy;

//---- расчеты необходимого количества копируемых данных
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора
      to_copy=rates_total-1;                   // стартовый номер для расчета всех баров
   else to_copy=rates_total-prev_calculated+1; // стартовый номер для расчета новых баров
   
//---- копируем вновь появившиеся данные в массивы
   if(CopyBuffer(RSI_Handle[0],0,0,to_copy,Buffer1)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[1],0,0,to_copy,Buffer2)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[2],0,0,to_copy,Buffer3)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[3],0,0,to_copy,Buffer4)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[4],0,0,to_copy,Buffer5)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[5],0,0,to_copy,Buffer6)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[6],0,0,to_copy,Buffer7)<=0) return(RESET);
   if(CopyBuffer(RSI_Handle[7],0,0,to_copy,Buffer8)<=0) return(RESET);
   
   //мой кусок отсель   
   if (Reverse)
      {
         int start=prev_calculated;
         for(int i=start;i<rates_total;i++)
            {
               Buffer1[i]=100-Buffer1[i];
               Buffer2[i]=100-Buffer2[i];
               Buffer3[i]=100-Buffer3[i];
               Buffer4[i]=100-Buffer4[i];
               Buffer5[i]=100-Buffer5[i];
               Buffer6[i]=100-Buffer6[i];
            }
         Buffer1[0]=100-Buffer1[0];
         Buffer2[0]=100-Buffer2[0];
         Buffer3[0]=100-Buffer3[0];
         Buffer4[0]=100-Buffer4[0];
         Buffer5[0]=100-Buffer5[0];
         Buffer6[0]=100-Buffer6[0];
       }  
   //досель    

//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+

Dateien:
Multi_RSI.mq5  15 kb
 

Bitte teilen Sie uns mit, wo das Problem liegt.

Ich schreibe ein Mehrwährungsprogramm

Ich erhalte MA-Indikatorgriff

maHandle_EURUSD=iMA("EURUSD",PERIOD_H1,MA_Period_EURUSD,MA_Shift_EURUSD,MODE_SMA,PRICE_CLOSE);

maHandle_GBPUSD=iMA("GBPUSD",PERIOD_H1,MA_Period_GBPUSD,MA_Shift_GBPUSD,MODE_SMA,PRICE_CLOSE); 

Ich tue dasselbe für die verbleibenden 10 Währungen, die in der Meisterschaft erlaubt sind, aber ich erhalte Fehler 4801 während des Testens, alle 12 Währungen sind in der Geschichte (ich denke)

Ich teste auf dem EURUSD-Diagramm

der Expert Advisor testet GBPUSD (ich habe ihn in den Einstellungen so eingestellt, um ihn zu optimieren)

 
Lazarev:

Bitte teilen Sie uns mit, wo das Problem liegt.

Ich schreibe ein Mehrwährungsprogramm

Ich erhalte MA-Indikatorgriff

Ich tue dasselbe für die verbleibenden 10 Währungen, die in der Meisterschaft erlaubt sind, aber ich erhalte Fehler 4801 während des Testens, alle 12 Währungen sind in der Geschichte (ich denke)

Ich teste auf dem EURUSD-Diagramm

der Expert Advisor testet GBPUSD (ich habe ihn in den Einstellungen so eingestellt, um ihn zu optimieren)

Ich muss Symbole zuSymbolSelect Market Watch hinzufügen
 

papaklass:

Beantworten Sie mir jetzt eine so einfache Frage ....

Ich werde noch einfacher antworten, wenn auch nicht höflich.

Leider sind Sie völlig vom Thema abgekommen und machen Aussagen, die nur oberflächliche Vorstellungen über die Prozesse zeigen.

Ich fürchte, dass die meisten unserer technischen Argumente nicht verstanden werden, auch nicht das Grundproblem der Synchronisierung und die Verluste bei ihrer Bereitstellung.

Es gibt also keinen Grund, Forderungen zu stellen, wie "Sie sagen uns Ihre Argumente und wir spekulieren", die Situation ist völlig klar

 

Ich kann keine Antworten auf diese Fragen für einen Neuling finden:

1) Wenn ein weiteres Element zu einem dynamischen Array hinzugefügt wird, ist es notwendig, es mit ArrayResize zu erweitern?

2) Gibt es eine Funktion in MQL5, um ein Element (ein in der Mitte eines Arrays, zum Beispiel) aus einem dynamischen Array i zu löschen? Wenn nein, wie kann man es am besten machen?

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Fia:

Als Neuling kann ich keine Antworten auf diese Fragen finden:

1) Wenn Sie ein weiteres Element zu einem dynamischen Array hinzufügen, müssen Sie es mit ArrayResize erweitern?

Sie legen die Größe des Feldes mit einer gewissen Reserve fest, und wenn Sie sich der Grenze nähern, erhöhen Sie die Größe. Es gibt keine automatische Größenänderung und kein Hinzufügen am Ende. Sehen Sie sich das Beispiel für die Funktion ArrayInitialize() an
Grund der Beschwerde: