Erreurs, bugs, questions - page 1747

 

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.

#define TOSTRING(A) #A + " = " + (string)A + "\n"

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(NowTick.time_msc) = 2016.10.31 12:58:10.698
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

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
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.)
 
fxsaber:

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.

#define TOSTRING(A) #A + " = " + (string)A + "\n"

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(NowTick.time_msc) = 2016.10.31 12:58:10.698
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

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
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.)
Oui, vous n'êtes pas le seul à avoir besoin d'aide ici. J'essaie de rouler les ticks normalement dans une bougie depuis quelques semaines maintenant. Alors... les tiques sont encore à vif. Demande au CA#1598238
 

Ligne magique

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Séquence d'actions (stricte)

  1. Placez les fichiers joints dans le même dossier. Puis avec la souris dans le MetaEditor
  2. Fichier->Ouvrir->Sélectionner Test.mqh->Bouton Ouvrir
  3. Édition->Recherche et remplacement->Remplacer->remplir les champs Rechercher : et 'Remplacer par:' comme indiqué ci-dessous->le bouton 'Remplacer tout'.

Résultat :

Paramètres ici : https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Dossiers :
Test.mqh  1 kb
key.mqh  1 kb
 
Alexey Kozitsyn:
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
Les tics roulent dans la bougie normalement.
 
fxsaber:
Tiki roule dans la bougie normalement.
Vraiment ? Et les volumes correspondent ? Et avez-vous fait les contrôles ? Et pouvez-vous au moins montrer les journaux ?
 
Alexey Kozitsyn:
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

class A {
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é...

class A {
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é...

 
A100:

Ligne magique

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Séquence d'actions (stricte)

  1. Placez les fichiers joints dans le même dossier. Puis avec la souris dans le MetaEditor
  2. Fichier->Ouvrir->Sélectionner Test.mqh->Bouton Ouvrir
  3. Édition->Recherche et remplacement->Remplacer->Remplir les champs Rechercher : et 'Remplacer par:' comme indiqué ci-dessous->le bouton 'Remplacer tout'.

Résultat :

Paramètres ici : https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Merci pour le post, le bug sera corrigé dans la prochaine mise à jour.
 
A100:

Erreur de compilation

class A {
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é...

class A {
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 ); 

 
fxsaber:

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.

Je ne suis pas d'accord avec vous, car les erreurs dans les logs, que j'ai démontrées dans une branche sur le test de CopyTicks(), montrent le contraire. Et... de quoi parlez-vous ? Sommes-nous en train de faire des suppositions, du genre "est-ce que ça va marcher / ça ne marchera pas" ? C'est vous qui vous êtes plaint du problème quelques posts plus haut !? Quelle différence cela fait-il alors ? Et si une tique dépasse l'autre, quelle différence cela fait-il ?