Fehler, Irrtümer, Fragen - Seite 2859

 
fxsaber:

Was denken Sie generell über eine mögliche Umsetzung?

Es gibt viele mögliche Umsetzungen

aber es geht um die Aufgabe des Datenaustauschs zwischen EAs

Der einfachste Weg ist, die Erlaubnis für die Initialisierung zu prüfen und die Initialisierung selbst in OnTick() durchzuführen- dies würde es ermöglichen, das Wiederherstellen von Charts und das anschließende Ausführen von EA auf ihnen zu vermeiden, und das Speichern von EA vor dem Schließen wäre in OnDeinit() möglich

esist nicht wichtig, wer diesen Zoo verwaltet - entweder der Haupt-EA oder ein Dienst

 

Im Protokoll des Testers

2020.09.28 00:41:09.491 wrong tester bar time
2020.09.28 00:41:09.491 history error 9 in undefined function

Was bedeutet das?

 
Aleksey Vyazmikin:

Im Protokoll des Testers

Was bedeutet das?

Das bedeutet, dass das Zeitfeld 0 enthält, wenn der nächste Wert von m1 ohlc empfangen wird (oder der Bar-Status bei der Prüfung durch offene Preise).

undefinierte Funktion bedeutet, dass das Problem außerhalb der vordefinierten Funktionen (OnTick, OnTimer usw.) aufgetreten ist, d. h. in der Hauptschleife des Testers

 
Slava:

Das bedeutet, dass beim Abrufen des nächsten m1 ohlc-Wertes (oder des Bar-Status beim Testen anhand der offenen Preise) das Zeitfeld 0 enthält.

undefinierte Funktion bedeutet, dass das Problem außerhalb der vordefinierten Funktionen (OnTick, OnTimer usw.) aufgetreten ist, d. h. in der Hauptschleife des Testers

Alles funktionierte den ganzen Tag über einwandfrei, und dann fing es an. Was kann ich als Nutzer tun?

 
Slava:

Das bedeutet, dass beim Abrufen des nächsten m1 ohlc-Wertes (oder des Bar-Status beim Testen anhand der offenen Preise) das Zeitfeld 0 enthält.

undefinierte Funktion bedeutet, dass das Problem außerhalb der vordefinierten Funktionen (OnTick, OnTimer usw.) aufgetreten ist, d. h. in der Hauptschleife des Testers

Ich verstehe nicht, ist es ein Fehler in meinem Code oder ist es ein Fehler im Terminal? Ich habe den gesamten Verlauf gelöscht - das hat nicht geholfen.

Hinzugefügt:

Ich habe eine Funktion in meinem Code gefunden, deren Deaktivierung den Fehler vermeidet, aber in einem anderen EA funktioniert diese Funktion korrekt! Wie das? Ich kann sie in meiner privaten Nachricht hinterlassen.

Selbst wenn diese fehlerhafte Funktion aktiviert ist, wird OnTick() beim ersten Balken vollständig ausgeführt und dann dieser Fehler.

Auf verschiedenen Terminals wird der Fehler bestätigt.

Lief auf Ticks - kein Fehler...

Aber das Seltsame liegt im Protokoll:

2020.09.28 17:22:22.327 2020.09.18 09:45:02   Test_01

Auf Ticks, wenn das Tool zu sehen, war der erste Tick genau um 10:00 Uhr, und Handelssitzung ist noch zu dieser Zeit geschlossen. Dies ist im visuellen Modus, ohne Häkchen kommt der erste Druck auf 10 Uhr.

 
Igor Makanu:

Am einfachsten ist es, die Initialisierungserlaubnis zu Beginn eines jeden EA in OnTick() zu überprüfen

Dies ist der Hauptknackpunkt des Problems.
 
fxsaber:
Dies ist das Hauptproblem der Aufgabe.

Achten Sie auf die Karten-IDs und gehen Sie nach Dienstalter vor. Dies hebt jedoch die Interaktion von EAs nicht auf. Oder erstellen Sie eine Datei oder vielleicht eine SQLite-Datenbank mit den Karten-IDs in der Startsequenz.

Etwa so: Wenn bei der ersten Initialisierung keine Chart_ID() in der Liste vorhanden ist, wird sie in die Liste eingetragen. Wenn sie nicht geschlossen wird, weil das Terminal geschlossen ist, wird sie aus der Liste entfernt. Auf diese Weise wird es möglich sein, die Interaktion von EAs zu konfigurieren.

 
fxsaber:
Dies ist der Hauptknackpunkt des Problems.

skizziert, wie ich es sehe... 2 EA mit diesem Code erstellt:

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

und eine Steuerung EA, die im Timer ( 5 sec ) arbeitet

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


Überprüft, alles funktioniert, die einzige Sache, oder es funktionierte nicht mit GlobalVariableSetOnCondition(), um einen Datensatz in globalen Variablen zu machen

 
fxsaber:
Dies ist das Hauptproblem der Aufgabe.

GlobalVariableSetOnCondition ist alles, was benötigt wird, um das Problem zu lösen.

Die Operation ist nur zulässig, wenn GlobalVariableSetOnCondition den Wert true zurückgegeben hat.
Nach erfolgreicher Initialisierung und Freigabe der Ressourcen wird die Hauptvariable wieder in ihren ursprünglichen Zustand versetzt und ein weiterer EA gestartet.

In DeInit - bedingungslose Löschung der Variablen, um nicht in das Terminal ohne EAs zu laufen (wenn das vorherige Laden nicht korrekt abgeschlossen wurde).

 
Alexey Viktorov:
Igor Makanu:
Andrey Khatimlianskii:

Vielen Dank für die Empfehlungen. Ich werde mir GlobalVariableSetOnCondition ansehen.