Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 168

 
Slava:

Quando si riceve un messaggio su una perdita di memoria, significa che non c'era un comando esplicito per liberare quella memoria.

Quando il programma termina (che è quando si ottengono questi messaggi), libera comunque tutta la memoria, inclusa la memoria leaked.

Forse ho usato il termine "perdita" troppo liberamente. Il punto è che una risorsa viene lasciata appesa in memoria, il cui nome non è nemmeno riconoscibile se l'oggetto viene cancellato. E se conoscete il suo nome, non potete cancellarlo da nessuna parte se non dal programma che ha creato la risorsa.


Ora è molto facile scrivere uno script per Market che sospenderà (non necessariamente premeditato) il terminale sul VPS, riempiendo tutta la memoria con risorse che non vengono cancellate dopo l'esecuzione dello script.

 

Alcuni server di trading possono contenere più di un tipo di conto alla volta. Per esempio, ECN e standard. In questo caso i simboli possono non avere prefissi, cioè i nomi sono gli stessi.

In questo caso, la storia delle barre (compreso il valore attuale di bid/ask/last sul grafico) e la storia dei tick corrispondono sempre a un solo tipo di conto.

E i dati di Market Watch corrispondono a quello a cui è collegato.


A causa di questo, è facile osservare che il Market Watch è completamente incoerente con i grafici e la storia dei tick.

 

Più volte mi è capitato di cambiare accidentalmente (manualmente) il simbolo della carta dove si trova un consigliere di combattimento.

Protezione contro il cambio di simbolo.

int OnInit()
{
  static const string Symb = _Symbol;  
  const bool Res = (_Symbol != Symb);
  
  if (Res)
    Alert("Symbol is change!");
  
  return(Res); // Защита от смены символа.
}
 
Quando si avvia un EA, è spesso necessario decidere il tempo dal quale la storia dei prezzi deve essere ottenuta. Per evitare di doverlo inserire manualmente ogni volta, ho fatto così.
#define  WEEK (7 * 24 * 3600)
input datetime temp = __DATE__ - WEEK;

Di conseguenza, prendo la storia una settimana prima della compilazione. È conveniente.

 
fxsaber:
Quando si avvia un EA, è spesso necessario decidere il tempo dal quale la storia dei prezzi deve essere ottenuta. Per evitare di doverlo inserire manualmente ogni volta, ho fatto così.

Di conseguenza, prendo la storia una settimana prima della compilazione. Conveniente.

Perché dovreste fare troppo affidamento sull'ottimizzatore? È meglio:

#define WEEK 604800

 

Funzione di interruzione di emergenza, sembra funzionare bene

#define  EXIT (STD_CExit(__LINE__,__FUNCTION__)).Exit

class STD_CExit{
   string function;
   int line;
public:
   STD_CExit(int _line,string _func):line(_line),function(_func){}
   void Exit(string reason=NULL);
};
//--------------------------------------------------------------------------
void STD_CExit::Exit(string reason=NULL){
   Alert(StringFormat("Abort in line %i, function %s.\nReason: %s.",line,function,reason==NULL||reason==""?"Unknow":reason));
   int a=0;
   int b=1/a;}

void OnStart()
{
   Test();
}

void Test(){
   EXIT("Some reason");
}
 
Vladimir Simakov:

Funzione di interruzione di emergenza, sembra funzionare bene

è la cosa giusta da fare - sono stato felice di vederlo accadere... abbiamo risolto questo problema con@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

ma questo:

- nonExit http://www.delphibasics.ru/Exit.php

- nonAbort http://www.delphibasics.ru/Abort.php

èHalt http://www.delphibasics.ru/Halt.php

UPD: un tale script è estremamente necessario

void OnTick()
{
   if(!getData()) EXIT("No data");
}
bool getData()
{
   return(false);
}
 
Igor Makanu:

la cosa è necessaria - sono stato felice di vederlo accadere..., ecco il problema che abbiamo risolto con@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

ma questo:

- nonExit http://www.delphibasics.ru/Exit.php

- nonAbort http://www.delphibasics.ru/Abort.php

èHalt http://www.delphibasics.ru/Halt.php

UPD: un tale script è estremamente necessario

Non c'è modo che questo funzioni ancora((((
 
Vladimir Simakov:
Questo non ha ancora funzionato((((.

Non vedo perché ne ho bisogno!

Se gli sviluppatori avessero dato exit / abort come standard, allora sarebbe possibile terminare correttamente l'elaborazione dei dati, se, per esempio, TF non è pronto - dati OHLC, sarebbe anche utile per l'elaborazione degli ordini di invio al server... sarebbe conveniente interrompere il codice in qualsiasi punto e uscire prima del prossimo tick senza interminabili return() per uscire da OnTick()

 
Igor Makanu:

non posso essere sicuro di averne bisogno!

Se gli sviluppatori avessero dato exit / abort come standard, allora sarebbe possibile terminare correttamente l'elaborazione dei dati, se, per esempio, TF non è pronto - dati OHLC, sarebbe anche utile per l'elaborazione degli ordini di invio al server... sarebbe conveniente interrompere il codice in qualsiasi punto e uscire prima del prossimo tick senza interminabili return() per uscire da OnTick()

Beh, non poteva, non ancora...