Merkmale der Sprache mql4, Feinheiten und Techniken - Seite 27

 
Andrey Khatimlianskii:

Der Indikator wird mit dem falschen Parametersatz aufgerufen

Ja, der Indikator hat eine ganze Reihe von Parametern, gibt es eine Möglichkeit, um sicherzustellen, dass iCustom den Speicher füllt? Es dauert etwa 2 Stunden, den Speicher zu füllen, so dass das Testen eines leeren iCustom und das Hinzufügen eines Parameters nach dem anderen sehr lange dauern kann. Haben Sie einen Rat?
P.S. Ich werde alle Parameter auch visuell durchgehen.

 
Nauris Zukas:

Ja, der Indikator hat eine ganze Reihe von Parametern, aber gibt es eine Möglichkeit, um sicherzustellen, dass iCustom den Speicher genau füllt?

in den Protokollen werden viele Indikatoren erstellt
 
TheXpert:
In den Protokollen wird es viele Indikatoren geben

Ja, ich weiß, was Sie meinen. Ich habe das auch im Strategietester gesehen, wenn viele Indikatoren nach einem Test erscheinen. Aber hier im Strategietester funktioniert alles einwandfrei. Und in den Protokollen wird alles korrekt angezeigt.

 
Nauris Zukas:

Ja, der Indikator hat eine ganze Reihe von Parametern, gibt es eine Möglichkeit, um sicherzustellen, dass iCustom den Speicher füllt? Es dauert etwa 2 Stunden, den Speicher zu füllen, so dass das Testen eines leeren iCustom und das Hinzufügen eines Parameters nach dem anderen sehr lange dauern kann. Haben Sie einen Rat?
P.S. Ich werde alle Parameter auch visuell durchgehen.

Lassen Sie den Aufruf ohne Parameter (dann nehmen sie die Standardwerte), und beobachten Sie. Wenn das Leck verschwindet, ist das der Grund für das Problem.

 
Nauris Zukas:

Der EA verbraucht Speicherplatz, der sich nach und nach aufbaut.

Wie viel ist "ein wenig"?

Vielleicht ist es wirklich ein bisschen, und dies ist das Zitat Geschichte, die seit dem Start erschienen ist?

 
Andrey Khatimlianskii:

"Nach und nach" - wie viel?

Vielleicht ist es wirklich nur ein wenig, und es ist das Zitat Geschichte, die seit dem Start erschienen ist?

Ich starte MT4 mit mehreren EAs und aktiviere die Speicherprotokollierung. Dort, wo der Pfeil einen Absturz anzeigt, gibt es "nicht genug Speicher für EX4-Datei".


 
Andrey Khatimlianskii:

Lassen Sie den Aufruf ohne Parameter (dann nehmen sie die Standardwerte), und beobachten Sie. Wenn das Leck verschwindet, ist das der Grund für den Fehler.

Okay, ich werde es so machen.

 
Nauris Zukas:

Ich starte MT4 mit mehreren EAs, aktiviere die Speicheraufzeichnung. Dort, wo der Pfeil einen Absturz anzeigt, gibt es "nicht genug Speicher für EX4-Datei".

Wie viel 40 % von wie viel wird verwendet?

Wächst linear, sieht wie ein gekrümmter Indikator aus, ja.

 
Andrey Khatimlianskii:

Wie viel wird zu 40 % genutzt?

Wächst linear, sieht wie ein Kurvenindikator aus, ja.

Offenbar gibt es ein Problem mit den Parametern. Ich danke Ihnen!

 

Auf MT4 ist diese Situation möglich (wir werden nicht über die Gründe sprechen):

  • Eine Stelle ist frei. Der Saldo ist gleich N.
  • Ab einem bestimmten Zeitpunkt verschwinden die Positionen. Eigenkapital und Saldo sind gleich N. In der Historie der Trades gibt es keine Informationen über die Position.
  • Das Zurücksetzen des Terminals hilft nicht.
  • Einige Stunden später erscheinen die Positionen in der Handelshistorie (sie wurden unter einer bestimmten Bedingung geschlossen). Der Saldo und das Eigenkapital werden entsprechend angepasst.

Dies ist eine sehr seltene Situation, die durch ein Zusammentreffen vieler Umstände verursacht wird. Aber es kann passieren, auch wenn die Wahrscheinlichkeit gleich Null ist.

Ich schlage vor, dass alle Kampfroboter einen Mechanismus zur Erkennung solcher Situationen haben müssen.

Zu diesem Zweck ist es notwendig, die Tickets der offenen Aufträge zu speichern und ihr Vorhandensein in der Handelshistorie zu überprüfen, falls sie verschwinden sollten. Wenn sie nicht in der Handelshistorie enthalten sind, Alertim!


Die Funktion eines solchen Schutzes.

#define  TICKET_TYPE int

// Получаем все текущие тикеты.
int GetTickets( TICKET_TYPE &Tickets[] )
{
  int Amount = ArraySize(Tickets);
    
  for (int i = ArrayResize(Tickets, Amount + OrdersTotal()) - Amount - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      Tickets[Amount++] = OrderTicket();
          
  return(ArrayResize(Tickets, Amount));
}

// Проверяет наличие потерянных тикетов.
int CheckTickets( void )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  int Amount = 0;
  
  if (!IsTester)
  {
    static TICKET_TYPE Tickets[];
    TICKET_TYPE BadTickets[];
    
    for (int i = ArrayResize(BadTickets, ArraySize(Tickets)) - 1; i >= 0; i--)
      if (!OrderSelect(Tickets[i], SELECT_BY_TICKET))
      {
        BadTickets[Amount++] = Tickets[i];
        
        Alert("Ticket " + (string)Tickets[i] + " is not found!");
      }
        
    ArrayResize(BadTickets, Amount);    
  
  #ifdef __MQL5__
    ArraySwap(Tickets, BadTickets);
  #else // __MQL5__
    ArrayFree(Tickets);
    
    ArrayCopy(Tickets, BadTickets);  
  #endif // __MQL5__
      
    GetTickets(Tickets);
  }
      
  return(Amount);
}
Rufen Sie CheckTickets() am Anfang von OnTick auf.