Mt4 Ende der Unterstützung. - Seite 35

 
Реter Konow:

Diese Variante der Funktion hat überhaupt keine Funktion New_bar();

Dies ist die ressourcenschonendste Option, die ich angeboten habe. Außerdem hat es einen weiteren Vorteil: Das neue Bar-Ereignis wird immer dann gespeichert, wenn der Anwendercode auf ein Timer- oder Tick-Ereignis ausgeführt wird.

Zuvor konnte dieses Ereignis nur einmal ausgelöst werden, und das Kennzeichen wurde mit New_bar() gelöscht. Die spezielle Funktion löscht nun das Array "event_new_bar[][]" einmal pro Minute und wird nur nach der Ausführung von benutzerdefiniertem Code aufgerufen.

Benutzerdefinierte Funktionen können direkt auf das Array zugreifen und jedes Mal, wenn der Code bei einem Timer- oder Tick-Ereignis ausgeführt wird, neue Bar-Event-Informationen abrufen.

Das spart noch mehr Ressourcen.

Der letzte Code funktioniert auch nicht, es dauerte 7 Minuten, bis der Ausdruck ankam.

//+------------------------------------------------------------------+
//Пример использования событий нового бара в пользовательском функционал.
//Просто обращаемся к глобальному массиву "События_нового_бара[a1][a2]" напрямую
//и используем событие в наших торговых алгоритмах.
//+------------------------------------------------------------------+
void Моя_стратегия_торговли_на_новых_барах()
{
  for(int a1 = 0; a1 < Всех_символов; a1++)
   {
    string Этот_символ    = Символы[a1];
    //----------------------------------
    for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
      {
       bool   Новый_бар      = События_нового_бара[a1][a2];
       int    Этот_таймфрейм = Таймфреймы[a2];
       //----------------------------------
       if(Новый_бар && Этот_символ == "EURUSD" && Этот_таймфрейм == PERIOD_M5)
         {
          Print("M5");
         }
       //---------------------------------- 
       if(Новый_бар && Этот_символ == "EURUSD" && Этот_таймфрейм == PERIOD_M1)
         {
          Print("M1");
         }
       //----------------------------------        
      }
   }
}
 
Vitaly Muzichenko:

Der letzte Code funktioniert auch nicht, es dauerte 7 Minuten, bis der Ausdruck ankam.

Diese Funktion sollte von OnTick oder von einem Timer aus aufgerufen werden.

Es könnte ein kleines Problem geben, aber ich konnte es noch nicht ausfindig machen. Schauen Sie sich den Code selbst an und suchen Sie nach einem Fehler. Es ist so einfach wie eine 3 Kopeke. Und auch mit Kommentaren.

Wenn Sie es nicht verstehen, fragen Sie nach. Ich habe andere Dinge zu tun.

 
Реter Konow:

Diese Variante der Funktion hat überhaupt keine Funktion New_bar();

Dies ist die ressourcenschonendste Option, die ich angeboten habe. Außerdem hat es einen weiteren Vorteil: Das neue Bar-Ereignis wird immer dann gespeichert, wenn der Anwendercode auf ein Timer- oder Tick-Ereignis ausgeführt wird.

Zuvor konnte dieses Ereignis nur einmal ausgelöst werden, und das Kennzeichen wurde mit New_bar() gelöscht. Die spezielle Funktion löscht nun das Array "event_new_bar[][]" einmal pro Minute und wird nur nach der Ausführung von benutzerdefiniertem Code aufgerufen.

Benutzerdefinierte Funktionen können direkt auf das Array zugreifen und jedes Mal, wenn der Code bei einem Timer- oder Tick-Ereignis ausgeführt wird, neue Bar-Event-Informationen abrufen.

Dadurch werden noch mehr Ressourcen eingespart.


Ich verstehe den Humor nicht. Warum - der Debugger versteht kein Russisch? Oder habe nur ich eine solche Störung? Sieht Variablen in Latein, aber nicht in Kyrillisch.

Peter, wie verwenden Sie dann den Debugger, oder verwenden Sie ihn nicht?

 

Jeder Interessierte kann nach einem Fehler im Code suchen.

Das Wesentliche des Codes:

1. globale Arrays deklarieren:

  • eindimensionales Array für Symbolnamen "Symbols[]"
  • eindimensionales Array für Zeitrahmen "Timeframes[]"
  • Ein zweidimensionales Array, in das wir die aktuelle Anzahl der Takte schreiben "Number_bars[][]".
  • zweidimensionales Array "New Bar Events[][]", in das wir die Flags der neuen Bar-Ereignisse für jedes Symbol und jeden Zeitrahmen schreiben. Diejenigen, die sich in den Arrays "Symbols[]" und "Timeframes[]" befinden. Dieses Array wird in der Schleife mit den Symbolen und Zeitrahmen des Timer-Ereignisses gefüllt, und zwar einmal pro Minute. Danach wird sie gelöscht. In der Zeit zwischen dem Füllen und Löschen wird dieses Array von der Benutzerfunktionalität aufgerufen und über die neuen Balken informiert.

2. Legen Sie bei der Initialisierung die Größe des Arrays der Symbole fest und schreiben Sie dort die Namen der Symbole aus der Marktübersicht hinein.

3. Legen Sie die Größe der ersten Dimension des Arrays "Number_bars[][]" fest, die der Anzahl der Symbole entspricht, und die zweite Dimension entspricht der Anzahl der Zeitrahmen. Diese Anordnung ist wie eine Tabelle. Es wird die aktuelle Anzahl der Balken für jedes Symbol und jeden Zeitrahmen aufgezeichnet. Die Zahl wird von der Funktion iBars zurückgegeben.

4. Legen Sie die Größe der ersten Dimension des Arrays "Events_new_bar[][]" fest, die gleich der Anzahl der Symbole ist, und die zweite Dimension entspricht der Anzahl der Zeitrahmen. Diese Anordnung ist wie eine Tabelle. Es zeichnet die Ereignisflaggen der neuen Balken jedes Symbols in jedem Zeitrahmen auf.

5. Innerhalb des Timers wird die Minute heruntergezählt und eine doppelte (verschachtelte) Schleife über die Symbole (die sich im Array Symbols[] befinden) und die Zeitrahmen (die sich im Array Timframes[] befinden) ausgeführt. Wir rufen die Funktion iBars auf und ermitteln die aktuelle Anzahl der Balken für jedes Symbol und jeden Zeitrahmen aus den Arrays Symbols und Timeframe. Zunächst wird die aktuelle Anzahl der Balken mit der bereits im Array gespeicherten Anzahl verglichen. Wenn diese Werte nicht gleich sind, wird das Flag des neuen Bar-Ereignisses im Array "Event_new_bar[][]" gesetzt. Wir schreiben dann die aktuelle Anzahl der Takte an die Stelle der vorherigen.


Das globale Array "events_new_bar[][]" ist an jeder Stelle des Programms verfügbar und wird automatisch jede Minute gefüllt und auch automatisch gelöscht. Während der Zeit, in der das Array gefüllt wird, erhält die Benutzerfunktionalität frische Daten über neue Balken. Das Feld wird dann automatisch geleert.


Das war's.

 
Реter Konow:

Diese Funktion sollte von OnTick oder von einem Timer aus aufgerufen werden.

Es könnte ein kleines Problem geben, aber ich habe es noch nicht lokalisieren können. Schauen Sie sich den Code selbst an und suchen Sie nach einem Fehler. Es ist so einfach wie eine 3 Kopeke. Und dann auch noch mit Kommentaren.

Wenn Sie es nicht verstehen, fragen Sie einfach. Ich habe andere Dinge zu tun.


professionelle Antwort

 
Nikolai Semko:

Ich verstehe den Humor nicht. Was - der Debugger versteht kein Russisch? Oder habe nur ich eine solche Störung? Es sieht Variablen in Latein, aber nicht in Kyrillisch.

Peter, wie verwenden Sie dann den Debugger, oder verwenden Sie ihn nicht?

Nikolai, zu meiner Schande habe ich keine Ahnung, wie man den Debugger benutzt. Ich habe es nie benutzt. ((
 
Galina Bobro:

professionelle Antwort

Und das ist professionelles Trolling.
 
Реter Konow:

Diese Funktion sollte von OnTick oder von einem Timer aus aufgerufen werden.

Es könnte ein kleines Problem geben, aber ich habe es noch nicht lokalisieren können. Schauen Sie sich den Code selbst an und suchen Sie nach einem Fehler. Es ist so einfach wie eine 3 Kopeke. Und auch mit Kommentaren.

Wenn Sie etwas nicht verstehen, fragen Sie einfach. Ich habe andere Dinge zu tun.

Sie ist so kompliziert und verdreht, dass man sie nicht verstehen kann.

Es tut mir leid, aber es ist auch völlig unleserlich.

 
Vitaly Muzichenko:

Es ist so kompliziert und verdreht, dass es ein einziges Durcheinander ist.

Es tut mir leid, aber es ist auch völlig unleserlich.

Sie wissen ja, was man über "man kann nicht... nicht foltern..."? Ich denke, es ist eine gute Idee.

 
Реter Konow:

Sie kennen das Sprichwort: "Man kann nicht... nicht foltern..."? Ich denke, es ist eine gute Idee.

Richtig, so haben Sie die Aufgabe schlüssig gelöst, oder ich habe Ihre Lösung nicht richtig verstanden.