Analogue à iBarShift - page 7

 

Voici la version la plus rapide, qui fonctionne correctement sur tous les TF :

int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static int PerSec=::PeriodSeconds(LastTimeFrame);

   if(LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   if(TimeFrame<PERIOD_D1) time-=time%PerSec;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX);
      if(TimeFrame<PERIOD_D1) Res--;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }

   return(Res);
  }

La vitesse ralentit pour TF D1, W1 et MN1

Et voici un indicateur de test, qui montre clairement la réponse des différentes versions, ainsi que leur vitesse ( le deuxième chiffre. Plus le chiffre est petit, plus la fonction est rapide)


Les versions 3 et 4 fonctionnent correctement. Mais le troisième est plus rapide.

Les variantes avec CopyTime sont les plus lentes.

Ceci peut être vérifié dans MQL4 (voir l'indicateur ci-joint).

Je ne précise pas la paternité des différentes variantes, car je me suis déjà embrouillé.
Mais le troisième moyen, le plus utile, est celui de 80% de@fxsaber. Je l'ai seulement un peu modifié.

Dossiers :
 
Nikolai Semko:

Les options 3 et 4 fonctionnent correctement. Mais le 3 est le plus rapide. Les variantes de CopyTime sont les plus lentes.

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

Discussion sur "LifeHack for trader : mixer ForEach sur les définitions (#define)"

fxsaber, 2018.02.14 11:58

Les mesures de vitesse de la fonction ZZY doivent être effectuées dans un environnement où les performances sont importantes - Testeur.

 
fxsaber:

Les mesures n'ont pas vraiment d'importance ici. Vous pouvez voir que la logique est la plus rapide.

 
Nikolai Semko:

Voici la version la plus rapide, qui fonctionne correctement sur tous les TF :

La vitesse ralentit pour TF D1, W1 et MN1

Et voici un indicateur de test, qui montre clairement la réponse des différentes versions, ainsi que leur vitesse ( le deuxième chiffre. Plus le chiffre est petit, plus la fonction est rapide)


Les versions 3 et 4 fonctionnent correctement. Mais le troisième est plus rapide.

Les variantes avec CopyTime sont les plus lentes.

Il peut être vérifié dans MQL4 (voir l'indicateur ci-joint).

Je n'indique pas la paternité des différentes variantes car je suis déjà confus.
Mais la troisième variante, la plus efficace, est celle de 80% de@fxsaber. Je l'ai seulement un peu modifié.

J'ai ajouté TF à votre indicateur - les deux premiers algorithmes ne sont pas du tout utiles.

Dans les chiffres, le TF actuel est H1, et le calcul est basé sur les taux journaliers.



 
Renat Akhtyamov:
Oui (en surbrillance)

-1 est un moins un (pour clarifier), renvoyé par la fonction d'erreur, qui dit qu'il n'y a pas de telle barre.

Donc ma fonction

doit également être affiné

cependant...

Documentation :

"Note.

Si les données des séries chronologiques avec les paramètres spécifiés lors de l'appel de la fonction Bars() n'ont pas encore été générées dans le terminal, ou si les données des séries chronologiques ne sont pas synchronisées avec le serveur commercial au moment de l'appel de la fonction, alors la fonction renverra la valeur zéro. "

====

Si res==0, alors nous attraperons -1 de la fonction telle qu'elle est.

===

Donc tout fonctionne, utilisez-le à votre avantage !

Sur l'indicateur ci-dessus, vous pouvez clairement voir à quel point cette méthode est fausse.

 
Nikolai Semko:

Voici la version la plus rapide, qui fonctionne correctement sur tous les TF :

La vitesse ralentit pour TF D1, W1 et MN1

Et voici un indicateur de test, qui montre clairement la réponse des différentes versions, ainsi que leur vitesse ( le deuxième chiffre. Plus le chiffre est petit, plus la fonction est rapide)


Les versions 3 et 4 fonctionnent correctement. Mais le troisième est plus rapide.

Les variantes avec CopyTime sont les plus lentes.

Il peut être vérifié sur MQL4 (voir l'indicateur ci-joint).

Je n'attribue pas la paternité des différentes variantes, car je suis déjà confus.
Mais la troisième variante, la plus efficace, est celle de 80% de@fxsaber. Je l'ai seulement un peu modifié.

La varianteiBarShift3 ne fonctionne pas correctement.

 

Voici ma version. Il semble fonctionner avec les cadres junior et senior. La vitesse est un peu plus rapide que celle de iBarshift3.


int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime time){

datetime t1 = TimeCurrent()+10000000 ;

int ps = PeriodSeconds(timeframe) ;

double div = temps/(double)ps ;

double mant = div - MathFloor(div) ;

int ret = Bars(symbol, timeframe, (datetime)(time-(ps*mant)), t1)-1 ;

retour(ret) ;

}

 
Vitaly Muzichenko:

L'optioniBarShift3 ne fonctionne pas correctement.

Puis-je avoir un exemple de fonctionnement incorrect ?

Il ne reste donc que l'option 4 ?

 
Vitaly Muzichenko:

L'optioniBarShift3 ne fonctionne pas correctement.

Le vocabulaire est notre tout.

 
Nikolai Semko:

Le vocabulaire est tout pour nous.

J'ai fait une vérification rapide : il y a une fonction qui fonctionne depuis plus d'un jour, j'ai substituéiBarShift3 à la place et j'ai obtenu un fonctionnement incorrect de l'EA. C'est ainsi que je suis arrivé à ma conclusion.

Voici celui que j'utilise

int iBarShift(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 we always return 0
  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);
 }