Cancellazione forzata dell'array in MT5? - pagina 4

 
Non sapevo che in 4, l'inizializzazione con degli zeri avviene durante il ridimensionamento. Questa non è una comodità, ma una specie di sciocchezza, che porta a una minore velocità dei programmi. Cioè se ho bisogno di inizializzare l'array con il valore -1, allora avviene una doppia inizializzazione.
E poi chiedersi perché MT4 è più lento.
 
Vasiliy Sokolov:

... MQL5, a differenza di MQL4, non cerca di capire cosa vuole un utente e questo è corretto.

Suggerisco di metterlo su un poster. :) (scherzando)

Vasily, capisco che ci sono alcune sfumature che giustificano un tale approccio di MT5 per la comodità del programmatore. E non mi dispiace. Che sia così.

 
Реter Konow:

1. la logica ci dice che la procedura di cancellazione degli array viene eseguita dal compilatore una volta al momento della compilazione.

Sì, hai un problema con la logica :)

 
Nikolai Semko:
Non sapevo che in 4ka l'inizializzazione per zeri avviene durante il ridimensionamento. Questa non è convenienza, ma qualche sciocchezza, che porta a una minore velocità dei programmi. Cioè se ho bisogno di inizializzare l'array con il valore -1, avviene una doppia inizializzazione.
E poi si chiedono perché MT4 è più lento.

In linea di principio, potremmo aggiungere qualche flag quando si dichiara un array, che direbbe al compilatore di cancellare l'array. Sarebbe comodo o veloce - a voi la scelta.

 
Реter Konow:

In linea di principio, potremmo aggiungere un qualche tipo di flag quando si dichiara un array che direbbe al compilatore di cancellare l'array. Sarebbe comodo o veloce - a voi la scelta.

Che differenza fa? Si fa l'inizializzazione dopo il ridimensionamento, questa è tutta la bandiera.
Specialmente quando si dichiara un array dinamico, la dimensione non è nota.
 
Nikolai Semko:
Qual è la differenza. Si fa l'inizializzazione dopo il ridimensionamento, questa è l'intera bandiera.
Specialmente quando si dichiara un array dinamico, la dimensione non è nota.

Sì, dopo ogni dichiarazione di array globale e dopo ogni ridimensionamento dell'array. E se avete 20-30 array globali, alcuni dei quali cambiano dimensione in determinate circostanze? È necessario scrivere l'inizializzazione nei cicli ovunque? (gli array possono essere bidimensionali). Non è una potenziale fonte di errori?

 
Реter Konow:

Sì, dopo ogni dichiarazione di array globale e dopo ogni ridimensionamento dell'array. Ma cosa succede se avete 20 o 30 array globali, alcuni dei quali cambiano dimensione in determinate circostanze? È necessario scrivere l'inizializzazione nei cicli ovunque? (gli array possono essere bidimensionali). Non è un potenziale terreno fertile per gli errori?

Questa operazione chirurgica è molto semplice. Sostituite la parola"ArrayResize" con qualcos'altro - sarà il nome della vostra funzione per il ridimensionamento. Controlla in esso, se il resize è su, poi passa attraverso i nuovi elementi nel ciclo e assegna loro lo zero.

Inoltre, nell'inite, inizializzate tutti gli array che hanno dimensioni (se ce ne sono).

Ci possono essere anche array di una data dimensione nelle funzioni - anche quelli. Cercali usando le parentesi quadre.

 
Dmitry Fedoseev:

Questa operazione chirurgica si fa abbastanza semplicemente. Sostituite la parola "ArrayResize" con qualcos'altro - questo sarà il nome della vostra funzione di ridimensionamento. In esso controlla, se il ridimensionamento è verso l'alto, poi passa attraverso i nuovi elementi nel ciclo e assegna loro zero.

Inoltre, nell'inite, inizializzate tutti gli array che hanno dimensioni (se ce ne sono).

Ci possono essere anche array di una data dimensione nelle funzioni - anche quelli. Cercateli tra parentesi quadre.

A proposito, sì.
Pyotr, Dmitry sta dicendo una cosa sensata.
Una definizione scritta correttamente vi eviterà di riscrivere l'intero codice.
 
Nikolai Semko:
A proposito, sì.
Peter, Dimitri sta dicendo una cosa sensata.
Una definizione scritta correttamente vi eviterà di riscrivere l'intero codice.

Farò un tentativo. È un hack interessante.

 

Io sosterrò il topicstarter, anche se ci sono molte domande alla sua creazione ))))

Gli sviluppatori di MQL5, nella ricerca della velocità dei calcoli (o di qualche altro bel numero?) hanno rimosso tutti i "piccoli extra" che rendevano MQL4 più amichevole,

Se c'è una regola in MQL5, gli indicatori che sono basati su MQL4 diventeranno un "primer" in MQL5, e questo "primer" deve essere letto nel terminale di trading:

1. quando si chiama OnInit(), i buffer degli indicatori non vengono inizializzati automaticamente

2. Ho guardato attraverso un centinaio di indicatori nel kodobase, ahimè, con la scusa di programmare in MQL5 scrivono indicatori nello stile di MQL4 - espandono la numerazione degli array e delle serie temporali

3. iHighest / iLowest non funzionano logicamente - cercano le barre con i valori più alti / più bassi nella direzione della numerazione crescente della serie temporale... Cioè, se usiamo lo schema standard degli indicatori in MQL4 - calcolo dai dati precedenti al presente, questo problema non è risolto con iHighest e iLowest, poiché la barra più a sinistra è 0, e quando iLowest è chiamato, stiamo cercando i valori nel futuro....

4. lo stesso problema con ArrayMaximum() - è difficile da usare negli indicatori... è difficile non aumentare la numerazione delle serie temporali, prendiamo e sottraiamo costantemente dall'el-ta di partenza un certo numero di barre e otteniamo ArrayMaximum(high[i], i -Period,Period)

5. ahimè, anche gli esperti di MQL5 usano costruzioni discutibili.... Diciamo che una certa base di stampelle salvate nella transizione da MT4 è ancora in giro.


Qual è il punto? - MQL non pretende di essere puro С++, perché hanno rimosso implementazioni più semplici per gli utenti... Ho rivisto Python per circa un mese, perché così tanti lavori in esso... Solo ora ho capito che Python permette alle persone di ignorare le piccole cose e ha un'interfaccia più facile da usare ;) - per un programmatore esperto sembra tutto sbagliato, ma la gente lo usa e Python è abbastanza popolare