Erreurs, bugs, questions - page 1658

 
Sergei Vladimirov:

Indépendamment de cette évidence, la question portait sur les fonctions en ligne. C'est-à-dire que OrderType() n'est pas remplacé par quelque chose comme order.type lors de la compilation.

Comme les mesures l'ont montré, cela n'est pas nécessaire.

À en juger par l'implémentation interne des tableaux, le même ArraySize doit être en ligne. Mais je l'utilise toujours de cette façon (je ne l'ai pas mesuré)

Au lieu de

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

J'utilise

const int Amount = ArraySize(Array);

for (int i = 0; i < Amount; i++)
En termes de performances, j'ai été récemment surpris par ce fait

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Comment faire pour passer une énumération de manière cohérente ?

fxsaber, 2016.08.22 09:13

Ajouté statique au tableau. C'est presque trois fois plus rapide que le commutateur ! Mettez à la poubelle un tel interrupteur. Merci pour le conseil !
Il semble donc préférable de ne pas compter sur l'optimisation du compilateur, mais de toujours "l'aider" en faisant des appels de fonction les plus petits possibles et en utilisant partout où c'est possible et logique const et static.
 
Sergei Vladimirov:

Indépendamment de cette évidence, la question portait sur les fonctions en ligne. C'est-à-dire que OrderType() n'est pas remplacé par quelque chose comme order.type lors de la compilation.

Comme les mesures l'ont montré, c'est inutile.

Vous l'avez écrit vous-même :

Sergei Vladimirov2016.09.01 02:53 RU

Je l'ai vérifié moi-même. Le second code s'exécute 4 fois plus vite. C'est clair, la question n'est plus sur la table.

 
Sergei Vladimirov:
Je l'ai testé moi-même. Le second code s'exécute quatre fois plus vite. Tout est clair, la question est supprimée.
Ne mesurez pas uniquement en mode profilage/débogage. Il n'y a pas du tout de ligne ici. Seule la version Release devrait être là.
 
Inv Андрей Иващенко:

Bonjour !

Messieurs les officiers, pouvez-vous me dire où commencer à attraper un insecte ?

Conseiller expert multi-devises. Après la première transaction, le testeur s'arrête.

Donne une erreur, dont je ne trouve pas le code.

Oui, le testeur fonctionne bien à partir de la date de début 2016.05.01. Si je change cette date - le testeur s'arrête et une erreur se produit, log ci-dessous.

Aidez-nous !

Répondre à moi-même :

C'est un bug dans le testeur. Pour l'instant, vous devez ajouter la poignée de n'importe quel indicateur technique dans OnInit à tous les symboles, sur lesquels le conseiller expert travaille.

 
Alexey Volchanskiy:

Vous l'avez écrit vous-même :

Sergei Vladimirov2016.09.01 02:53 RU

Je l'ai vérifié moi-même. Le second code s'exécute 4 fois plus vite. C'est clair, la question n'est plus sur la table.

Dans le commentaire suivant j'ai écrit des chiffres : le gain avec une seule opération est de 1 nanoseconde. Lorsque l'on optimise une stratégie par ticks sur une période de deux ans et plusieurs milliers d'exécutions, il peut être judicieux d'économiser une ns. Mais dans le commerce réel...
 
A100:

Dans la version 1398, l'erreur "EX5 loading failed" est toujours présente (apparemment sans rapport avec cet exemple).

Dans la version corrigée de 1400, l'erreur dans un cas similaire est maintenant reproduite comme "appel de fonction virtuelle pure". Et sans commentaire, c'est bien

//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(); }
 

Ne peut être appliqué : : pour résoudre une ambiguïté


#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 Андрей Иващенко:

Réponse à moi-même :

C'est un bug dans le testeur. Pour l'instant, vous devriez ajouter un handle de n'importe quel indicateur technique dans OnInit à tous les symboles, sur lesquels le conseiller expert travaille.

Et il semble que le problème se produit lorsque l'on obtient seulement le premier tick sur une nouvelle barre, le testeur semble "coincé" et traîne 1 barre derrière, c'est-à-dire que l'EA pense que la barre n'existe pas et en visualisation elle n'existe vraiment pas, mais après quelques secondes la barre apparaît, dans le cas du test sur M1 la valeur correcte arrive sur le deuxième tick (si je comprends bien), j'espère que les développeurs vont corriger ce moment ennuyeux dès que possible ...

addition :

il s'avère que pour contourner ce point, il faut maintenant sauter artificiellement le premier tick d'une nouvelle barre...

 
Impossible de faire le débogage de l'EA sur RTS-9.16 BCS-MetaTrader5 par CTRL+F5. Le testeur écrit
Tester  Leverage 1:1 set error

 
Dans le visualiseur, F12 est utilisé pour passer au tick suivant. Est-il possible de spécifier l'heure avec une précision de l'ordre de la milliseconde dans Market Watch ? Après tout, nous nous déplaçons par tic-tac.