Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 61

 
Vladislav Andruschenko:

Ora ho riscontrato un problema quando la storia contiene più di 1000 affari e quando chiamo la funzione di elaborazione della storia, per esempio, per calcolare il profitto della storia. + Le informazioni sul grafico cominciano a rallentare e il terminale si blocca. Cioè le citazioni vengono con un ritardo.

Senza il codice si può solo indovinare.

 

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

Peculiarità di mql5, consigli e trucchi

Alexey Navoykov, 2017.07.21 17:04

È deludente che non ci sia un'eredità multipla in MQL. Tuttavia, possiamo farlo funzionare in ogni modo possibile - con modelli e macro - come possiamo evitarli?)

Ecco quello che ho fatto.Tutte le classi sorgente dovrebbero essere dichiarate come modelli che definiscono la classe madre.

class CBase { };  // базовый класс

// Макросы, задающие список наследования:

#define  INHERIT1(T)  T<CBase>

#define  INHERIT2(T1, T2)  T2<INHERIT1(T1)>

#define  INHERIT3(T1, T2, T3)  T3<INHERIT2(T1,T2)>

#define  INHERIT4(T1, T2, T3, T4)  T4<INHERIT3(T1,T2,T3)>


// Различные пользовательские классы:

template<typename TParent>
class A : public TParent { public: void a() { Print("A"); } };

template<typename TParent>
class B : public TParent { public: void b() { Print("B"); } };

template<typename TParent>
class C : public TParent { public: void c() { Print("C"); } };


class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C


template<typename T>
void SomeFunc(B<T>& obj)  { obj.b(); }   // Проверочная функция, принимающая класс B


void OnInit()
{
  X x;
  x.a();
  x.b();
  x.c();
  
  SomeFunc(x);
}

Naturalmente, ci sono alcune sottigliezze, legate al fatto che le classi sono ereditate sequenzialmente (nell'ordine che abbiamo impostato), piuttosto che simultaneamente (come nella vera eredità multipla). In particolare, avranno priorità diverse quando si verifica un sovraccarico. Inoltre, se una stessa classe template partecipa più volte alla catena di ereditarietà, saranno classi completamente diverse, che non sono collegate tra loro in alcun modo. Quindi dobbiamo stare attenti. Ma non ci sono problemi con le interfacce, si può ereditare senza restrizioni.

Ma cosa succede senza dichiarazione sotto forma di modelli?

Per esempio, abbiamo due biblioteche autosufficienti pronte all'uso:

classe CLib1 : public CClass1 { };e
classe CLib2 : public CClass2 { };

Dobbiamo fare in modo che ci sia questa ereditarietà nella classe del programma:

CLib1--> CLib2 --> CProgram in modo che entrambe le librerie siano disponibili nella classe CProgram. E la libreria CLib1 sarà disponibile in CLib2.

Il codice di entrambe le librerie non può essere modificato in alcun modo.

È possibile?

Con l'eredità multipla sarebbe probabilmente come questo
classe CProgram : public CLib1,CLib2 { };

 
Artyom Trishkin:

E senza una dichiarazione di modello?

Per esempio, abbiamo due biblioteche autosufficienti già pronte:

classe CLib1 : public CClass1 { };e
classe CLib2 : public CClass2 { };

Abbiamo bisogno di fare tale eredità nella classe del programma:

CLib1--> CLib2 --> CProgram in modo che entrambe le librerie siano disponibili nella classe CProgram. E la libreria CLib1 sarà disponibile in CLib2.

Questo impedisce che entrambe le librerie siano modificate in qualsiasi modo.

È possibile?

Con l'eredità multipla sarebbe probabilmente come questo
classe CProgram : public CLib1,CLib2 { };


Non perderai nulla se fai questo:

class CProgram
{
  CLib1 lib1;
  CLib2 lib2;
};
 
Koldun Zloy:

Non perderai nulla facendo così:

Sì, l'ho fatto. Volevo solo evitare oggetti inutili.
 

Probabilmente il modo migliore per ottenere dati dalle funzioni Copy asincrone (CopyRates, CopyTicks, ecc.) è tramite EventChartCustom.

Particolarmente rilevante per gli indicatori.

 

È possibile sapere che il server di trading è cambiato, non solo il conto -AccountInfoString (ACCOUNT_SERVER) in OnDeinit (EA, non indicatore) restituirà il nuovo server di trading.

 

Memo

Azione/tipo di programmaCambio di TF o simboloCambio di account
IndicatoreEsegui OnDeinit e OnInit, l'oggetto globale della classe cambia (reset completo).Non succede niente, tranne che prev_calculated viene azzerato.
EAEseguite OnDeinit e OnInit, l'oggetto globale della classe non cambia.Esegui OnDeinit e OnInit, l'oggetto globale della classe cambia (ricarica completa).
 
Compressione dei file e misurazione universale del tempo di esecuzione

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

La mia insoddisfazione per i tester di strategia. per gli sviluppatori MQL

fxsaber, 2017.12.04 09:11

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
} 

void OnStart()
{
  uchar Data[];
  uchar Key[1];
  uchar Result[];
  
  FileLoad("thousands_rubies_galaxy.bmp", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
  
  ArrayFree(Data);
  
  FileLoad("space_wind.wav", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
}

Risultato

826534
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 53334
306648
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 29029
 

C'è un'intera classe di indicatori che sovrappongono i grafici dei prezzi di altri simboli sul grafico dei prezzi. Sono fatti nello stesso modo - attraverso i buffer degli indicatori.

Tuttavia, in MT5 c'è un meraviglioso OBJ_CHART, che permette di realizzare questo compito in modo molto più bello e senza buffer di indicatori.

Per esempio, puoi mettere qualsiasi indicatore e vedere immediatamente come appare su un altro simbolo.

Schema slave - diversi grafici vengono visualizzati come sfondo del grafico principale.

 
fxsaber:

Per esempio, puoi lanciare qualsiasi indicatore e vedere immediatamente come appare su un altro simbolo.

Schema slave - diversi grafici vengono visualizzati come sfondo del grafico principale.

C'è una foto di come sarebbe questo? Non è molto chiaro, non ho ancora usatoOBJ_CHART
Motivazione: