Analogue à iBarShift - page 9

 
Alain Verleyen:

Quel problème avez-vous rencontré ?

Voici un exemple de votre fonction fonctionnant faussement sous le nom de "BarShift1".


 
Aleksey Vyazmikin :

Voici un exemple de votre fonction fonctionnant faussement - elle fonctionne sous le nom "BarShift1".


En fait, il montre seulement le contraire, ma version est la seule qui soit correcte. (Et le iBarShift1 original de ce code est correct).

Ma version a été conçue comme une fonction autonome, tout comme mql4 iBarShift.

Il n'est pas optimisé pour les requêtes multiples, la comparaison de temps n'est donc pas pertinente. @nicholishen a publié une bonne bibliothèque optimisée pour les appels de masse.


En fait, il montre juste l'inverse, ma version est la seule qui soit correcte. (Aussi l'original iBarShift1 de ce code est correct).

Ma version a été conçue pour être utilisée comme une fonction autonome, exactement comme mql4 iBarShift.

Il n'est pas optimisé pour les requêtes multiples, la comparaison des temps n'est donc pas pertinente. @nicholishen a publié une bonne bibliothèque optimisée pour les appels en masse.

iBarShift
iBarShift
  • votes : 46
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4 (например, 1,2,3). В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки. В качестве альтернативы многие программисты предложили свои варианты реализации этой функции на MQL5. Обнаружилось, что все 4 версии содержат ошибки (не воспроизводят в точности работу...
 
Alain Verleyen:

En fait, il montre seulement le contraire, ma version est la seule qui soit correcte. (Et le iBarShift1 original de ce code est correct).

Ma version a été conçue comme une fonction autonome, tout comme mql4 iBarShift.

Il n'est pas optimisé pour les requêtes multiples, la comparaison de temps n'est donc pas pertinente. @nicholishen a publié une bonne bibliothèque optimisée pour les appels de masse.


En fait, il montre juste l'inverse, ma version est la seule qui soit correcte. (Aussi l'original iBarShift1 de ce code est correct).

Ma version a été conçue pour être utilisée comme une fonction autonome, exactement comme mql4 iBarShift.

Il n'est pas optimisé pour les requêtes multiples, la comparaison des temps n'est donc pas pertinente. @nicholishen a publié une bonne bibliothèque optimisée pour les appels en masse.

Je ne parle pas du temps de traitement, je parle du numéro de barre.

Dans l'image, vous pouvez voir qu'à 8:37, le code pense que la barre la plus proche est la barre du jour précédent 23:00, mais en fait la barre la plus proche est 10:00. Il est plus proche à la fois mathématiquement et logiquement.

 
Aleksey Vyazmikin:

Je ne parle pas du temps de traitement, je parle du numéro de barre.

L'image montre qu'à 8:37 le code considère que la barre la plus proche est celle du jour précédent à 23:00, mais en fait la barre la plus proche est à 10:00. Il est plus proche à la fois en mathématiques et en logique.

Simplifions les choses.

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

Analogue à iBarShift

Alain Verleyen, 2018.04.05 00:18

En fait, il montre seulement le contraire, ma version est la seule qui soit correcte. (Et le iBarShift1 original de ce code est correct).

Ma version a été conçue comme une fonction autonome, tout comme mql4 iBarShift.

Essayez mql4, comparez, même chose.
 
Alain Verleyen:
Simplifions les choses.
Essayez mql4, comparez, même chose.

Je vois votre argument. Je ne le vérifierai pas. Apparemment, c'est ma tâche qui diffère de la logique admise.

 
Alain Verleyen:

Quel problème avez-vous découvert ?

J'ai écrit ça il y a longtemps. Je ne me souviens plus, mais quelque chose m'a troublé.
Quoi qu'il en soit, je n'ai trouvé qu'une seule situation anormale.
Lorsque les données du symbole ne sont pas encore chargées, elles peuvent renvoyer -1 et devraient renvoyer 0.

Cela peut être vérifié en utilisant le script pour MQL4 que je joins.

Ce script prend un temps et une période de temps aléatoires. Si la valeur de iBarShiftX ne correspond pas à la fonction régulière de iBarShift, alors le message est envoyé via Print.

Si vous exécutez ce script sur un symbole nouvellement ouvert, vous verrez des erreurs. La ré-exécution du script sur le même symbole ne donnera pas d'erreur.

Mais c'est une broutille. Dans ma version, le problème est le même.

Je n'ai qu'un seul reproche à faire à votre version : elle est très compliquée et lente.

Voici votre variante :

int iBarShift2(string symbol,ENUM_TIMEFRAMES timeframe,datetime time,bool exact=false)
  {
   datetime LastBAR;
   if(!SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,LastBAR))
     {
      datetime opentimelastbar[1];
      if(CopyTime(symbol,timeframe,0,1,opentimelastbar)==1)
         LastBAR=opentimelastbar[0];
      else
         return(-1);
     }
   if(time>LastBAR)
      return(0);
   int shift=Bars(symbol,timeframe,time,LastBAR);
   datetime checkcandle[1];

   if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)
     {
      if(checkcandle[0]==time)
         return(shift-1);
      else if(exact && time>checkcandle[0]+PeriodSeconds(timeframe))
         return(-1);
      else
         return(shift);
     }
   return(-1);
  }

Et voici ma fonction, qui fait la même chose, mais avec un algorithme simple et beaucoup plus rapide :

  int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   return(Bars(Symb,TimeFrame,time+1,UINT_MAX));
  }

Vous pouvez en utiliser un encore plus court sans la fonction :

Bars(Symb,TimeFrame,time+1,UINT_MAX);

Essayez de prouver le contraire. Trouvez une combinaison unique de paramètres lorsque votre fonction et la mienne afficheront des valeurs différentes.

Seulement, je n'y ai pas implémenté le dernier paramètre exact, car je ne comprends pas pourquoi il est nécessaire. Personnellement, je n'en ai jamais eu besoin.

Mais si quelqu'un en a vraiment besoin, elle peut être mise en œuvre.

J'ai laissé la variante iBarShift3, car elle ne gère pas correctement les trous d'histoire. Il peut être corrigé, mais je n'en vois pas l'intérêt, car l'option ci-dessus est suffisante.

Dossiers :
 
Nikolai Semko:


J'ai laissé l'option iBarShift3 car elle ne gère pas correctement les trous d'histoire. Il peut être corrigé, mais je n'en vois pas l'intérêt, car l'option ci-dessus est suffisante.

Les trous sont-ils dus à l'absence de pro-trading sur le bar, ou à d'autres ? Et, comment l'inexactitude se manifeste-t-elle ?

 
Aleksey Vyazmikin:

Les trous sont-ils dus à un manque de pro-trading sur le bar, ou autre ? Et quelle est l'inexactitude ?

Prenons un dimanche où il n'y a pas de commerce :

Print("iBarShift  = "+IntegerToString(iBarShift (_Symbol,PERIOD_H1,D'01.04.2018 10:00:00')));  
Print("iBarShift3 = "+IntegerToString(iBarShift3(_Symbol,PERIOD_H1,D'01.04.2018 10:00:00'))); // показывает на единицу меньше
 
Nikolai Semko:

Supposons que nous prenions le dimanche n'importe quel jour où il n'y a pas de commerce :

Donc ça montre lundi ? C'est ce que je veux... :)

 
Pourquoi n'essayez-vous pas ma fonction ? Il y a là une solution qui neutralise le début et la fin des barres dans le temps. Il semble tout calculer correctement. Et il est plus rapide en temps que votre version 3 la plus rapide. Ou la branche est plus importante ?) Ou y a-t-il une erreur là aussi ?) Je l'utilise depuis longtemps....