Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 200

 
fxsaber:
Le funzioni oggetto* sono molto lente se si trascina il grafico con il mouse.
Non possono semplicemente ridisegnare?
 
Nikolai Semko:
Possono essere semplicemente ridisegnati?

ObjectFind, per esempio, cosa ha a che fare con il ridisegno?

 
fxsaber:

ObjectFind, per esempio, cosa ha a che fare con il ridisegno?

Ah, non è quello che avevo in mente.
 

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

Peculiarità di mql5, consigli e trucchi

fxsaber, 2020.03.04 08:58

Prima ero solo sospettoso, ora è confermato. È facile avere perdite di memoria quando si lavora con le risorse.

Lo script tramite SB emette un grafico di un array numerico sul grafico. Potete quindi cancellare manualmente questo grafico (oggetto), ma la risorsa assegnata a questo grafico rimarrà per sempre sospesa in memoria in modalità di sola lettura. Non può essere cancellato, perché solo lo script proprietario può cancellarlo (vedi la linea evidenziata).


Non c'è nessuna funzionalità in MQL per liberare la memoria così occupata. State particolarmente attenti con questo su VPS.


Come posso liberare la memoria in Terminal dopo gli script che non si puliscono da soli (o dopo arresti anomali)?

// После окончания работы скрипта Терминал потребляет дополнительные 4 Gb. Как освободить?
void OnStart()
{
  uint Data[];
  
  ArrayResize(Data, 1 e6);
  
  for (int i = 0; i < 1000; i++)  
    ResourceCreate("::" + (string)i, Data, ArraySize(Data), 1, 0, 0, ArraySize(Data), COLOR_FORMAT_ARGB_NORMALIZE);
}

In TaskManager (F2) il consumo di memoria è mostrato molto bene. Ora solo il riavvio del terminale aiuta.

 
fxsaber:

Come liberare la memoria in Terminal dopo l'esecuzione di script che non si puliscono da soli (o dopo un arresto anomalo)?

In TaskManager (F2) il consumo di memoria è perfettamente visibile. Al momento solo il riavvio di Terminal aiuta.

Normalmente, è necessario chiamare ResourceFree per ogni risorsa.

Sui crash non c'è niente da fare. L'unico modo per farlo è fare una DLL che sarà usata per creare risorse e ripulirle dopo la chiusura del thread.

 
Vladimir Simakov:

Normalmente, dovete chiamare ResourceFree per ogni risorsa.

Non c'è niente da fare in caso di arresto di emergenza. Solo se fai la tua dll, attraverso la quale creare risorse, che, quando il thread è spento, le cancella da solo.

L'arresto di emergenza include anche l'interruzione del debug.

 
fxsaber:

Il crash include un'interruzione del debug.

Con i mezzi standard mql - memory leakage. Solo la vostra implementazione di tutto questo dovrebbe essere scritta in modo maturo. Dato che DllMain con DLL_THREAD_DETACH non è probabile che venga chiamato quando un tale thread termina, non è il compito più banale, ma è gestibile.

UPD: Questo thread dovrebbe andare nel thread dei bug. IMHO
 

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

Nuova versione di MetaTrader 5 build 2650: Caricamento in background dei grafici e miglioramenti nel Profiler di codice MQL5

fxsaber, 2020.10.23 18:44

Ora nella barra del grafico non puoi vedere su quale grafico l'Expert Advisor sta girando e su quale no.

È possibile aggiungere un segno distintivo? Per esempio, se il grafico EURUSD sta lavorando con un EA, allora aggiungi un asterisco alla fine: EURUSD*. In generale, qualcosa che possa essere visivamente accattivante.

Un sacco di grafici, alcuni sono in esecuzione EAs su alcuni. Probabilmente è utile anche per gli indicatori, ma io non lo uso. Ecco perché non lo so.


Per qualche motivo non c'è un tasto di scelta rapida per la lista degli EA in esecuzione. Si può aprire solo con il mouse.

F2 ora. Premi ENTER su un EA - passeremo al suo grafico e un albero con il percorso di esso si aprirà nel Navigatore. Seconda volta ENTER - fonte in ME.

 
In precedenza, un errore interno nell'EA non ne causava la chiusura.
2021.03.18 11:41:47.413 zero divide in 'Test9.mq5' (550,5)
2021.03.18 11:42:26.619 array out of range in 'Test9.mq5' (550,8)

Più recentemente, è la causa del problema.


Prima, un cliente di Market poteva aggirare il problema riavviando il terminale. Ora non lo fa più.

 

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

Nuova versione di MetaTrader 4 build 1330

fxsaber, 2021.04.03 00:21

// Конструкция обнаружения бесконечных циклов.
class LOOP
{
private:
  static int PrevLine;    
  static uint PrevTime;
  
public:
#define  LOOP_CHECKTIME 100000 // Максимальная длительность (в миллисекундах) выполнения цикла

  static bool CheckFirst( const int Line )
  {
    if (Line != PrevLine)
    {
      LOOP::PrevTime = ::GetTickCount();
      LOOP::PrevLine = Line;
    }
      
    return(!::IsStopped() && ::GetTickCount() - LOOP::PrevTime < LOOP_CHECKTIME);
  }
  
  static bool Description( const string Str )
  {
    if (!::IsStopped() && (::GetTickCount() - LOOP::PrevTime > LOOP_CHECKTIME))
    {
      ::MessageBox("Endless loop:\n" + Str);
  
      LOOP::PrevTime = ::GetTickCount();
    }
    
    return(!::IsStopped());
  }
#undef  LOOP_CHECKTIME
};

static int LOOP::PrevLine = 0;
static uint LOOP::PrevTime = 0;


#define _CS(A) ((LOOP::CheckFirst(__LINE__) || LOOP::Description(__FILE__ + "\n" + (string)__LINE__ + "\n" + __FUNCSIG__ + "\nCondition: " + #A)) && (A))


Esempio di utilizzo.

void OnInit()
{
  for (uint i = 5; _CS(i >= 0); i--)
    ;
}