Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 979

 
Vadim_2015:

Chers amis, je vais essayer d'expliquer du mieux que je peux ce que je veux réaliser... ... ou je vais avoir raison... ou je vais embrouiller tout le monde !

...

Continuons la conversation... D'après ce que j'ai compris, la tâche peut être réduite à ce qui suit. Pour simplifier, nous n'étudierons que la journée d'hier, la période H1.

Tout d'abord, nous recherchons la première bougie (en regardant du côté gauche du graphique d'hier) dont la clôture est supérieure à l'ouverture, c'est-à-dire que nous recherchons la première bougie haussière. Si celle-ci est trouvée, alors en partant de celle-ci (en l'incluant) jusqu'au dernier chandelier de la journée en cours, nous devrions trouver le chandelier avec le High le plus élevé. Par exemple, si l'heure d'ouverture de la première bougie haussière est 10:00, alors de celle-ci jusqu'à la bougie de 23:00, nous devrions rechercher la bougie avec le plus haut niveau. N'est-ce pas ?

 
paladin80:

Poursuivre la conversation... Si je comprends bien, la mission peut être réduite à ce qui suit. Pour simplifier, nous n'examinerons que la journée d'hier, période H1.

Tout d'abord, nous recherchons la première bougie (en regardant du côté gauche du graphique d'hier) dont la clôture est supérieure à l'ouverture, c'est-à-dire que nous recherchons la première bougie haussière. Si celle-ci est trouvée, alors en partant de celle-ci (en l'incluant) jusqu'au dernier chandelier de la journée en cours, nous devrions trouver le chandelier avec le High le plus élevé. Par exemple, si l'heure d'ouverture de la première bougie haussière est 10:00, alors de celle-ci jusqu'à la bougie de 23:00, nous devrions chercher la bougie avec le plus haut niveau. N'est-ce pas ?

Oh, merci mon Dieu... Je l'ai eu ! OUI ! YEAH ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
 
Vadim_2015:
Oh, merci mon Dieu... Je suis compris ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
Compris, je vais essayer d'y réfléchir, mais cela dépend de l'actualité. Si vous avez des questions à l'avenir, veuillez les formuler de manière à ce qu'elles soient plus faciles à comprendre pour les programmeurs.
 
Vadim_2015:
Oh, merci mon Dieu... Je l'ai eu ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?

S'il s'agit du chandelier d'hier, il sera le chandelier de fin dans iHigest(), et le chandelier de début sera 00:00 du jour suivant (c'est-à-dire le chandelier d'aujourd'hui) obtenu à partir de iBarShift().

Exemple d'algorithme :

1. Aujourd'hui, nous recherchons la première barre haussière parmi les barres horaires d'hier. Soit l'indice endBar

Déterminez la première barre d'une heure aujourd'hui. Ou bien ce sera zéro.

3. Dans iHighest(), définissez l'avant-dernier paramètre comme endBar (ou endBar +1 pour être précis), et le dernier comme 1.

Le résultat recherché est High[iHighest(avec les paramètres pertinents)] // Ou la variable correspondante, dont la valeur a été assignée dans la clause précédente.

 
Vadim_2015:
Oh, merci mon Dieu... Je suis compris ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
void OnStart()
  {
 double  longValue;
 datetime t1,t2;    
 int b1,b2,h; 
 
 int bStart = iBarOfDayReal();//бар, с которого уходим в историю
          Print("",bStart);                 
   for(int i=bStart;i<bStart+1000;i++)
      {
       longValue = Close[i+1]-Open[i+3];
       
//--- само условие
         
       if(longValue>0) 
       {
      t1= iTime(NULL,0,i); //
      t2= iTime(NULL,PERIOD_D1,iBarShift(NULL,PERIOD_D1,t1,false)-1);//00.00.00 время 
      
     // Print("",TimeToStr(t1,TIME_DATE|TIME_SECONDS)); 
     // int("",TimeToStr(t2,TIME_DATE|TIME_SECONDS))Pr;
     
      b1= iBarShift(NULL,0,t1,false);
      b2= iBarShift(NULL,0,t2,false); 
      
      h=iHighest(NULL,0,MODE_HIGH,b1-b2+1,b2);//нашли максимум
      
      SetArrow(159,clrCoral,"h"+(string)Time[h],Time[h],High[h]); //рисуем пипичку
     
       }
   }
  }
//+------------------------------------------------------------------+
void SetArrow(int cd, color cl,
              string nm="", datetime t1=0, double p1=0, int sz=0) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1    , t1);
  ObjectSet(nm, OBJPROP_PRICE1   , p1);
  ObjectSet(nm, OBJPROP_ARROWCODE, cd);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_WIDTH    , sz);
}
//-------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}
   
  
//+------------------------------------------------------------------+
SCRIPT ! Essayez-le.
 
r772ra:
SCREPT ! éprouvant.

r772ra Merci beaucoup ! !! Le script fait ce dont j'ai besoin ! !! Tout n'est pas clair pour moi dans le dernier bloc de code, mais je vais trouver une solution. Je vais trouver une solution. Je vais essayer de l'utiliser dans l'indicateur.

Jevais essayer de l'utiliser dans un indicateur :

Si vous avez des questions à l'avenir, veuillez les formuler de manière à ce qu'elles soient plus faciles à comprendre pour les programmeurs.

J'ai compris, je vais en tenir compte !

Merci beaucoup !

 
Vadim_2015:

r772ra Merci beaucoup ! !! Le script fait ce dont j'ai besoin ! !! Tout n'est pas clair pour moi dans le dernier bloc de code, mais je vais trouver une solution. L'essentiel est que cela fonctionne. Je vais essayer de l'appliquer à l'indicateur.

Très bien, je vais en tenir compte !

Merci beaucoup !

Qu'est-ce qui n'est pas clair exactement ?
 
r772ra:
Qu'est-ce qui n'est pas clair exactement ?

Expliquez-moi si je me trompe, je pense que la deuxième moitié du code du script _"void SetArrow(int cd, color cl," est la partie qui fait référence à la fonction"_OnInit()" de l'indicateur.. et la première partie du script _"void OnStart()" fait référence à la fonction "_OnCalculate" dans l'indicateur ? Je veux dire, en gros, que le script a 1) le calcul au début et ensuite 2) l'initialisation seulement. Dans l'indicateur, c'est l'inverse.

 
Vadim_2015:

Expliquez-moi si je me trompe, je pense que la deuxième moitié du code du script _"void SetArrow(int cd, color cl," est la partie qui fait référence à la fonction"_OnInit()" de l'indicateur.. et la première partie du script _"void OnStart()" fait référence à la fonction "_OnCalculate" dans l'indicateur ? Je veux dire, en gros, que le script a 1) le calcul au début et ensuite 2) l'initialisation seulement. Dans l'indicateur, c'est l'inverse.

Il s'agit d'une fonction définie par l'utilisateur qui est en dehors de la portée des autres fonctions.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка значка на графике, объект OBJ_ARROW.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cd - код значка                                                         |
//|    cl - цвет значка                                                        |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время открытия бара        (0  - текущий бар)                      |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    sz - размер значка              (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetArrow(int cd, color cl,
              string nm="", datetime t1=0, double p1=0, int sz=0) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1    , t1);
  ObjectSet(nm, OBJPROP_PRICE1   , p1);
  ObjectSet(nm, OBJPROP_ARROWCODE, cd);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_WIDTH    , sz);
}

Appel de fonction, à partir de toute autre fonction

SetArrow(159,clrCoral,"h"+(string)Time[h],Time[h],High[h]); //рисуем пипичку

Je pense que vous n'en avez pas besoin dans l'indicateur, le tampon est responsable du dessin.

En d'autres termes.

          longBarsBuffer[i]=High[h]+5*Point(); - то что необходимо получить. 
       else 
          longBarsBuffer[i]=0.0; 

Plus d'informations sur

La fonction

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}

Et l'appel

trouve le nombre de barres depuis le début de la journée (le jour actuel n'est pas recalculé) et cette barre va dans l'historique.

 int bStart = iBarOfDayReal();//бар, с которого уходим в историю
 
Addendum))) les fonctions sont prises d'ici