Errori, bug, domande - pagina 1658

 
Alexey Volchanskiy:

Indipendentemente dalla domanda, chiamare qualsiasi funzione è sempre più lento che accedere a una variabile sullo stack, in questo caso nType.

A prescindere da questa ovvietà, la domanda riguardava le funzioni in linea. Cioè, OrderType() non è sostituito a tempo di compilazione da qualcosa come order.type.

Personalmente metto sempre in cache questechiamate di funzioni MQL, come nel tuo secondo caso.

Come hanno dimostrato le misurazioni, non è necessario.

 
Sergei Vladimirov:

A prescindere da questa ovvietà, la domanda riguardava le funzioni in linea. Cioè, OrderType() non è sostituito da qualcosa come order.type durante la compilazione.

Come hanno dimostrato le misurazioni, questo non è necessario.

A giudicare dall'implementazione interna degli array, lo stesso ArraySize deve essere inline. Ma io lo uso sempre così (non l'ho misurato)

Invece di

for (int i = 0; i < ArraySize(Array); i++)

Io uso

const int Amount = ArraySize(Array);

for (int i = 0; i < Amount; i++)
In termini di prestazioni, sono stato recentemente sorpreso da questo fatto

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

Come si fa a passare un'enumerazione in modo coerente?

fxsaber, 2016.08.22 09:13

Aggiunto statico all'array. È quasi tre volte più veloce dello switch! Cestino tale interruttore. Grazie per il suggerimento!
Quindi, sembra che sia meglio non fare affidamento sull'ottimizzazione del compilatore, ma "aiutarlo" sempre attraverso le più piccole chiamate di funzione e usando ovunque possibile e logicamente const e static.
 
Sergei Vladimirov:

A prescindere da questa ovvietà, la domanda riguardava le funzioni in linea. Cioè, OrderType() non è sostituito da qualcosa come order.type durante la compilazione.

Come hanno dimostrato le misure, non è necessario.

L'hai scritto tu stesso:

Sergei Vladimirov2016.09.01 02:53 RU

L'ho controllato io stesso. Il secondo codice è 4 volte più veloce. È tutto chiaro, la questione è fuori discussione.

 
Sergei Vladimirov:
L'ho provato io stesso. Il secondo codice è quattro volte più veloce. Tutto è chiaro, la domanda è rimossa.
Non misurate solo in modalità profiling/debug. Non c'è proprio nessuna linea. Solo la versione di rilascio dovrebbe essere lì.
 
Inv Андрей Иващенко:

Buon pomeriggio!

Signori ufficiali, potete dirmi da dove cominciare a prendere una cimice?

Consulente esperto multivaluta. Dopo il primo scambio il tester si ferma.

Dà un errore, il cui codice non riesco a trovare.

Sì, il tester funziona bene dalla data di inizio 2016.05.01. Se cambio questa data - il tester si ferma e da errore, log sotto.

Aiuto per favore!

Rispondere a me stesso:

Questo è un bug nel tester. Per ora è necessario aggiungere l'handle di qualsiasi indicatore tecnico in OnInit a tutti i simboli su cui lavora l'Expert Advisor.

 
Alexey Volchanskiy:

L'hai scritto tu stesso:

Sergei Vladimirov2016.09.01 02:53 RU

L'ho controllato io stesso. Il secondo codice è 4 volte più veloce. È tutto chiaro, la questione è fuori discussione.

Nel commento successivo ho scritto delle cifre: il guadagno con una sola operazione è di 1 nanosecondo. Quando si ottimizza una strategia per tick su un tratto di due anni e diverse migliaia di corse, salvare un ns potrebbe avere senso. Ma nel trading reale...
 
A100:

Nella build 1398 l'errore 'EX5 loading failed' è ancora presente (apparentemente non legato a quell'esempio).

Nella build 1400 fissa l'errore in un caso simile è ora riprodotto come 'chiamata di funzione virtuale pura'. E senza un commento va bene

//Script1.mq5
typedef void (*fn)();
#import "Script2.ex5"
        void g( fn );
#import
void h() /*export*/ {} //если export без комментария - нормально
void OnStart() { g( h ); }
//Script2.mq5
#property library
typedef void (*fn)();
void g( fn f ) export { f(); }
 

Non può essere applicato :: per risolvere l'ambiguità


#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void g();
#import
typedef void (*fn)();
void OnStart()
{
        Script1::g(); //нормально
        Script2::g(); //нормально
        fn f = Script1::g; //Error
}
 
Inv Андрей Иващенко:

Rispondere a me stesso:

Questo è un bug nel tester. Per ora dovreste aggiungere un handle di qualsiasi indicatore tecnico in OnInit a tutti i simboli su cui lavora l'Expert Advisor.

E sembra che il problema si verifichi quando si ottiene solo il primo tick su una nuova barra, il tester sembra "bloccarsi" e rimane indietro di 1 barra, cioè, l'EA pensa che la barra non esista e nella visualizzazione in realtà non lo fa, ma dopo un paio di secondi la barra appare, nel caso di test su M1 il valore corretto arriva sul secondo tick (se ho capito bene), spero che gli sviluppatori sistemino questo fastidioso momento il prima possibile ...

aggiunta:

si scopre che per aggirare questo punto ora bisogna saltare artificialmente il primo tick di una nuova barra...

 
Impossibile fare il debug dell'EA su RTS-9.16 BCS-MetaTrader5 con CTRL+F5. Il tester scrive
Tester  Leverage 1:1 set error

Motivazione: