Aiutami a imparare a programmare. - pagina 3

 
Tio Nisla:
Volevo aggiungere prima che se la funzione somebodyfunc() fa altre manipolazioni oltre a restituire una certa quantità o qualcosa, calcola parametri commerciali, per esempio, tale uso causa artefatti difficili da catturare e potrebbe portare l'autore del codice in un torpore: "Ht? Come mai 4 volte? O_o F$#@!!! Non dovrebbe essere lì tre volte? Perché la mia EA mi sta mentendo?". Questo è quello che ho chiamato "shithcod", che un esperto era indignato fino alle radici dei suoi capelli. Non l'ho tirato fuori io, perché è ovvio, ma tu l'hai fatto per me. Ma non hai tenuto conto che l'indirizzamento tramite un indice calcolato dinamicamente senza reinizializzazione dell'array è un'altra cosa. In sys nudo questo di solito porta a GPF, in plus con puntatori intelligenti e array a un'eccezione e al suo gestore. In mql non è chiaro a cosa porti.

Cos'è "artefatti sfuggenti", è una cosa religiosa? Te lo inventi e ci credi?

 
Aleksandr Slavskii:

Signori, personalità, ma scopriamo la verità.

Vedo nell'esempio chePositionsTotal()è chiamato ad ogni iterazione del ciclo.

Ma Dimitri, al contrario, stai dicendo che il compilatore lo fa in un modo diverso - non lo capisco. Spiegare.

Se volete dire che la funzionePositionsTotal() non ricalcola le posizioni ogni volta, ma semplicemente restituisce il valore di una variabile contenente il numero di posizioni aperte, allora sì, avete ragione, non ha senso dichiarare una variabile in più, ma allora cosa c'entra il compilatore?

E se questa funzione ricalcola le posizioni aperte ogni volta, allora risulta che il compilatore deve capire se il valore di questa funzione influisce su ulteriori calcoli e usa o una funzione o una variabile.

Non mi sembra di capire bene.

Ricalcola ogni volta o non la ricalcola, ma la chiamata di PositionTotal() è decisamente costosa. E questo è facilmente dimostrato da un semplice esperimento. Ma invece di dare un esperimento killer che mi farebbe a pezzi, se ne escono con argomenti fantasiosi con "artefatti difficili da trovare". Puoi trovare quel codice di esempio dalla prima pagina che sai dove e vedere come appare lì))) È stato deliberatamente cambiato prima di essere inserito nel forum (grande applauso). Ed è stato fatto solo per evitare oneri inutili per un principiante.

E il compilatore, volevo dire che ottimizza il codice e chiama la variabile direttamente invece che attraverso una funzione:

int x;

for(;i<x;)

и

for(;i<F();)

int F(){return(x);}

Questo è ben evidente con la funzione ArraySize(); non si può dire la differenza tra chiamare una funzione e usare una variabile con essa. Ma con PositionsTotsl() questo non è il caso, ahimè.

A proposito, si può anche arrivare a dichiarare le variabili all'interno di un ciclo, il che riduce anche la velocità. Cosa non arriva alla radice? Non ne sai niente? Anche se possiamo discutere anche qui, c'è una differenza tra il 4 e il 5.

 

Sicuramente PositionsTotal() chiede ogni volta il numero di posizioni aperte? O forse è ottimizzato e salva il valore in una costante con un segno di aggiornamento e restituisce sempre lo stesso numero se non cambia)?

Ci deve essere qualche ottimizzazione interna di questa funzione. Gli sviluppatori non sono sciocchi a fare una funzione così importante e potenzialmente costosa per "lo farà comunque".

Chi si indigna, è pregato di controllare quanto tempo e quante risorse ci vogliono per eseguire entrambe le varianti dello stesso ciclo.

Non c'è bisogno di tirare la cacca.


Mi piacerebbe vedere il codice sorgente di PositionsTotal() puramente per interesse accademico.


Sì, beh, se ci pensate, la cosa più semplice sarebbe fare una variabile globale del terminale che memorizzi questo valore. E restituire solo questo valore. E per aggiornarla all'apertura o alla chiusura delle posizioni - per rendere la variabile sicura e per sincronizzarla, in modo che Dio non voglia che vi sia scritto qualcosa.

Credo che sia così che si fa.

Beh, forse, i dati sulle posizioni stesse sono memorizzati in alcune strutture di dati, in modo che sia possibile ottenerli senza rivolgersi inutilmente ai server. In generale penso che tutto sia normale con la produttività in qualsiasi variante di chiamata per/.


E lo stile del codice è esteticamente bello o no, ognuno decide per sé)

 
Nikolay Mitrofanov:

Chi si risente, è pregato di controllare quanto tempo e quante risorse ci vogliono per eseguire entrambe le varianti dello stesso ciclo.

Non c'è bisogno di tirare la cacca.

Spero che non fosse diretto a me, perché non dubito dell'autorità di Dmitriy.AncheTio Nislasembra aver codificato per molto tempo, ma


Sto imparando, ecco perché chiedo.

 

PositionsTotal() è difficile, deve sempre restituire il numero corretto, e cambiare il suo valore non appena il numero di posizioni cambia. Quindi è improbabile che sia veloce come una semplice variabile o ArraySize().

 
Aleksandr Slavskii:

...


Sto imparando, ecco perché chiedo.

Se state imparando, non fatevi assolutamente impantanare da queste piccole cose. Concentratevi sulla capacità di tradurre la vostra idea in codice (o qualche processo mal definito in una sequenza di azioni). E poi il codice può essere modificato come si vuole.

 
Dmitry Fedoseev:

Se stai imparando, non preoccuparti affatto di questi dettagli. Concentratevi sulla capacità di tradurre la vostra idea in codice (o qualche processo mal definito in una sequenza di azioni). E poi il codice può essere modificato come si vuole.

Per me è bene che una persona cerchi di capire e scavi più a fondo.

Non prestando attenzione alle piccole cose il codificatore prende l'abitudine di scrivere il codice come si vuole. E poi pettinare il codice significa doppio lavoro e spesso non solo per l'autore ma per chi ha ancora la fortuna di lavorare con il codice.

Perché preoccuparsi di scrivere codice quando si può farlo correttamente e scriverlo bene e capire i dettagli?)

Il tuo consiglio è... beh... IMHO


Il tuo consiglio è buono per un programmatore esperto (fortemente sicuro di sé) che può quindi pulire, perché sa dove e cosa deve essere pulito.

 
Nikolay Mitrofanov:

Per me, penso che sia un bene che una persona cerchi di capire e scavi più a fondo...

Non prestando attenzione alle piccole cose, il programmatore prende l'abitudine di scrivere il codice nel modo sbagliato. E poi pettinare il codice significa doppio lavoro e spesso non solo per l'autore ma per chi ha ancora la fortuna di lavorare con il codice.

Perché preoccuparsi di scrivere codice quando si può farlo correttamente e scriverlo bene e capire i dettagli?)

Il tuo consiglio è... beh... IMHO


Il tuo consiglio è buono per un programmatore esperto (fortemente sicuro di sé) che può quindi pettinare, perché sa dove e cosa deve essere pettinato.

Per i principianti tanto più - è meglio almeno in qualche modo, ma per risolvere un problema, invece di rimanere bloccati ad un livello di battibecco da forum come "come si può scrivere qui senza const, e qui senza static, ecc, ecc o - oh amico, se fai questa domanda, allora è meglio che non ti avvicini affatto alla programmazione".

Non passa settimana che qualcuno non mi mandi un indicatore per correggere del codice come questo: for(int i=0;i<Bars;i++). E tu stai sfregando i problemi qui, il che potrebbe darti la velocità... beh, il 30%.

Anche gli EA efficienti (nel senso di velocità di test) sono problemi del loro algoritmo, che ogni volta rinasce per ogni specifica strategia, piuttosto che un problema di complessità della sintassi.

 
Dmitry Fedoseev:

Per i principianti tanto più - è meglio risolvere il problema almeno in qualche modo, piuttosto che rimanere bloccati ad un livello di battibecco da forum come "come si può scrivere qui senza const, e qui senza static, ecc, ecc o - oh amico, se fai questa domanda, allora è meglio che non ti avvicini affatto alla programmazione".

Non passa settimana che qualcuno non mi mandi un indicatore per correggere del codice come questo: for(int i=0;i<Bars;i++). E tu stai strofinando problemi qui, che possono dare velocità... beh, il 30%.

Se un programmatore principiante chiede qualcosa sul forum, significa che vuole sapere la risposta, significa che è interessato e ne ha bisogno. Ho anche creato un thread per ricevere consigli.

Se ho capito bene il senso dell'argomento, la questione dell'implementazione della sua idea non era "basta farlo bene ma farlo funzionare" ma nel modo migliore e più corretto possibile. Questo è un bene. Questo è giusto.

"Solo in qualche modo" per qualsiasi attività è un approccio terribile.

Prima capirlo, poi farlo con cognizione di causa: l'approccio migliore.

 
Nikolay Mitrofanov:

Se un programmatore principiante chiede qualcosa sul forum, significa che vuole sapere la risposta, significa che è interessato e ne ha bisogno. Ha persino creato il thread per ottenere consigli.

Se ho capito bene l'autore del thread, la questione dell'implementazione della sua idea non è più "fare come si vuole solo per farlo funzionare", ma immediatamente il meglio possibile e il più giusto possibile. Questo è un bene. Questo è giusto.

"Solo in qualche modo" per qualsiasi attività è un approccio terribile.

Prima capire, poi fare con la conoscenza è il meglio.

Con la conoscenza di cosa? Se questo algoritmo non esiste in natura, ma devi inventarlo tu, ed è l'algoritmo che definisce tutto.

Motivazione: