Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 214

 
fxsaber #:

Non mi sono mai imbattuto in una voce del genere.

Usalo)))

 
Vladimir Simakov #:

Usalo))))

Vladimir, dove trovi schemi come questo, mi ha aiutato poi, nel mio topic sulla ricerca delle barre, ciclo minimo, c'è un'immagine pronta da qualche parte? Sono autodidatta, in un altro profilo in origine

solo mettendo insieme circuiti logici come quello, sommando, scorrendo i cicli...
 
Vladimir Simakov #:

Quindi è un bug feroce. Esempio:

La memoria viene allocata, il distruttore viene chiamato quando la si rilascia (che è un accenno al comportamento atteso secondo RAII), ma il costruttore viene dimenticato per essere chiamato quando si crea un oggetto))

Questo è il 2° errore {}.

Promemoria: il 1° con il librarsi, il 3° con l'unione

 
Vladimir Simakov #:

Approfittane)))

Oh, queste laconicità post-incrementale... )
 
Fast235 #:

Vladimir, dove trovi questi schemi, sono stato aiutato poi, nel mio topic sulla ricerca delle barre, da un ciclo minimo, ci sono immagini pronte da qualche parte? Sono autodidatta, in un altro profilo in origine

basta mettere insieme dei circuiti logici, sommarli, scorrere i cicli...

Non usate qualcosa del genere, fuori dal pronto, senza capire. Con tali registri, se avete bisogno di qualcosa di un po' più complicato di qui, bug, non sempre facili da trovare, potete riempire in un attimo)))

 
Vladimir Simakov #:

Non usate una cosa del genere, senza averla capita. Con tali registri, se avete bisogno di qualcosa di un po' più complesso di qui, potete fare dei bug, non sempre facili da trovare, in un attimo)))

le vostre ricerche di barre, erano con enumerazioni e modelli))

Ho rimandato i modelli per quasi sempre, ma ci sono arrivato in circa un'ora.

li ha tolti dal codice, insieme alle enumerazioni, probabilmente avevi un compito più serio per usarli

--

aggiungere

è tutto nel forum, solo grazie.

 
Vladimir Simakov #:

Beh, questo è un bug feroce. Esempio:

La memoria viene allocata, il distruttore viene chiamato quando la si rilascia (il che suggerisce il comportamento atteso secondo RAII), ma il costruttore viene dimenticato per essere chiamato quando si crea un oggetto))

Grazie per il post.
Corretto.

Questo codice causerà un errore di compilazione poiché le sequenze di inizializzazione in MQL sono ancora incomplete.

Per le strutture, l'inizializzazione per sequenza non è sostituita dalla chiamata al costruttore con i relativi parametri - stiamo pianificando di aggiungere questo (è rimandato indefinitamente, ma un po' di nuovo codice è "trapelato" in produzione).



 

@A100

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

Peculiarità di mql5, consigli e trucchi

A100, 2021.11.16 13:43

Non ha senso perché:

struct X {
    int i;
};
void OnStart()
{
    X x[200000] = {};
}

F5 riaggancia. Inoltre, questo è un workaround contraddittorio.


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

Peculiarità di mql5, consigli e trucchi

fxsaber, 2021.11.17 02:07

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}

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

Peculiarità di mql5, consigli e trucchi

A100, 2021.11.17 02:20

Tu stesso hai fatto il 4° errore. Perché ZeroMemory è peggio di {}? Cioè, abbiamo qualche meccanismo non autorizzato di accesso al privato che il compilatore non può rilevare per qualche motivo.

Sta mettendo in conto che gli sviluppatori non risolveranno il problema? Una volta, il compilatorenon reagiva nemmeno aZeroMemory.


Se ricordate che mql è stato generato da C++, entrambi questi esempi (le loro controparti) funzionano bene lì, perché queste classi non hanno costruttori (cioè un costruttore implicito):

  • Dichiarare ClassX x[n]={}; risulta in una inizializzazione del valore di ogni elemento dell'array.
  • Se ClassX non ha costruttori personalizzati (ma ha un costruttore predefinito non impostato), allora viene fatta l'inizializzazione zero degli oggetti della classe - indipendentemente dal fatto che ci siano campi privati.
  • Ma se ci sono campi const, il costruttore di default sarà implicitamente cancellato, quindi errore del compilatore.

Esempio in C++:

#include <iostream>
using namespace std;

class X
{
    int a;
    public:
    int get(){return a;}

    //X(){}   //так массив x не обнуляется
    //а если нет конструктора - то обнуляется
};

int main()
{
    X x[10]={};
    for (int i=0; i<10;i++)   cout<<x[i].get()<<endl;
}

Quindi se non ci sono campi const nella struttura/classe, allora la logica è corretta.

 
Ho dimenticato di aggiungere che se una classe ha campi (oggetti) non banali, il loro c-tor predefinito sarà chiamato dopo lo zero-init dell'intero oggetto per tali campi.
 
fxsaber #:

Non ho mai visto un simile record.

Ho guardato la mia ricerca in MQL5, potrebbe essere peggio, ho anche pompato la storia nell'indicatore di diversi TF:

void FindHighLow(THL &hl[], const ENUM_TIMEFRAMES tf, const datetime start_time, const int sz_buf = 1000)
{
   ZeroMemory(hl);//hl структура
   datetime st = start_time;
   MqlRates rates[];
   for(int i = 0, c = CopyRates(_Symbol, tf, st, sz_buf, rates); ArraySize(rates) > 0 && i < ArraySize(hl);
         st = rates[0].time - PeriodSeconds(tf), c = CopyRates(_Symbol, tf, st, sz_buf, rates))
   {
        for(int j  = ArraySize(rates) - 1; j >= 0 && i < ArraySize(hl); j--)
      	{
		....	
	}
   }


Posso scrivere un sacco di cose nella dichiarazione for ))))

Motivazione: