Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 34

 
Artyom Trishkin:

Muéstrame tu indicador completo, veamos qué es lo que falla.

Gracias.

Aquí está.


#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:

Gracias.

Aquí está

...

Sólo para aclarar.

Quiero poner la flecha hacia arriba si la línea del indicador ha cruzado el nivel 20, en el período M1, y la línea del indicador se dirige hacia arriba, por encima del nivel 50, en el período M5.

Veamos cómo obtener los valores del marco temporal superior, estando en el inferior:

//+------------------------------------------------------------------+
//|                                                    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);
  }
//+------------------------------------------------------------------+

A continuación, intente hacer la lógica que desea en lugar de Comment().

Veamos...

 
Artyom Trishkin:

Veamos cómo obtener valores de un marco temporal superior mientras se está en uno inferior:

Y luego trata de hacer la lógica que quieres en lugar de Comment().

Veremos...

Gracias, ha funcionado )

En el Asesor Experto, al llamar al indicador, sólo tengo que especificar el número del marco temporal deseado, mientras el indicador "baila" con el desplazamiento. ¿Dónde puedo leer más sobre el tema?

 
mila.com:

Gracias, ha funcionado )

En el EA, cuando llamo al indicador, sólo tengo que especificar el número del marco temporal deseado, y el indicador "baila" con el cambio. ¿Dónde puedo leer más sobre el tema?

No lo he leído en ningún sitio, no tengo ni idea.

Imagínese esto: usted recorre los bares de la M1. Los valores de los indicadores se toman del número de barra al que se refiere el índice de ciclo i.


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

En la tabla en la cabecera en la parte superior el índice de ciclo M1, debajo está el valor del tiempo de barra al que se refiere el índice M1

En la parte inferior se encuentra el índice de ciclo M5, encima está el valor del tiempo de barra al que se refiere el índice M5

Al pasar el valor del índice del marco temporal actual, en el que comienza el ciclo, a la función iCustom(), se obtienen los valores del indicador del marco temporal más antiguo según el índice. Pero el índice no se refiere a la barra necesaria, como se puede ver en la tabla.

Y esto debe hacerse también en los asesores expertos, de lo contrario - no está tomando los valores de la barra esperada y piensa que lo tiene correcto. Bueno, has acertado, pero no desde el bar equivocado. Esto debe conocerse y tenerse en cuenta.

Es decir, en la recepción de datos multitiempo es necesario basarse en el tiempo, y recalcularlo al número de barra en el marco temporal requerido.

 

Artyom, por favor ayúdame también, tengo problemas con los indicadores.

Las funciones en el Asesor Experto funcionan y son simples de conectar, bueno, es comprensible - sólo necesitan valores actuales, pero ¿cómo transferirlos al indicador, para dibujar la coincidencia en la historia?

Las flechas deben ser dibujadas en una vela, tan pronto como el Alto[1] y el Bajo[1] coincidan.

//+------------------------------------------------------------------+
//|                                                         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);
}
//===============================================================================================

Luego intentaré introducir otros patrones siguiendo la analogía, para no molestar al Asesor Experto.

Gracias.

 
Vitaly Muzichenko:

Artyom, por favor ayúdame también, tengo problemas con los indicadores.

Las funciones en el Asesor Experto funcionan y son simples de conectar, bueno, es comprensible - sólo necesitan valores actuales, pero ¿cómo transferirlos al indicador, para dibujar la coincidencia en la historia?

Las flechas se dibujan en una vela, cuando se produce la coincidencia del Alto[1] y el Bajo[1].

...

Luego intentaré introducir otros patrones siguiendo la analogía, para no molestar al Asesor Experto.

Gracias.

Debería haber una lógica diferente para los distintos patrones, porque no todos son iguales. Y para un mismo patrón, la lógica debe ser escrita de manera diferente por diferentes programadores.

¿Y qué es exactamente, qué patrón quiere determinar?

Empecemos con esto.

 
Artyom Trishkin:

Debe haber una lógica diferente para los distintos patrones, porque no todos los patrones son iguales. Y para el mismo patrón, diferentes programadores escribirán una lógica diferente.

¿Y qué es exactamente, qué patrón quieres definir?

Empecemos con esto.

He adjuntado una imagen.

La condición: el fractal "3" es más alto que el fractal "2" y el fractal "1" es más alto que "2" -FrDn3 > FrDn2&& FrDn2< FrDn1 Miramos las velas, los fractales ya están formados y esperamos la confirmación del patrón de velas,

y si hay"3" subidas seguidas - comprar (flecha) -GetBearBull(dSymbol,0,3)==1(1 - comprar)

En el caso de la venta es al revés.

Es fácil ponerlo en un Asesor Experto, pero en un indicador ...

 
Vitaly Muzichenko:

He adjuntado la imagen.

Condición requerida: el fractal "3" es mayor que el fractal "2" y el fractal "1" es mayor que el "2" -FrDn3 > FrDn2&& FrDn2< FrDn1 Miramos la vela, los fractales ya se han formado y esperamos la confirmación del patrón de la vela,

y si hay"3" aumentando en una fila - comprar (flecha) -GetBearBull(dSymbol,0,3)==1(1 - comprar)

En el caso de la venta, es al revés.

Es fácil ponerlo en un Asesor Experto, pero en un indicador...

En el indicador es viceversa - si se empieza a buscar en la profundidad de la historia, en el indicador - desde su principio. Busca primero el fractal de la izquierda, luego el del medio y después el de la derecha.

Gestiona las banderas.

  1. Bandera = falso
  2. Encontrado el fractal de la izquierda - bandera verdadera
  3. Encuentre el fractal del medio, si es más alto que el de la izquierda, entonces marque falso; si está por debajo, vaya al paso 4
  4. Encuentre el fractal correcto, si es inferior a la media - marque falso, si es superior - vaya al paso 5
  5. Se encuentran todos los fractales y se fija la bandera - busque tres barras seguidas con las mismas banderas.
 
Artyom Trishkin:

En el indicador, la lógica es la contraria: si en el EA se empieza a buscar en la profundidad del historial, en el indicador se empieza desde el principio del historial. Busca primero el fractal de la izquierda, luego el del medio y después el de la derecha.

Gestiona las banderas.

  1. Bandera = falso
  2. Hemos encontrado el fractal de la izquierda - pongamos la bandera en true
  3. Encuentre el fractal del medio, si es más alto que el de la izquierda, entonces marque falso; si está por debajo, vaya al paso 4
  4. Fractal derecho encontrado, si es inferior a la media - bandera falsa, si es superior - ir al paso 5.
  5. Se encuentran todos los fractales y se fija la bandera - busque tres barras seguidas con las mismas banderas.

Pido que se muestre la variante lista. Puede que la vea una vez y se me quiten las dudas, pero ahora tengo mil y no puedo decidirme.

Qué hacer con todo esto en un indicador - no tengo ni idea(

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
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 pudiera, entonces no hay preguntas, entiendo la lógica, pero no puedo implementarla en el código, así que por favor muéstrame una variante lista, la veré una vez y las preguntas desaparecerán en el futuro, pero ahora hay miles de ellas y no puedo resolverlas yo mismo.

Qué hacer con todo esto en un indicador - ni idea(

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
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);
}
//===============================================================================================

¿Necesita una función que devuelva un número de barra fractal por su número?

Necesita una función que devuelva la presencia de un fractal en la barra requerida (índice de ciclo+3)

Razón de la queja: