Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 34

 
Artyom Trishkin:

Montrez-moi votre indicateur complet - voyons ce qui ne va pas.

Merci.

C'est ici.


#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LawnGreen
#property indicator_color2 DeepPink
#property indicator_width1 1
#property indicator_width2 1
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
extern string Stochastic = "Configure Stochastic Settings";
extern int TimeFrame1=1;
extern int KPeriod = 5;
extern int DPeriod = 3;
extern int Slowing = 3;
extern int OverBought = 80;
extern int OverSold = 20;


extern int TimeFrame2=5;
extern int KPeriod1 = 5;
extern int DPeriod1 = 3;
extern int Slowing1 = 3;
extern int OverBought1 = 55;
extern int OverSold1 = 45;

extern string Alerts  = "Configure Alerts";
extern bool PopUpAlert = true;    //Popup Alert
extern bool EmailAlert = true;   //Email Alert
extern bool PushAlert  = true;  //Push Notifications Alert
// UP and DOWN Buffers
double UP[];
double DOWN[];
// Distance of arrows from the high or low of a bar
int distance = 3;
double MyPoint;
datetime CTime;

int OnInit()
  {
//--- indicator buffers mapping
  //UP Arrow Buffer
  SetIndexEmptyValue(0,0.0);
  SetIndexStyle(0,DRAW_ARROW,0,EMPTY);
  SetIndexArrow(0,233);
  SetIndexBuffer(0,UP);
  
  //DOWN Arrow Buffer
  SetIndexEmptyValue(1,0.0);
  SetIndexStyle(1,DRAW_ARROW,0,EMPTY);
  SetIndexArrow(1,234);
  SetIndexBuffer(1,DOWN);
  
  //Auto Adjustment for broker digits
  if (Digits()==5||Digits()==3){MyPoint=Point*10;} else{MyPoint=Point;}
  CTime=Time[0];
//---
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason)
  {
//--- delete an object from a chart
   Comment("");
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;



for(int i=limit-count; i>=1;i--)
{
    
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,TimeFrame1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,TimeFrame1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,TimeFrame2,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,TimeFrame2,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50&&Stoch50_1>Stoch50_2)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  if(Stoch1<80 && Stoch2>80&&Stoch50_1<50&&Stoch50_1<Stoch50_2)
  {
   DOWN[i]=High[i]+distance*MyPoint;
  }
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
mila.com:

Merci.

C'est ici

...

Juste pour clarifier.

Je veux mettre la flèche vers le haut si la ligne de l'indicateur a traversé le niveau 20, sur la période M1, et la ligne de l'indicateur est dirigée vers le haut, au-dessus du niveau 50, sur la période M5.

Voyons comment obtenir les valeurs de la trame temporelle supérieure, en étant sur la trame inférieure :

//+------------------------------------------------------------------+
//|                                                    iTwoStoch.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UP
#property indicator_label1  "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLawnGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DN
#property indicator_label2  "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDeepPink
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

//--- enums
enum enumYN
  {
   enYes=1, // Да
   enNo=0,  // Нет
  };

//--- input parameters
extern string Stochastic1 = "Параметры стохастика 1";
input ENUM_TIMEFRAMES   TimeFrame1  =  PERIOD_M1;  // Таймфрейм
input int               KPeriod1    =  5;          // Период %K
input int               DPeriod1    =  3;          // Период %D
input int               Slowing1    =  3;          // Замедление
input double            OverBought1 =  80;         // Уровень перекупленности
input double            OverSold1   =  20;         // Уровень перепроданности

extern string Stochastic2 = "Параметры стохастика 2";
input ENUM_TIMEFRAMES   TimeFrame2  =  PERIOD_M5;  // Таймфрейм
input int               KPeriod2    =  5;          // Период %K
input int               DPeriod2    =  3;          // Период %D
input int               Slowing2    =  3;          // Замедление
input double            OverBought2 =  55;         // Уровень перекупленности
input double            OverSold2   =  45;         // Уровень перепроданности

extern string Alerts  = "Configure Alerts";
input enumYN            UsePopUpAlert  = enYes;    // Popup Alert
input enumYN            UseEmailAlert  = enYes;    // Email Alert
input enumYN            UsePushAlert   = enYes;    // Push Notifications Alert
//--- indicator buffers
double         BufferUP[];
double         BufferDN[];
//--- global variables
int kperiod1;        // Период %K стох.1
int dperiod1;        // Период %D стох.1
int slowing1;        // Замедление стох.1
double overBought1;  // Уровень перекупленности стох.1
double overSold1;    // Уровень перепроданности стох.1
//---
int kperiod2;        // Период %K стох.2
int dperiod2;        // Период %D стох.2
int slowing2;        // Замедление стох.2
double overBought2;  // Уровень перекупленности стох.2
double overSold2;    // Уровень перепроданности стох.2
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUP);
   SetIndexBuffer(1,BufferDN);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   SetIndexArrow(0,233);
   SetIndexArrow(1,234);
//---
   kperiod1=(KPeriod1<1?1:KPeriod1);
   kperiod2=(KPeriod2<1?1:KPeriod2);
   dperiod1=(DPeriod1<1?1:DPeriod1);
   dperiod2=(DPeriod2<1?1:DPeriod2);
   slowing1=(Slowing1<1?1:Slowing1);
   slowing2=(Slowing2<1?1:Slowing2);
   //---
   overBought1=(OverBought1>100.0?100.0:OverBought1<0.1?0.1:OverBought1);
   overSold1=(OverSold1<0?0:OverSold1>99.9?99.9:OverSold1);
   if(overBought1<=overSold1) overBought1=overSold1+0.1;
   if(overSold1>=overBought1) overSold1=overBought1-0.1;
   //---
   overBought2=(OverBought2>100.0?100.0:OverBought2<0.1?0.1:OverBought2);
   overSold2=(OverSold2<0?0:OverSold2>99.9?99.9:OverSold2);
   if(overBought2<=overSold2) overBought2=overSold2+0.1;
   if(overSold2>=overBought2) overSold2=overBought2-0.1;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<2) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>1) {
      limit=rates_total-2;
      ArrayInitialize(BufferUP,EMPTY_VALUE);
      ArrayInitialize(BufferDN,EMPTY_VALUE);
      }
   for(int i=limit; i>=0; i--) {
      int bar_sto2_0=iBarShift(Symbol(),TimeFrame2,iTime(Symbol(),TimeFrame2,i));
      int bar_sto2_1=iBarShift(Symbol(),TimeFrame2,iTime(Symbol(),TimeFrame2,i+1));
      double sto1_0=iStochastic(Symbol(),TimeFrame1,kperiod1,dperiod1,slowing1,MODE_SMA,STO_LOWHIGH,MODE_MAIN,i);
      double sto1_1=iStochastic(Symbol(),TimeFrame1,kperiod1,dperiod1,slowing1,MODE_SMA,STO_LOWHIGH,MODE_MAIN,i+1);
      double sto2_0=iStochastic(Symbol(),TimeFrame2,kperiod2,dperiod2,slowing2,MODE_SMA,STO_LOWHIGH,MODE_MAIN,bar_sto2_0);
      double sto2_1=iStochastic(Symbol(),TimeFrame2,kperiod2,dperiod2,slowing2,MODE_SMA,STO_LOWHIGH,MODE_MAIN,bar_sto2_1);
      Comment(
              "\n",
              "Stoch ",EnumToString(TimeFrame1),
              ", бар ",(i+1)," > время: ",TimeToString(time[i+1],TIME_MINUTES),", значение: ",DoubleToString(sto1_1,Digits()),
              "; бар ",i," > время: ",TimeToString(time[i],TIME_MINUTES),", значение: ",DoubleToString(sto1_0,Digits()),"\n",
              //---
              "Stoch ",EnumToString(TimeFrame2),
              ", бар ",bar_sto2_1," > время: ",TimeToString(iTime(Symbol(),TimeFrame2,bar_sto2_1),TIME_MINUTES),", значение: ",DoubleToString(sto2_1,Digits()),
              "; бар ",bar_sto2_0," > время: ",TimeToString(iTime(Symbol(),TimeFrame2,bar_sto2_0),TIME_MINUTES),", значение: ",DoubleToString(sto2_0,Digits())
             );
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ensuite, essayez de faire la logique que vous voulez au lieu de Comment().

Voyons voir...

 
Artyom Trishkin:

Voyons comment obtenir des valeurs à partir d'un cadre temporel supérieur tout en restant sur un cadre inférieur :

Et ensuite, essayez de faire la logique que vous voulez au lieu de Comment().

Nous verrons bien...

Merci, ça a marché)

Dans l'Expert Advisor, lorsque j'appelle l'indicateur, il me suffit de spécifier le numéro de l'intervalle de temps souhaité, tandis que l'indicateur "danse" avec le décalage. Où puis-je en savoir plus ?

 
mila.com:

Merci, ça a marché)

Dans l'EA, lorsque j'appelle l'indicateur, il me suffit de préciser le numéro de l'horizon temporel souhaité, et l'indicateur "danse" avec le décalage. Où puis-je en savoir plus ?

Je ne l'ai lu nulle part - je n'en ai aucune idée.

Imaginez ceci : vous parcourez les barres de M1. Vous prenez les valeurs de l'indicateur à partir du numéro de la barre, à laquelle l'indice de cycle i est référencé.


i+8i+7
i+6
i+5i+4i+3
i+2i+1i
M1
09:52
09:53
09:54
09:55
09:56
09:57
09:58
09:59
10:00
M5
09:50
09:50
09:50
09:55
09:55
09:55
09:55
09:55
10:00
i+2
i+2i+2i+1
i+1i+1
i+1
i+1i

Dans le tableau, dans l'en-tête, en haut, l'indice de cycle M1, en dessous, la valeur du temps de barre auquel se réfère l'indice M1.

Tout en bas, l'indice de cycle M5, au-dessus, la valeur du temps de la barre à laquelle l'indice M5 se réfère.

Lorsque vous passez la valeur de l'indice du cadre temporel actuel, à laquelle le cycle commence, dans la fonction iCustom(), vous obtenez les valeurs de l'indicateur du cadre temporel plus ancien en fonction de l'indice. Mais l'indice ne fait pas référence à la barre nécessaire, comme on peut le voir dans le tableau.

Et cela devrait être fait dans les conseillers experts également, sinon - vous ne prenez pas les valeurs de la barre attendue et pensez que vous l'avez correcte. Eh bien, tu as raison, mais pas du mauvais bar. Cela doit être connu et pris en compte.

En d'autres termes, lors de la réception de données multitemporelles, il est nécessaire de se baser sur le temps et de le recalculer pour obtenir le numéro de la barre à l'intervalle de temps requis.

 

Artyom, aidez-moi aussi, j'ai des problèmes avec les indicateurs.

J'ai besoin de trouver ces constructions et de mettre des flèches dessus. Les fonctions dans l'Expert Advisor fonctionnent et sont simples à connecter, bien, c'est compréhensible - elles n'ont besoin que des valeurs actuelles, mais comment les transférer à l'indicateur, pour dessiner la coïncidence sur l'historique... ?

Les flèches doivent être dessinées sur un chandelier, dès que le High[1] et le Low[1] coïncident.

//+------------------------------------------------------------------+
//|                                                         iTwo.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UP
#property indicator_label1  "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLawnGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DN
#property indicator_label2  "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDeepPink
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

//--- input parameters
input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1;
input string          dSymbol   = "AUDUSD";
//--- indicator buffers
double BufferUP[];
double BufferDN[];
//--- global variables

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUP);
   SetIndexBuffer(1,BufferDN);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   SetIndexArrow(0,233);
   SetIndexArrow(1,234);
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---
if(rates_total<2) return(0);
int limit=rates_total-prev_calculated;
  if(limit>1) {
   limit=rates_total-2;
    ArrayInitialize(BufferUP,EMPTY_VALUE);
    ArrayInitialize(BufferDN,EMPTY_VALUE);
  }
  
  int NumFrUp = GetFractalBar(dSymbol,PERIOD_CURRENT,0,MODE_UPPER); // номер бара Up
  int NumFrDn = GetFractalBar(dSymbol,PERIOD_CURRENT,0,MODE_LOWER); // номер бара Dn

  Comment( "Bear: "  ,     GetBearBull(dSymbol, TimeFrame, 3) == 1, // Подряд 3 бара вверх
          "\nBull:  ",     GetBearBull(dSymbol, TimeFrame, 3) == 2, // Подряд 3 бара вниз
          "\nNumFrUp: " ,  NumFrUp, // номер бара Up
          "\nNumFrDn:  ",  NumFrDn, // номер бара Dn
          "\nPriceFrUp: " ,iHigh(dSymbol,PERIOD_CURRENT,NumFrUp), // Цена верхнего фрактала
          "\nPriceDn:  ",  iLow(dSymbol,PERIOD_CURRENT,NumFrDn)   // Цена нижнего  фрактала
         );
  
  for(int i=limit; i>=0; i--) {
  //--
   if(/* что сюда */0)
    {
     BufferUP[i]=Low[i]-50*_Point;
    }
  
  //--
   if(/* что сюда */0)
    {
     BufferDN[i]=High[i]+50*_Point;
    }

  } // end for
//--- return value of prev_calculated for next call
   return(rates_total);
}

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
  for(int i=3; i<iBars(symb, tf)-1; i++) {
   if(mode==MODE_LOWER){
   f=iFractals(symb, tf, MODE_LOWER, i);
   if(f!=0) {
    kf++;
    if(kf>nf) { return(i);}
   }}
   if(mode==MODE_UPPER){
   f=iFractals(symb, tf, MODE_UPPER, i);
   if(f!=0) {
    kf++;
    if(kf>nf) { return(i);}
   }}}
  return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
  double open1=0,close1=0,open2=0,close2=0;
  int b=1,s=1;
   for(int i=1; i<ne; i++) {
    open1=iOpen(symb,tf,i);
    close1=iClose(symb,tf,i);
    open2= iOpen(symb,tf,i+1);
    close2= iClose(symb,tf,i+1);
     if(open2<close2 && open1<close1 && open2<open1) {  // бычьи
      b++;
      if(b==ne) { return(1);}
     }
     if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
      s++;
      if(s==ne) { return(2);}
     }
  }
  return(0);
}
//===============================================================================================

Ensuite, j'essaierai d'entrer d'autres modèles en suivant l'analogie, afin de ne pas perturber le conseiller expert.

Merci !

 
Vitaly Muzichenko:

Artyom, aidez-moi aussi, j'ai des problèmes avec les indicateurs.

J'ai besoin de trouver ces constructions et de mettre des flèches dessus. Les fonctions dans l'Expert Advisor fonctionnent et sont simples à connecter, bien, c'est compréhensible - elles n'ont besoin que des valeurs actuelles, mais comment les transférer à l'indicateur, pour dessiner la coïncidence sur l'historique... ?

Les flèches sont dessinées sur un chandelier, lorsque la coïncidence du High[1] et du Low[1] se produit.

...

Ensuite, j'essaierai d'entrer d'autres modèles en suivant l'analogie, afin de ne pas perturber le conseiller expert.

Merci !

Il devrait y avoir une logique différente pour les différents modèles, car ils ne sont pas tous identiques. Et pour un même motif, la logique devrait être écrite différemment par différents programmeurs.

Et quoi exactement, quel modèle voulez-vous déterminer ?

Commençons par ceci.

 
Artyom Trishkin:

Il doit y avoir une logique différente pour les différents modèles, car tous les modèles ne sont pas les mêmes. Et pour le même modèle, différents programmeurs écriront une logique différente.

Et quoi exactement, quel modèle voulez-vous définir ?

Commençons par celui-ci.

J'ai joint une photo.

La condition : la fractale " 3 " est supérieure à la fractale " 2 " et la fractale " 1 " est supérieure à la " 2 " -FrDn3 > FrDn2&& FrDn2< FrDn1 On regarde les bougies, les fractales sont déjà formées et on attend la confirmation de la figure de bougie,

et s'il y a"3" croissants dans une rangée - achat (flèche) -GetBearBull(dSymbol,0,3)==1(1 - achat)

C'est l'inverse pour la vente.

Il est facile de le mettre dans un Expert Advisor, mais dans un indicateur ...

 
Vitaly Muzichenko:

J'ai joint l'image.

Condition requise : la fractale "3" est supérieure à la fractale "2" et la fractale "1" est supérieure à la "2" -FrDn3 > FrDn2&& FrDn2< FrDn1 On regarde le chandelier, les fractales ont déjà été formées et on attend la confirmation de la figure de chandelier,

et s'il y a"3" hausses consécutives - achat (flèche) -GetBearBull(dSymbol,0,3)==1(1 - achat)

C'est l'inverse pour la vente.

Il est facile de le mettre dans un Expert Advisor, mais dans un indicateur...

Dans l'indicateur, c'est l'inverse - si vous commencez à chercher dans les profondeurs de l'histoire, dans l'indicateur - depuis son début. Cherchez d'abord la fractale de gauche, puis celle du milieu, puis celle de droite.

Gérer les drapeaux.

  1. Drapeau = faux
  2. Fractale gauche trouvée - drapeau vrai
  3. Trouvez la fractale du milieu, si elle est supérieure à celle de gauche, alors marquez faux ; si elle est inférieure, passez à l'étape 4.
  4. Trouvez la bonne fractale, si elle est inférieure à la moyenne, signalez-la comme fausse, si elle est supérieure, passez à l'étape 5.
  5. Toutes les fractales sont trouvées et le drapeau est activé - recherchez trois barres d'affilée avec les mêmes drapeaux.
 
Artyom Trishkin:

Dans l'indicateur, la logique est opposée - si dans l'EA vous commencez à chercher profondément dans l'historique, alors dans l'indicateur vous commencez au début de l'historique. Cherchez d'abord la fractale de gauche, puis celle du milieu, puis celle de droite.

Gérer les drapeaux.

  1. Drapeau = faux
  2. Nous avons trouvé la fractale gauche - mettons le drapeau à vrai.
  3. Trouvez la fractale du milieu, si elle est supérieure à celle de gauche, alors marquez faux ; si elle est inférieure, passez à l'étape 4.
  4. Fractale droite trouvée, si elle est inférieure à la moyenne - drapeau faux, si elle est supérieure - passez à l'étape 5.
  5. Toutes les fractales sont trouvées et le drapeau est activé - recherchez trois barres d'affilée avec les mêmes drapeaux.

Je demande de montrer la variante prête. Je la verrai peut-être une fois et les questions disparaîtront, mais maintenant j'en ai mille et je ne peux pas décider.

Je n'ai aucune idée de ce que l'on peut faire de tout cela dans un indicateur.

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
  for(int i=3; i<iBars(symb, tf)-1; i++) {
   if(mode==MODE_LOWER){
   f=iFractals(symb, tf, MODE_LOWER, i);
   if(f!=0) {
    kf++;
    if(kf>nf) { return(i);}
   }}
   if(mode==MODE_UPPER){
   f=iFractals(symb, tf, MODE_UPPER, i);
   if(f!=0) {
    kf++;
    if(kf>nf) { return(i);}
   }}}
  return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
  double open1=0,close1=0,open2=0,close2=0;
  int b=1,s=1;
   for(int i=1; i<ne; i++) {
    open1=iOpen(symb,tf,i);
    close1=iClose(symb,tf,i);
    open2= iOpen(symb,tf,i+1);
    close2= iClose(symb,tf,i+1);
     if(open2<close2 && open1<close1 && open2<open1) {  // бычьи
      b++;
      if(b==ne) { return(1);}
     }
     if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
      s++;
      if(s==ne) { return(2);}
     }
  }
  return(0);
}
//===============================================================================================
 
Vitaly Muzichenko:

Si je pouvais, alors pas de questions, je comprends la logique, mais je ne peux pas l'implémenter dans le code, alors s'il vous plaît montrez-moi une variante prête, je la verrai une fois et les questions disparaîtront dans le futur, mais maintenant il y en a des milliers et je ne peux pas les résoudre moi-même.

Que faire de tout cela dans un indicateur - aucune idée(

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
  for(int i=3; i<iBars(symb, tf)-1; i++) {
   if(mode==MODE_LOWER){
   f=iFractals(symb, tf, MODE_LOWER, i);
   if(f!=0) {
    kf++;
    if(kf>nf) { return(i);}
   }}
   if(mode==MODE_UPPER){
   f=iFractals(symb, tf, MODE_UPPER, i);
   if(f!=0) {
    kf++;
    if(kf>nf) { return(i);}
   }}}
  return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
  double open1=0,close1=0,open2=0,close2=0;
  int b=1,s=1;
   for(int i=1; i<ne; i++) {
    open1=iOpen(symb,tf,i);
    close1=iClose(symb,tf,i);
    open2= iOpen(symb,tf,i+1);
    close2= iClose(symb,tf,i+1);
     if(open2<close2 && open1<close1 && open2<open1) {  // бычьи
      b++;
      if(b==ne) { return(1);}
     }
     if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
      s++;
      if(s==ne) { return(2);}
     }
  }
  return(0);
}
//===============================================================================================

Avez-vous besoin d'une fonction qui renvoie un numéro de barre fractale par son nombre ?

Vous avez besoin d'une fonction qui renvoie la présence d'une fractale sur la barre requise (index du cycle + 3).

Raison: