Características da linguagem mql4, sutilezas e técnicas - página 27

 
Andrey Khatimlianskii:

O indicador é chamado com o conjunto de parâmetros errado

Sim, o indicador tem muitos parâmetros, há alguma forma de garantir que o iCustom preencha a memória? Leva cerca de 2 horas para preencher a memória, portanto testar um iCustom vazio e adicionar um parâmetro de cada vez levará muito tempo. Algum conselho?
P.S. Eu passarei por todos os parâmetros visualmente também.

 
Nauris Zukas:

Sim, o indicador tem alguns parâmetros, mas há alguma forma de garantir que o iCustom preencha exatamente a memória?

haverá muita criação de indicadores nos logs
 
TheXpert:
Haverá muitos indicadores nos logs

Sim, eu sei o que você quer dizer, eu vi isso também no testador de estratégia, quando muitos indicadores aparecem após um teste. Mas tudo funciona bem aqui no testador de estratégia. E tudo é exibido corretamente nos registros.

 
Nauris Zukas:

Sim, o indicador tem alguns parâmetros, há alguma forma de garantir que o iCustom preencha a memória? Leva cerca de 2 horas para preencher a memória, portanto testar um iCustom vazio e adicionar um parâmetro de cada vez levará muito tempo. Algum conselho?
P.S. Eu passarei por todos os parâmetros visualmente também.

Deixe a chamada sem parâmetros (então eles assumirão os padrões), e observe. Se o vazamento desaparece, então é isso que está errado.

 
Nauris Zukas:

A EA devora a memória que se acumula pouco a pouco.

Quanto é "um pouco"?

Talvez seja realmente um pouco e esta é a história das citações que apareceram desde o lançamento?

 
Andrey Khatimlianskii:

"Pouco a pouco" - quanto?

Talvez seja realmente apenas um pouco, e é a história das citações que tem aparecido desde o início?

Eu inicio o MT4 com vários EAs, habilito o registro de memória. Onde a seta mostra que há uma falha, "não há memória suficiente para o arquivo EX4".


 
Andrey Khatimlianskii:

Deixe a chamada sem parâmetros (então eles assumirão os padrões), e observe. Se o vazamento desaparece, então é isso que está errado.

Ok, vou fazer desta maneira.

 
Nauris Zukas:

Eu inicio o MT4 com vários EAs, habilito a gravação de memória. Onde a seta mostra que há uma falha, "não há memória suficiente para o arquivo EX4".

Quanto 40% de quanto está sendo usado?

Cresce linearmente, parece uma chamada de indicador curvo, sim.

 
Andrey Khatimlianskii:

40% de quanto é usado?

Cresce linearmente, parece uma chamada de indicador curvo, sim.

Parece ser um problema com os parâmetros. Obrigado!

 

Na MT4 esta situação é possível (não falaremos sobre os motivos):

  • Uma vaga está aberta. O saldo é igual a N.
  • A partir de um certo momento, as posições desaparecem. Equidade e equilíbrio são iguais a N. Na história dos ofícios, não há informações sobre a posição.
  • O rearme do terminal não ajuda.
  • Várias horas depois, as posições aparecem no histórico comercial (fecharam sob uma certa condição). O saldo e o patrimônio líquido são ajustados de acordo.

Esta é uma situação muito rara que é causada por uma confluência de muitas circunstâncias. Mas isso pode ocorrer, mesmo que a probabilidade seja cerca de zero.

Eu sugiro que todos os robôs de combate devem ter um mecanismo para identificar tais situações.

Para este fim, é necessário memorizar os bilhetes das ordens abertas e verificar sua presença no histórico comercial no caso de seu desaparecimento. Se eles não estão na história do comércio, Alertim!


A função de tal proteção.

#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);
}
Ligue para CheckTickets() no início da OnTick.
Razão: