Analogue à iBarShift - page 6

 
Vasiliy Pushkaryov:

TimeCurrent() est juste un cas particulier que j'ai relevé.

Je lis maintenant plus attentivement cette note sur la fonction Bars():

"Lorsque l'on demande le nombre de bars dans une plage de dates donnée , seuls les bars dont l'heure d'ouverture se situe dans cette plage sont pris en compte. Par exemple, si le jour actuel de la semaine est le samedi, lorsque l'on demande le nombre de barres hebdomadaires avec start_time=lastTuesday et stop_time=lastFriday, la fonction renvoie 0 parce que l'heure d'ouverture du cadre hebdomadaire tombe toujours le dimanche et qu'aucune barre hebdomadaire ne tombe dans la plage spécifiée".

Comme TimeCurrent() est presque toujours postérieur à l'heure d'ouverture de la barre actuelle, la fonction Bars() renvoie 0. Donc, si nous passons l'heure correspondant à 02:05 sur le timeframe horaire comme paramètre start_time , et que nous voulons que la barre qui a commencé à 2 heures soit valide, alors nous devons obtenir l'heure d'ouverture de la barre (02:00:00) par CopyTime() . Sinon, la fonction Bars() ignorera cette barre.

Par exemple, si l'heure est 3:30, je comprends que l'heure 2:05 dans le cadre horaire se réfère à la barre avec l'indice 1. Aucune des fonctions de la 2ème page ne retournera cet indice. Avec cette correction la fonction de Renat Akhtyamov a retourné ce que j'attendais.

Je joins un script, avec 4 options pour les fonctions de recherche d'index, que j'ai utilisé comme test.

J'ai essayé la fonction présentée, il s'avère qu'elle ment d'une barre, si elle demande une barre avec un temps qui n'est pas sur le graphique. Par exemple, si nous voulons connaître la première mesure du jour, et demandons l'heure "28.03.2018 00:00". mais il n'y a pas de barre à cette heure, nous obtiendrons l'indice de la dernière barre du jour précédent.

Ou c'était censé être comme ça ?

 
Aleksey Vyazmikin:

J'ai essayé la fonction présentée et il s'avère qu'elle ment d'une barre, si une barre est demandée avec un temps qui n'est pas sur le graphique. Par exemple, si nous voulons connaître la première mesure de la journée, et demandons l'heure "28.03.2018 00:00". mais il n'y a pas de barre à cette heure, nous obtiendrons l'indice de la dernière barre du jour précédent.

Ou c'était censé être comme ça ?

Comment passe-t-on le temps, par une ficelle ?
 
Renat Akhtyamov:
Comment passez-vous le temps, à la corde ?

J'ai essayé à la fois avec une chaîne et comme dans le code posté précédemment.

int teset_01=iBarShift(_Symbol,PERIOD_CURRENT,StringToTime("30.03.2018 00:00"),false);
Print ("teset_01=",teset_01);
 
Aleksey Vyazmikin:

J'ai essayé à la fois avec une chaîne de caractères et comme dans le code posté précédemment.

dans son code.

int iBarShift2(string symbol, ENUM_TIMEFRAMES timeframe, datetime time)

c'est pourquoi il n'est pas tout à fait clair s'il y a de faux

et si oui :

int teset_01=iBarShift 2(_Symbol,PERIOD_CURRENT,StringToTime("30.03.2018 00:00"));
Print ("teset_01=",teset_01);
?
 

Jusqu'à présent, j'ai opté pour ce code, qui semble fonctionner rapidement :

//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+    
int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,const bool Exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static bool LastExact=false;
   static int PerSec=::PeriodSeconds(LastTimeFrame);
   
   if (LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   time-=time%PerSec;

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

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

   return(Res);
  }  

Quelqu'un a-t-il identifié des inconvénients dans ce code, ou existe-t-il une option plus rapide ?

Ah, bien, le seul inconvénient est si vous faites une demande pour une barre qui n'est pas encore sur le graphique, c'est-à-dire avec l'heure d'aujourd'hui, par exemple ...... Il y a peut-être une solution à cela aussi ? Dans ce cas, il serait logique de renvoyer la dernière barre connue. Cela peut être utile pour travailler avec des algorithmes qui fonctionnent sur le temps actuel.

 
Renat Akhtyamov:

il a la même.

donc la présence de faux n'est pas tout à fait claire

false - pour la standardisation, cela ne change rien :) Pour être honnête, je ne sais pas pourquoi ce faux dans certaines fonctions est nécessaire ?

 
Aleksey Vyazmikin:

Jusqu'à présent, j'ai opté pour ce code, qui semble fonctionner rapidement :

Quelqu'un a-t-il identifié des inconvénients dans ce code, ou existe-t-il une option plus rapide ?

Ah, bien, le seul inconvénient est si vous faites une demande pour une barre qui n'est pas encore sur le graphique, c'est-à-dire avec l'heure d'aujourd'hui, par exemple ...... Il y a peut-être une solution à cela aussi ? Dans ce cas, il serait logique de renvoyer la dernière barre connue. Cela pourrait être utile pour travailler avec des algorithmes qui fonctionnent sur le temps actuel.

renvoyer un numéro de barre qui n'existe pas n'est pas bon

il est plus facile de retourner -1

 
Aleksey Vyazmikin:

false - pour la standardisation, ne change rien :) Pour être honnête, je ne sais pas pourquoi ce faux dans certaines fonctions est nécessaire ?

Je suis perdu là et je suis un adepte des codes simples, sans deux-points.
 
Renat Akhtyamov:

renvoyer un numéro de barre qui n'existe pas n'est pas bon

il est plus facile de retourner -1

Non, il devrait juste renvoyer la dernière barre connue, c'est-à-dire avec l'index 0, mais maintenant cela prend beaucoup de temps pour trouver ce qu'il faut renvoyer ici.

Voici le code, qui est faux d'une barre, et qui renvoie la bonne barre - zéro.

Ou voulez-vous dire quand l'histoire demande une barre par temps qui n'existe pas ? Ensuite, je pense que le plus souvent vous avez besoin d'obtenir la barre la plus proche de notre temps de ceux qui sont disponibles, et le code renvoie dans ce cas la barre avec le décalage -1 sur l'histoire, mais il fonctionne correctement, s'il n'y a pas d'autre histoire - il renvoie rapidement zéro barre.

 
Aleksey Vyazmikin:

Non, il devrait juste renvoyer la dernière barre connue, c'est-à-dire avec l'indice 0, mais maintenant cela prend beaucoup de temps pour trouver ce qu'il faut renvoyer ici.

Le code, qui est faux d'une barre, renvoie la bonne barre - zéro.

Ou voulez-vous dire quand l'histoire demande une barre par temps qui n'existe pas ? Alors je pense que le plus souvent nous devrions obtenir la barre qui est la plus proche de notre temps, et le code renvoie dans ce cas la barre avec le décalage -1 sur l'historique, mais il fonctionne correctement, s'il n'y a pas d'autre historique - il renvoie rapidement la barre zéro.

Oui (en surbrillance)

-1 est un moins (je précise) et l'erreur retournée par la fonction est qu'il n'y a pas de telle barre

C'est-à-dire, ma fonction.

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

Analogue de iBarShift

Renat Akhtyamov, 2017.06.08 01:19

C'est également possible

int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime tm)
   {
        datetime tm0[1];      
        CopyTime(symbol,timeframe,0,1,tm0);
        int res=Bars(symbol,timeframe,tm0[0],tm)-1;
        return(res);
   }

doit également être améliorée

bien que...

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, nous attraperons -1 de la fonction telle qu'elle est.

===

Donc tout fonctionne, utilisez-le à votre avantage !

Raison: