Erreurs, bugs, questions - page 1747
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
J'ai vraiment besoin d'aide ! J'essaie de trouver la cause de ce comportement étrange depuis quelques heures. A la fin, j'ai écrit un EA avec un résultat assez inattendu.
string TimeToString( const ulong Time )
{
return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}
void OnTick()
{
static MqlTick PrevTick = {0};
MqlTick NowTick;
if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
PrevTick = NowTick;
}
Le résultat (de bas en haut)
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1) TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1) TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1) TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1) TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1) TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1) TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1) TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476
SymbolInfoTick renvoie parfois (il faut attendre) un tick avec un temps inférieur au précédent !
Mais qu'est-ce que c'est que ça ? Configuration
Terminal C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
J'ai vraiment besoin d'aide ! J'essaie de trouver la cause de ce comportement étrange depuis quelques heures. A la fin, j'ai écrit un EA avec un résultat assez inattendu.
string TimeToString( const ulong Time )
{
return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}
void OnTick()
{
static MqlTick PrevTick = {0};
MqlTick NowTick;
if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
PrevTick = NowTick;
}
Le résultat (de bas en haut)
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1) TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1) TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1) TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1) TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1) TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1) TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1) TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476
SymbolInfoTick renvoie parfois (il faut attendre) un tick avec un temps inférieur au précédent !
Mais qu'est-ce que c'est que ça ? Configuration
Terminal C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
Ligne magique
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }
Séquence d'actions (stricte)
Résultat :
Paramètres ici : https://www.mql5.com/ru/forum/1111/page1127#comment_795376
Oui, vous n'êtes pas le seul à avoir besoin d'aide ici. Cela fait quelques semaines que j'essaie d'enrouler correctement mes tics dans une bougie. Alors... les tics sont toujours à vif. Soumission dans SD#1598238
Tiki roule dans la bougie normalement.
Vraiment ? Et les volumes sont les mêmes ? Et vous avez effectué les contrôles ? Et pouvez-vous au moins montrer les journaux ?
A fait le contrôle - regarder la codobase. Ne vous souciez pas du décalage entre les volumes des chandeliers et les volumes calculés, car il s'agit d'un tick de frontière, qui peut se situer dans l'une ou l'autre barre. Ce n'est pas le principal. J'ai également publié l'indicateur de rotation des transactions sur le forum. Il n'y a donc aucun problème.
Dans votre cas, si vous êtes très intello, vous pouvez vous en prendre au mécanisme de création des barres, mais pas aux CopyTicks.
Erreur de compilation
protected:
void f( int ) {} //(*)
};
class B : public A {
public:
void f( uint ) {}
};
void OnStart()
{
B b;
b.f( 1 ); //'A::f' - cannot call protected member function
}
Et si vous supprimez la ligne (*), tout est OK. Quel est le problème avec B::f(uint) ? Si vous regardez la situation de l'autre côté...
public:
void f( int ) {} //(**)
};
class B : public A {
public:
void f( uint ) {}
};
nous pouvons voir les inconvénients fondamentaux de l'algorithme MQL de recherche d'une fonction correspondante. Dans le 2ème exemple, B::f(uint) sera appelé jusqu'à ce qu'il n'y ait plus de chaîne (**). Dès que la ligne (**) apparaît, A::f(int) sera appelé. Cela signifie que les changements dans la classe de base affectent le résultat final, alors qu'en C++ B::f(uint) sera toujours appelé indépendamment des changements dans la classe de base, ce qui garantit la stabilité du résultat final.
Dans MQL, il s'avère que le développeur de la classe A vient d'inventer une nouvelle fonction publique, et à cause de cela, l'utilisateur de la classe B a arrêté de compiler le code et/ou, ce qui est plus critique, le résultat final a changé...
Ligne magique
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }
Séquence d'actions (stricte)
Résultat :
Paramètres ici : https://www.mql5.com/ru/forum/1111/page1127#comment_795376
Erreur de compilation
protected:
void f( int ) {} //(*)
};
class B : public A {
public:
void f( uint ) {}
};
void OnStart()
{
B b;
b.f( 1 ); //'A::f' - cannot call protected member function
}
Et si vous supprimez la ligne (*), tout est OK. Quel est le problème avec B::f(uint) ? Si vous regardez la situation de l'autre côté...
public:
void f( int ) {} //(**)
};
class B : public A {
public:
void f( uint ) {}
};
nous pouvons voir les inconvénients fondamentaux de l'algorithme MQL de recherche d'une fonction correspondante. Dans le 2ème exemple, B::f(uint) sera appelé jusqu'à ce qu'il n'y ait plus de chaîne (**). Dès que la ligne (**) apparaît, A::f(int) sera appelé. Cela signifie que les changements dans la classe de base affectent le résultat final, alors qu'en C++ B::f(uint) sera toujours appelé indépendamment des changements dans la classe de base, ce qui garantit la stabilité du résultat final.
Dans MQL, il s'avère que le développeur de la classe A vient d'inventer une nouvelle fonction publique\protégée\privée et qu'à cause de cela, l'utilisateur de la classe B a arrêté de compiler le code et/ou, plus grave, le résultat final a changé.
La constante "1" dans l'appel b.f( 1 ) est interprétée comme int. Faites une conversion explicite et tout fonctionnera :
b.f( (uint)1 );
Dans votre cas, si vous êtes très intello, vous pouvez vous en prendre au mécanisme de création des barres, mais pas aux CopyTicks.