Características del lenguaje mql4, sutilezas y técnicas - página 27

 
Andrey Khatimlianskii:

El indicador se llama con un parámetro incorrecto

Sí, el indicador tiene bastantes parámetros, ¿hay alguna manera de asegurarse de que iCustom llene la memoria? Se tarda unas 2 horas en llenar la memoria, por lo que probar un iCustom vacío y añadir un parámetro cada vez llevará mucho tiempo. ¿Algún consejo?
P.D. Yo también revisaré todos los parámetros visualmente.

 
Nauris Zukas:

Sí, el indicador tiene bastantes parámetros, pero ¿hay alguna manera de asegurarse de que iCustom llene la memoria exactamente?

habrá mucha creación de indicadores en los registros
 
TheXpert:
Habrá muchos indicadores en los registros

Sí, sé a lo que te refieres, yo también he visto esto en el probador de estrategias, cuando aparecen muchos indicadores después de una prueba. Pero todo funciona bien en el probador de estrategias aquí. Y todo se muestra correctamente en los registros.

 
Nauris Zukas:

Sí, el indicador tiene bastantes parámetros, ¿hay alguna manera de asegurarse de que iCustom llene la memoria? Se tarda unas 2 horas en llenar la memoria, por lo que probar un iCustom vacío y añadir un parámetro cada vez llevará mucho tiempo. ¿Algún consejo?
P.D. Yo también revisaré todos los parámetros visualmente.

Deja la llamada sin parámetros (entonces tomarán los predeterminados), y observa. Si la fuga desaparece, entonces eso es lo que está mal.

 
Nauris Zukas:

El EA se come la memoria que se va acumulando poco a poco.

¿Cuánto es "un poco"?

¿Quizás realmente es un poco y este es el historial de citas que ha aparecido desde el lanzamiento?

 
Andrey Khatimlianskii:

"Poco a poco", ¿cuánto?

¿Quizás sea realmente sólo un poco, y es la historia de las citas que han aparecido desde el principio?

Inicio MT4 con varios EAs, habilito el registro de memoria. Donde la flecha muestra que hay un fallo, "no hay suficiente memoria para el archivo EX4".


 
Andrey Khatimlianskii:

Deja la llamada sin parámetros (entonces tomarán los predeterminados), y observa. Si la fuga desaparece, entonces eso es lo que está mal.

Ok, lo haré de esta manera.

 
Nauris Zukas:

Inicio MT4 con varios EAs, habilito la grabación en memoria. Donde la flecha muestra que hay un fallo, "no hay suficiente memoria para el archivo EX4".

¿Cuánto es el 40% de lo que se utiliza?

Está creciendo linealmente, parece una llamada de indicador torcida, sí.

 
Andrey Khatimlianskii:

El 40% de lo que se utiliza?

Crece linealmente, parece una llamada de indicador de curva, sí.

Parece que hay un problema con los parámetros. Gracias.

 

En MT4 esta situación es posible (no hablaremos de las razones):

  • Un puesto está abierto. El saldo es igual a N.
  • A partir de un determinado momento las posiciones desaparecen. La equidad y el equilibrio son iguales a N. En el historial de operaciones no hay información sobre la posición.
  • El reinicio del terminal no ayuda.
  • Varias horas después, las posiciones aparecen en el historial de operaciones (se cerraron bajo una determinada condición). El saldo y los fondos propios se ajustan en consecuencia.

Se trata de una situación muy rara que se debe a la confluencia de muchas circunstancias. Pero puede ocurrir, aunque la probabilidad es casi nula.

Sugiero que todos los robots de combate deben tener un mecanismo para identificar estas situaciones.

Para ello, es necesario memorizar los tickets de las órdenes abiertas y comprobar su presencia en el historial comercial en caso de que desaparezcan. Si no están en el historial de operaciones, ¡Alertim!


La función de dicha protección.

#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);
}
Llame a CheckTickets() al principio de OnTick.