Analogue à iBarShift - page 11

 
Nikolai Semko:

Ouais, eh bien, c'est en fait un comportement étrange pour une fonction standard. Après tout, il s'agit exactement d'adapter des valeurs à son "repère".

La fonction standard iBarShift de MQL4, lorsque le temps demandé tombe dans un trou, renvoie le numéro de la barre de gauche (c'est-à-dire samedi dans ce cas), et iBarShift3 renvoie le numéro de la barre de droite du trou (c'est-à-dire lundi), ce qui est plus logique.

Si nous sommes dans le trou, il est logique de renvoyer la barre de gauche, la dernière valeur connue, mais pas le futur.

 
Vitaly Muzichenko:

Si nous sommes dans un trou, il est logique de renvoyer la barre de gauche, la dernière valeur connue, mais pas le futur.

Bon, ça n'a pas de sens. J'ai confondu le passé avec le futur). Probablement parce que 1 (passé) > 0 (futur). Programmée.
 
Alain Verleyen:


Dans la plupart des cas, cette fonction renvoie le mauvais résultat

PS : Est-il nécessaire de poster la version anglaise ou la traduction russe est correcte ?

Oui, la traduction est correcte.

Exécutez ce script et vous verrez que les fonctions produisent exactement le même résultat.

Pouvez-vous donner un exemple d'une période et du moment où les valeurs de ces fonctions sont différentes ?

D'ailleurs, votre fonction est souvent erronée. Renvoie la valeur -1

2018.04.04 22:51:05.666 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:46.867 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:46:00
2018.04.04 22:50:41.255 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:50:23.496 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:05.596 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:48:38.638 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
Dossiers :
 
Alain Verleyen:

L'exigence est d'avoir UNIQUEMENT une version de mql4.


Votre fonction ne fonctionne pas correctement avec le paramètre exact=true.

Cela peut être vu dans ce script.

Et voici un analogue fonctionnel de la fonction iBarShift avec les paramètres exacts :

int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

Sans ce paramètre, il peut être simplifié sous cette forme :

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Dossiers :
 
Nikolai Semko:

Oui, la traduction est correcte.

Exécutez ce script et vous verrez que les fonctions produisent exactement le même résultat.

Pouvez-vous donner un exemple d'une période et du moment où les valeurs de ces fonctions sont différentes ?

D'ailleurs, votre fonction est souvent erronée. Renvoie la valeur -1

S'il vous plaît, soyez sérieux. Mon code est pour mql5.

Il renvoie -1 car la fonction Bars() n'est pas fiable sous MT4.

...   
   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);
     }
...

Script fonctionnant sur AUDUSD, graphique M5.

Cela ne se produit pas avec MT5.

 
Alain Verleyen:

S'il vous plaît, soyez sérieux. Mon code est pour mql5.

Il renvoie -1 car la fonction Bars() n'est pas fiable sous MT4.

Script fonctionnant sur AUDUSD, graphique M5.

Cela ne se produit pas avec MT5.

Vous avez dit que cela devait fonctionner comme dans MQL4.

Mais ce script peut également être exécuté sur MQL5.

2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M3  BarShift1 = -1  BarShift2 = 0    2018.08.10 18:39:49   exact = true
2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.04.15 00:25:08   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M6  BarShift1 = -1  BarShift2 = 0    2018.04.21 04:26:03   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M15  BarShift1 = -1  BarShift2 = 0    2018.05.29 17:10:52   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M12  BarShift1 = -1  BarShift2 = 0    2018.09.16 13:10:33   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.09.25 21:24:50   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.05.30 20:04:10   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M5  BarShift1 = -1  BarShift2 = 0    2018.04.29 16:12:16   exact = true

Si exact=True et le temps futur vous devez retourner -1.

Mon script a également trouvé une erreur étrange :

Cette erreur est confirmée par ce contrôle :

Print (iBarShift2(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // -1
Print (iBarShift1(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // 28
J'avais donc raison sur l'existence de situations anormales dans votre algorithme après tout.
Dossiers :
 

De toute l'analyse que j'ai faite, nous pouvons conclure que cet analogue complet de l'iBarShift :

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

est de loin la plus correcte, et en même temps la plus rapide, avec l'algorithme le plus simple et le plus court.

Si vous n'avez pas besoin du paramètre exact, vous pouvez utiliser la version simplifiée :

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

ou utilisez simplement cette version équivalente sans appeler la fonction:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Ou ai-je tort ?
 
Le silence est un signe d'accord.
 
Nikolai Semko:
Le silence est un signe d'accord.

Par CTRL+SHIFT+F dans ME, j'ai fait une recherche pour "BarShift". Il s'avère que je n'utilise pas une fonction similaire. Apparemment, je n'en avais pas besoin moi-même.

J'ai écrit une variante pour convertir les EA de MT4 en MT5 en une seule ligne. Il semble que ce soit la seule raison de l'écrire.

Je ne travaille pas avec les bars et je ne comprends pas pourquoi les autres ne font pas de même.

Je ne suis pas entré dans votre code. Mais on est toujours content quand on trouve une solution rapide.

 
fxsaber:

Par CTRL+SHIFT+F dans ME, j'ai fait une recherche pour "BarShift". Il s'avère que je n'utilise pas une fonction similaire. Apparemment, je n'en avais pas besoin moi-même.

J'ai écrit une variante pour convertir les EA de MT4 en MT5 en une seule ligne. Il semble que ce soit la seule raison de l'écrire.

Je ne travaille pas avec les bars et je ne comprends pas pourquoi les autres ne font pas de même.

Je ne suis pas entré dans votre code. Mais on est toujours content quand on trouve une solution rapide.

Je comprends ce que vous voulez dire, mais pour moi, il est toujours urgent de travailler avec des barres. Peut-être qu'un jour, cela deviendra un rudiment pour moi aussi.