Caratteristiche del linguaggio mql4, sottigliezze e tecniche - pagina 14

 
Nota per gli sviluppatori.


https://docs.mql4.com/ru/basis/types/integer


Lo standard C++ garantisce solo la dimensione del tipo char. Le lunghezze degli altri tipi sono specifiche dell'implementazione. La tabella di corrispondenza non è corretta e può portare a un comportamento non definito.

Целые типы - Типы данных - Основы языка - Справочник MQL4
Целые типы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Целые типы представлены в языке MQL4 одиннадцатью видами. Некоторые из типов могут использоваться вместе с другими, если этого требует логика программы, но при этом необходимо иметь ввиду правила преобразования типов. В таблице приведены характеристики каждого типа. Кроме того, в...
 
I commenti non relativi a questo argomento sono stati spostati in "Domande dai principianti di MQL4 MT4 MetaTrader 4".
 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2018.12.01 11:15

Design super-freno
string Str[];
const int handle = FileOpen(FileName, FILE_READ | FILE_ANSI | FILE_TXT);  

FileReadArray(handle, Str);

Un file di 40Mb di 1 milione di linee richiede 18 secondi per essere letto.


Lo stesso risultato di uscita, ma fatto in modo diverso

  uchar Bytes[];
  const int handle = FileOpen(FileName, FILE_READ | FILE_BIN);
  
  FileReadArray(handle, Bytes);

  string Str[];
  StringSplit(CharArrayToString(Bytes), '\n', Str);

È già fatto in 0,5 secondi.


 

Sovraccarico di 16Gb di RAM con compiti. Chrome ha finito per bloccarsi, MT5 con ottimizzazione in esecuzione - nessun problema. Ma più interessante è MT4.

Gli indicatori funzionano ancora, ma Expert Advisors si è fermato a causa di "out of range" dovuto all'assenza del controllo del risultato di ArrayResize.

Non voglio sempre controllare ArrayResize ma qui c'è la conferma che l'assenza di questo controllo può fermare, per esempio, un Expert Advisor di combattimento su VPS.


L'unica cosa che non riesco a capire è come il risultato sia "fuori portata" se ArrayResize è stato precedentemente fatto con una grande Riserva?

 
fxsaber:

Sovraccarico di 16Gb di RAM con compiti. Chrome ha finito per bloccarsi, MT5 con ottimizzazione in esecuzione - nessun problema. Ma più interessante è MT4.

Gli indicatori funzionano ancora, ma Expert Advisors si è fermato a causa di "out of range" a causa dell'assenza del controllo del risultato di ArrayResize.

Non voglio sempre controllare ArrayResize ma qui c'è la conferma che l'assenza di questo controllo può fermare, per esempio, un Expert Advisor da combattimento su VPS.


L'unica cosa che non riesco a capire è come ha fatto a diventare "fuori portata" se ArrayResize è stato precedentemente fatto con una grande Riserva?

facile :-) questo è vero per la maggior parte delle lingue/sistemi.

Riserva allocata la memoria virtuale e quando ho finito la memoria fisica, non ho potuto trovare una pagina libera. Abbiamo ottenuto un'eccezione del processore, che dopo una serie di elaborazioni si è trasformata in un fuori range

A proposito, il fatto che MT non sia andato in crash conferma la qualità della lavorazione :-)

 

Brutto errore sul tema dell'ordinamento nella storia. L'ordinamento per orario di chiusura non è sempre il caso, purtroppo.

Controllo dello script

#property strict

void OnStart()
{
  datetime time = INT_MAX;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      if (OrderCloseTime() > time)
      {
        Print(time);
        OrderPrint();
        
//        break;
      }
      
      time = OrderCloseTime();
    }
}


Perché un codice così elementare non possa essere scritto immediatamente per l'autotest è un mistero.

È anche un rompicapo: come può essere che gli ordini non siano ordinati per tempo? Faccio questa domanda perché ho usato un tester personalizzato in un QB. E logicamente, dal momento che l'ordine è entrato nella storia, la registrazione di esso lì più tardi di quelli che ci sono arrivati prima. Come scuotere questa logica non è affatto chiaro.

Forse, gli ordini sono memorizzati su diversi server MT5 e questo pasticcio si verifica durante la sincronizzazione. Spero che questo sia un bug del terminale e non del server MT4. Spero anche che questo non accada con gli scambi in MT.

 
fxsaber:

Brutto errore sul tema dell'ordinamento nella storia. L'ordinamento per orario di chiusura non è sempre il caso, purtroppo.

Controllo dello script


Perché un codice così elementare non possa essere scritto immediatamente per l'autotest è un mistero.

È anche un rompicapo: come può essere che gli ordini non siano ordinati per tempo? Faccio questa domanda perché ho usato un tester personalizzato in un QB. E logicamente, dal momento che l'ordine è entrato nella storia, la registrazione di esso lì più tardi di quelli che ci sono arrivati prima. Come scuotere questa logica non è affatto chiaro.

Forse, gli ordini sono memorizzati su diversi server MT5 e questo pasticcio si verifica durante la sincronizzazione. Spero che questo sia un bug del terminale e non del server MT4. Spero anche che questo non accada con gli scambi in MT.

Hai provato a cambiare l'ordinamento nella storia dell'account?

 
Artyom Trishkin:

Hai provato a cambiare l'ordinamento nella storia dell'account?

Non influisce sul risultato.

 
Artyom Trishkin:

Hai provato a cambiare l'ordinamento nella storia dell'account?

Sì, non dovrebbe avere alcun effetto. Solo il numero di ordini nella scheda della cronologia del conto è interessato. Bisogna tenerlo d'occhio.

 
fxsaber:

Non influisce sul risultato.

Il tempo di chiusura della posizione è dato dal server.

Motivazione: