Caratteristiche del linguaggio mql4, sottigliezze e tecniche - pagina 27

 
Andrey Khatimlianskii:

L'indicatore è chiamato con un set di parametri sbagliato

Sì, l'indicatore ha un sacco di parametri, c'è un modo per assicurarsi che iCustom riempia la memoria? Ci vogliono circa 2 ore per riempire la memoria, quindi testare un iCustom vuoto e aggiungere un parametro alla volta richiederà molto tempo. Qualche consiglio?
P.S. Passerò attraverso tutti i parametri anche visivamente.

 
Nauris Zukas:

Sì, l'indicatore ha parecchi parametri, ma c'è un modo per assicurarsi che iCustom riempia esattamente la memoria?

ci sarà un sacco di creazione di indicatori nei registri
 
TheXpert:
Ci saranno molti indicatori nei registri

Sì, so cosa intendi, l'ho visto anche nello strategy tester, quando appaiono molti indicatori dopo un test. Ma tutto funziona bene nel tester di strategia qui. E tutto viene visualizzato correttamente nei registri.

 
Nauris Zukas:

Sì, l'indicatore ha parecchi parametri, c'è un modo per assicurarsi che iCustom riempia la memoria? Ci vogliono circa 2 ore per riempire la memoria, quindi testare un iCustom vuoto e aggiungere un parametro alla volta richiederà molto tempo. Qualche consiglio?
P.S. Passerò attraverso tutti i parametri anche visivamente.

Lasciate la chiamata senza parametri (allora prenderanno i default), e osservate. Se la perdita scompare, allora è quello che non va.

 
Nauris Zukas:

L'EA consuma la memoria che si accumula poco a poco.

Quanto è "un po'"?

Forse è davvero un po' e questa è la storia della citazione che è apparsa dal lancio?

 
Andrey Khatimlianskii:

"A poco a poco" - quanto?

Forse è davvero solo un po', ed è la storia della citazione che è apparsa fin dall'inizio?

Avvio MT4 con diversi EAs, abilito la registrazione della memoria. Dove la freccia mostra che c'è un crash, "non c'è abbastanza memoria per il file EX4".


 
Andrey Khatimlianskii:

Lasciate la chiamata senza parametri (allora prenderanno i default), e osservate. Se la perdita scompare, allora è quello che non va.

Ok, lo farò in questo modo.

 
Nauris Zukas:

Avvio MT4 con diversi EA, abilito la registrazione della memoria. Dove la freccia mostra che c'è un crash, "non c'è abbastanza memoria per il file EX4".

Quanto il 40% di quanto viene usato?

Cresce linearmente, sembra una chiamata indicatore storto, sì.

 
Andrey Khatimlianskii:

Il 40% di quanto viene usato?

Cresce linearmente, sembra una chiamata dell'indicatore di curva, sì.

Sembra che ci sia un problema con i parametri. Grazie!

 

Su MT4 questa situazione è possibile (non parleremo dei motivi):

  • Una posizione è aperta. Il saldo è uguale a N.
  • Da un certo momento le posizioni scompaiono. L'equità e l'equilibrio sono uguali a N. Nella storia degli scambi, non ci sono informazioni sulla posizione.
  • Il reset del terminale non aiuta.
  • Diverse ore dopo le posizioni appaiono nella storia del trading (hanno chiuso in una certa condizione). Il saldo e il patrimonio netto vengono adeguati di conseguenza.

Questa è una situazione molto rara che è causata da una confluenza di molte circostanze. Ma può accadere, anche se la probabilità è circa zero.

Suggerisco che tutti i robot da combattimento devono avere un meccanismo per identificare tali situazioni.

A tal fine, è necessario memorizzare i biglietti degli ordini aperti e controllare la loro presenza nella storia del commercio in caso di scomparsa. Se non sono nella cronologia del trading, Alertim!


La funzione di tale protezione.

#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);
}
Chiamare CheckTickets() all'inizio di OnTick.