28 ! !! paires de devises, 1 expert. Un autre graal, mais celui-là, je pense que personne ne l'a jamais montré. + COMPTE DE DÉMO - page 12

 
Rosh:
J'ai testé "EURUSD sur la plage 2007.07.10 à 2007.07.14, et séparément sur la plage 2007.07.09 à 2007.07.14" comme vous l'avez demandé, il n'y a aucune différence.


J'ai également dû mettre à jour la dernière version. :-) En effet, les problèmes de temps ont disparu, c'est bien. Cependant, il s'avère que l'histoire ne s'arrête pas là.

J'ai exécuté l'EA sur la même période - aucune différence entre le haut et le bas sur M1 et sur H1/D1. Note - J'ai effectué le test sur mes données normales, non endommagées. Pas de synchronisation, etc. Donc ça ne peut pas être la raison de la divergence.

Puis j'ai décidé de l'essayer sur un autre intervalle, juste au cas où (c'est mon mauvais caractère). Et il s'avère que ce n'est pas encore fini.

Essayez l'intervalle de 2007.08.06 à 2007.08.11, c'est-à-dire la dernière semaine. Et la comparaison n'est pas avec D1, mais avec H1. Il y a 4 opérateurs dans le texte de l'Expert Advisor qui doivent être commentés, et 4 opérateurs qui doivent être décommentés. Ce n'est pas que la possibilité d'espionner dans le futur ait été prouvée, non. Mais le problème est présent.

Et comme il est apparu que l'absence de problèmes à un intervalle hebdomadaire n'est pas une garantie qu'il n'y a pas de problèmes du tout, peut-être devrions-nous effectuer le test sur un intervalle beaucoup plus long, par exemple, un an ou six mois ?

 
J'ai examiné le code de votre EA de prospection simple. Malheureusement, il n'était pas parfait, alors je l'ai un peu arrangé :

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {   
//----
  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
 
  mm = TimeMinute(TimeCurrent());
  hh = TimeHour(TimeCurrent());
  dd = TimeDay(TimeCurrent());
  if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
        {  
           Print("Новые сутки наступили");
           curHi=NormalizeDouble(Bid,Digits);
           curLo=NormalizeDouble(Bid,Digits);
           curD1=dd;
        }
        //curHi=NormalizeDouble(Bid,Digits);
        //curLo=NormalizeDouble(Bid,Digits);
        curH1=hh;
     }
     curM1=mm;
  }
  if (NormalizeDouble(Bid,Digits)==0) Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),"  Bid=",Bid);
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);
  //LoH1 =  iLow(NULL,PERIOD_H1,0);
  HiH1 = iHigh(NULL,PERIOD_D1,0);
  LoH1 =  iLow(NULL,PERIOD_D1,0);
  HiH1 = NormalizeDouble(HiH1,Digits);
  LoH1 = NormalizeDouble(LoH1,Digits);
 
  str = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
  mHi = ", curHi=" + DoubleToStr(curHi,Digits);
  mLo = ", curLo=" + DoubleToStr(curLo,Digits);
  hHi = ", HiH1="  + DoubleToStr(HiH1, Digits);
  hLo = ", LoH1="  + DoubleToStr(LoH1, Digits);
  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
 
  if (HiH1!=curHi||LoH1!=curLo) 
  {  //Print(str,mHi,hHi,mLo,hLo);
     if (handle>0) FileWrite(handle,TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),curHi,HiH1,curLo,LoH1);
  }
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{  Print("Работа закончена");
   if (handle>0)
      {FileWrite(handle,"записано ",TimeToStr(TimeLocal()));
      FileClose(handle);
      } 
//---- done
   return(0);
}
Le fait d'un nouveau jour est fixé trop tard dans votre code, en fait, le deuxième jour, alors que la vérification de l'exactitude de la simulation commence juste après le début du test. Pour exclure cette asymétrie, j'ai introduit une variable booléenne start, avec laquelle j'ai fixé toutes les valeurs du test au début de celui-ci.

  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
Comme vous pouvez le voir, cela ne fonctionne qu'une seule fois et n'affecte plus l'EA. Par la suite, tout se passe selon votre algorithme. Si vous ne faites pas d'initialisation primaire, alors vérifiez les chaînes

  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
donnera la valeur curLo=0, alors que curHi n'est pas égal à zéro. L'explication est simple : les deux variables curLo et curHi sont initialement égales à zéro, puisqu'elles ne sont pas initialisées. Au premier tic, la condition

  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
est déclenché et curHi est déjà différent de zéro, car le courant Bid est supérieur à zéro. En même temps, le Bid actuel ne peut pas être inférieur à zéro (curLo n'a pas été initialisé et est donc égal à zéro), et donc la condition

  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
ne peut pas modifier le curLo de quelque manière que ce soit. Exécutez vous-même ma version du conseiller expert et vérifiez que le fichier d'erreur Fu.xls ne contient qu'une seule ligne - l'heure de la dernière cotation simulée dans le testeur.

Le code complet est joint à l'article, il vaut mieux le télécharger car il ne tient pas dans l'article.
Dossiers :
 

Merci, bien sûr, à Rosh pour sa révision, mais je ne pense pas qu'elle était nécessaire.

Peut-être n'avez-vous pas remarqué, mais dans mon code, dans la fonction init(), il y a le bloc suivant :

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Suite à l'exécution de ce bloc, aucune des conditions ne peut être remplie au début de l'exécution de l'EA.

if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
 

Par conséquent, quel que soit le point de départ de l'historique de l'EA, il s'agira toujours d'une nouvelle minute, d'une nouvelle heure ou d'un nouveau jour. Et la première paire d'opérateurs du bloc mentionné explique pourquoi votre déclaration : "Cela s'explique simplement : les deux variables curLo et curHi sont initialement égales à zéro, car elles ne sont pas initialisées. Comme l'offre au premier tick est supérieure à zéro, mais inférieure à 1000, les deux instructions conditionnelles correspondantes sont nécessairement déclenchées et les variables curLo et curHi obtiennent les mêmes valeurs initiales que celles que vous leur avez attribuées dans le bloc if (start) {...}.

Votre version fonctionne tout aussi bien, mais elle n'affecte en rien l'algorithme. Cette modification n'aura donc aucun effet sur la présence ou l'absence d'erreurs.

Notez à nouveau mon message précédent. Le problème ne se produit pas au moment du passage à un nouveau jour ni au début de l'EA mais lors du test du t/f H1. Le problème ne se produit qu'une seule fois dans cet intervalle, le 10.08.2007 et dure 3 minutes de 17:00 à 17:03. Pendant ce temps, 28 ticks sont générés avec une divergence des valeurs hautes pour M1 et H1. Je vous montre l'image appropriée.

Si ce n'est pas difficile pour vous, veuillez exécuter l'EA (le code que vous avez corrigé) sur l'intervalle que j'ai demandé. Corrigez simplement l'utilisation des commentaires. Maintenant dans votre code il compare avec t/f D1 et il n'y a pas d'erreurs dans ce mode. J'en ai besoin pour comparer avec le H1.

 

J'ai un peu modifié le code, pour garder la correction dans des cas particulièrement pathologiques (je n'ai qu'une seule bougie sur M1 pour 2007.01.01, idem pour H1 et D1). J'ai effectué le test de 2007.01.01 à 2007.08.11. J'ai obtenu 4 cas erronés pour D1 et 2 pour H1. Toutes les erreurs se produisent lors de la transition vers une nouvelle bougie sur un TF plus élevé. Ceux qui veulent voir par eux-mêmes.

Elle ne nous donne pas la possibilité de nous projeter dans l'avenir. Au moins dans la variante de voyeurisme que j'ai vérifiée.

Dossiers :
future-2h.mq4  4 kb
 
Yurixx:

Merci, bien sûr, à Rosh pour sa révision, mais je ne pense pas qu'elle était nécessaire.

Peut-être n'avez-vous pas remarqué, mais dans mon code, dans la fonction init(), il y a le bloc suivant :

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Si ce n'est pas difficile pour vous, exécutez l'EA (le code que vous avez corrigé) sur l'intervalle que j'ai demandé. Corrigez simplement l'utilisation des commentaires. Maintenant dans votre code il compare avec t/f D1 et il n'y a pas d'erreurs dans ce mode. J'en ai besoin pour comparer avec le H1.


Vous feriez mieux de poster le code vous-même. Si vous avez remarqué, lorsque je teste mon code sur H1, les valeurs ne sont pas initialisées :
  if (Period()>PERIOD_M1)
  {  Print("Период тестирования не соответствует задаче");
     return(-1);
  }
  Print("Период тестирования ",Period()," минут");
  FileWrite(handle,"Date","Time","curHi","HiH1","curLo","LoH1");
  nn=D'2007.07.12 23:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:02:00';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
 
  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

C'est-à-dire qu'il sera exactement comme je l'ai écrit. S'il vous est difficile d'exposer le code de manière à ce que je ne devine pas de quoi il s'agit, c'est à vous de le comprendre, j'ai d'autres choses à faire que de pratiquer la télépathie.
 

Vraiment, je ne comprends pas pourquoi vous vous énervez.

Comme je l'ai écrit sur la dernière page lorsque j'ai posté l'EA avec les résultats, elle est destinée à être testée. exclusivement sur M1. En même temps, il compare le haut et le bas qu'il génère lui-même avec le haut et le bas du t/f supérieur, qui peut être H1 ou D1, selon le cas, la manière dont les commentaires sont disposés dans le texte de la procédure start().

Franchement, je pensais que return(-1) ; dans la procédure init() arrêtera le travail de l'EA et donc qu'il sera possible de le démarrer uniquement sur M1. Cependant, maintenant, grâce à votre post, je suis convaincu qu'il peut être exécuté sur n'importe quel TF : L'idée derrière cet EA est d'essayer d'espionner le futur d'un t/f inférieur (spécifiquement M1) à un t/f supérieur (spécifiquement H1 ou D1).. Il ne doit donc être exécuté que sur M1. Je ne sais même pas ce que les tests sur le H1 pourraient montrer.

J'ai posté le code EA juste avant votre post. Ce code peut être utilisé directement pour comparer les données M1 avec les données H1. Dans le texte de l'EE, il y a des indications claires sur les changements (élémentaires) qui doivent être faits pour qu'elle puisse comparer les données de M1 avec celles de D1. Donc là aussi, je ne vois pas trop ce qui te déplaît.

Une dernière chose. Votre code est aussi adapté à une exécution par un testeur que le mien. Il s'agit juste de le faire.

Si vous avez d'autres choses à faire, je ne vous dérangerai pas. Je ne m'adressais pas à vous à titre personnel, mais en tant que représentant de MQ, dans le cadre de la découverte éventuelle de certains dysfonctionnements du testeur.

 
Yurixx:

Vraiment, je ne comprends pas pourquoi vous vous énervez.

Comme je l'ai écrit sur la dernière page lorsque j'ai posté l'EA avec les résultats, elle est destinée à être testée. exclusivement sur M1. En même temps, il compare le haut et le bas qu'il génère lui-même avec le haut et le bas du t/f supérieur, qui peut être H1 ou D1, selon le cas, la manière dont les commentaires sont disposés dans le texte de la procédure start().

Franchement, je pensais que return(-1) ; dans la procédure init() arrêtera le travail de l'EA et donc qu'il sera possible de le démarrer uniquement sur M1. Cependant, maintenant, grâce à votre post, je suis convaincu qu'il peut être exécuté sur n'importe quel TF : L'idée derrière cet EA est d'essayer d'espionner le futur d'un t/f inférieur (spécifiquement M1) à un t/f supérieur (spécifiquement H1 ou D1).. Il ne doit donc être exécuté que sur M1. Je ne sais même pas ce que les tests sur le H1 pourraient montrer.

J'ai posté le code EA juste avant votre post. Ce code peut être utilisé directement pour comparer les données M1 avec les données H1. Dans le texte de l'EE, il y a des indications claires sur les changements (élémentaires) qui doivent être faits pour qu'elle puisse comparer les données de M1 avec celles de D1. Donc là aussi, je ne vois pas trop ce qui vous déplaît.

Une dernière chose. Votre code est aussi adapté à une exécution par un testeur que le mien. Il s'agit juste de le faire.

Si vous avez d'autres choses à faire, je ne vous dérangerai pas. Je ne m'adressais pas à vous à titre personnel, mais en tant que représentant de MQ, dans le cadre de la découverte éventuelle de certains dysfonctionnements du testeur.

Je ne comprends pas quelle période je dois utiliser pour exécuter ce test. Je l'ai exécuté sur trois horizons temporels sans intervenir dans le code.

2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily : Travail terminé
2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily : 2007.08.10 23:59:59, curHi=1.3693, HiH1=1.3702, curLo=1.3693, LoH1=1.3689
2007.08.14 16:29:02 2007.08.03 23:59 EURUSD,Quotidien : 2007.08.03 23:59:59, curHi=1.3773, HiH1=1.3787, curLo=1.3773, LoH1=1.3772
2007.08.14 16:29:02 2007.07.27 23:59 EURUSD,Quotidien : 2007.07.27 23:59:59, curHi=1.3635, HiH1=1.3641, curLo=1.3635, LoH1=1.3627
2007.08.14 16:29:02 2007.07.20 23:59:59 EURUSD,Quotidien : 2007.07.20 23:59:59, curHi=1.3826, HiH1=1.3827, curLo=1.3826, LoH1=1.3821
2007.08.14 16:29:01 2007.07.16 23:59:59 EURUSD,Quotidien : 2007.07.16 23:59:59, curHi=1.3772, HiH1=1.3773, curLo=1.3772, LoH1=1.3772
2007.08.14 16:29:01 2007.07.13 23:59:59 EURUSD,Daily : 2007.07.13 23:59:59, curHi=1.3782, HiH1=1.3787, curLo=1.3782, LoH1=1.3780
2007.08.14 16:29:01 2007.07.06 23:59:59 EURUSD,Quotidien : 2007.07.06 23:59:59, curHi=1.3625, HiH1=1.3630, curLo=1.3625, LoH1=1.3623
2007.08.14 16:29:01 2007.07.02 00:00 EURUSD,Daily : La période de test n'est pas appropriée
2007.08.14 16:29:01 future-2h démarré pour les tests
14.08.2007 16:28:34 10.08.2007 22:59 future-2h EURUSD,H1 : Travail terminé
14.08.2007 16:28:32 02.07.2007 00:00 future-2h EURUSD,H1 : La période de test n'est pas appropriée.
2007.08.14 16:28:32 future-2h démarré pour les tests
14.08.2007 16:28:22 10.08.2007 22:59 future-2h EURUSD,M1 : Travail terminé
2007.08.14 16:28:19 2007.07.02 00:00 future-2h EURUSD,M1 : Période de test de 1 minute
2007.08.14 16:28:19 future-2h démarré pour les tests
14.08.2007 16:24:28 10.08.2007 22:59 future-2h EURUSD,M1 : Travail terminé
14.08.2007 16:24:28 06.08.2007 00:00 future-2h EURUSD,M1 : Période de test de 1 minute
 
Maintenant, changez
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1

à

  else if (hh!=curH1)
  {  //curHi=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     //curLo=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     curH1=hh;
     curM1=mm;
  }
  else if (mm!=curM1) curM1=mm;
  
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
et l'a testé à nouveau pour trois périodes du même intervalle de temps 2007.07.01 à 2007.08.11 :
.
<br/ translate="no">
2007.08.14 16:32:03 2007.08.10 23:59 future-2h EURUSD,Daily : Travail terminé
2007.08.14 16:32:03 2007.07.27 23:59 future-2h EURUSD,Daily : 2007.07.27 23:59:59, curHi=1.3753, HiH1=1.3753, curLo=1.3627, LoH1=1.3626
2007.08.14 16:32:01 2007.07.02 00:00 future-2h EURUSD,Daily : La période de test n'est pas appropriée
2007.08.14 16:32:01 future-2h démarrée pour le test
2007.08.14 16:31:56 2007.08.10 22:59 future-2h EURUSD,H1 : Travail terminé
2007.08.14 16:31:54 2007.07.02 00:00 future-2h EURUSD,H1 : La période de test n'est pas conforme à la tâche
2007.08.14 16:31:54 future-2h a commencé pour les tests
2007.2007.08.14 16:31:48 2007.08.10 22:59 future-2h EURUSD,M1 : Travail terminé
2007.08.14 16:31:46 2007.07.02 00:00 future-2h EURUSD,M1 : Période de test 1 minute
2007.08.14 16:31:46 future-2h commencée pour les tests
Qu'est-ce que ça dit ? Je dois analyser à nouveau le code pour vérifier la présence/absence d'erreurs.
 

Je vois. Vous avez fait tout ce qu'il fallait. Et cette EA doit être exécutée uniquement sur M1. Je pense que j'ai écrit assez clairement. Le conseiller expert est exécuté sur M1 et il testera la coïncidence des données hautes et basses de la période M1 avec la période H1 ou D1. S'il y avait un coup d'œil dans le futur, alors les données t/f senior vous permettraient de connaître le High et le Low avant que ces High et Low ne soient atteints sur M1. C'est tout.

Le résultat de votre test D1 correspond au mien, sur cet intervalle pour D1 je n'ai également obtenu aucune erreur. Mais le test H1 ne confirme pas ce que j'ai obtenu et posté un peu plus tôt. Il n'est pas nécessaire d'analyser le code. Comme vous le voyez, cela confirme le fonctionnement normal du testeur.

Si vous pensez que c'est suffisant, vous pouvez vous arrêter là. Si vous voulez être sûr que ce n'est pas par accident, et non pas parce que la période est trop petite, alors exécutez les deux mêmes tests sur une période plus longue. Sur un an, par exemple, ou depuis le début de l'année 2007.

PS

Juste au cas où, je vais répéter. Test uniquement sur la période M1. Uniquement en mode "tous les ticks.

Merci de votre participation.

 
Merci pour les EAs de test, il est parfois difficile de trouver les siens, car il y a tellement d'options de test et on ne sait pas toujours quoi tester. Et l'ennui... Vous savez, on s'énerve plus souvent contre son propre peuple, parce qu'on s'attend à ce qu'il comprenne. Vous devenez involontairement plus dur, et là où vous pardonnez aux autres, vous êtes frustré par les vôtres. Je suis désolé.

Ces tests contribuent réellement à l'amélioration du testeur MetaTrader 4. Surtout avec le code source.
Raison: