Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 34

 
Artyom Trishkin:

Покажите весь ваш индикатор - глянем что там не так.

Спасибо.

Вот он


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

Спасибо.

Вот он

...

Уточню.

Хочу поставить стрелку вверх если линия индикатора пересекла уровень 20, на периоде М1, и линия индикатора направлена вверх, находится выше уровня 50 , на периоде М5.

Давайте посмотрим как значения получить со старшего таймфрейма, находясь на младшем:

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

А дальше попробуйте вместо Comment() сделать логику, которую хотите.

Поглядим...

 
Artyom Trishkin:

Давайте посмотрим как значения получить со старшего таймфрейма, находясь на младшем:

А дальше попробуйте вместо Comment() сделать логику, которую хотите.

Поглядим...

Спасибо, всё получилось )

В советнике, при вызове индикатора, достаточно просто указать число нужного таймфрейма, а в индикаторе “пляски” со сдвигом. Где об этом почитать подробнее?

 
mila.com:

Спасибо, всё получилось )

В советнике, при вызове индикатора, достаточно просто указать число нужного таймфрейма, а в индикаторе “пляски” со сдвигом. Где об этом почитать подробнее?

Нигде не читал об этом - не подскажу даже.

Ну вот сами представьте себе: вы идёте в цикле по барам на М1. Берёте значения индикатора с номера бара, на который ссылается индекс цикла i.

 
 i+8i+7
i+6
 i+5 i+4i+3
 i+2 i+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+2 i+2i+1
 i+1i+1
i+1
 i+1 i

В табличке в заголовке вверху индекс цикла М1, ниже - значение времени бара, на которое ссылается индекс М1

В самом низу индекс цикла М5, выше - значение времени бара, на которое ссылается индекс М5

Вот когда вы передаёте в функцию iCustom() значение индекса с текущего тф, на котором цикл, то получаете значения индикатора со старшего тф по индексу. А индекс не ссылается на нужный вам бар, что и видно из таблички.

И так нужно поступать и в советниках, иначе - вы берёте значения не с ожидаемого бара, а думаете, что получили его верно. Получили-то верно, но не с того бара. Это нужно знать и учитывать.

Т.е., при мультитаймовом получении данных нужно опираться на время, и пересчитывать его в номер бара на нужном тф.

 

Артём, помогите и мне пожалуйста, с индикаторами у меня проблемы.

Нужно найти вот такие конструкции, и поставить на них стрелки, функции в советнике работают и подключаются просто, ну это и понятно - там нужны только текущие значения, а вот как их перенести в индикатор, чтоб рисовал совпадения на истории...?

Стрелки рисовать на свече, сразу при совпадении условия: High[1] и Low[1]

 

 

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

Потом по аналогии буду пробовать вписывать другие паттерны, чтоб не гонять советники.

Спасибо!

 
Vitaly Muzichenko:

Артём, помогите и мне пожалуйста, с индикаторами у меня проблемы.

Нужно найти вот такие конструкции, и поставить на них стрелки, функции в советнике работают и подключаются просто, ну это и понятно - там нужны только текущие значения, а вот как их перенести в индикатор, чтоб рисовал совпадения на истории...?

Стрелки рисовать на свече, сразу при совпадении условия: High[1] и Low[1]

 ...

Потом по аналогии буду пробовать вписывать другие паттерны, чтоб не гонять советники.

Спасибо!

Для разных паттернов - своя логика должна быть, ведь не все они одинаковы. Да и для одного и того же паттерна разные программисты напишут по-разному логику.

А что именно, какой паттерн, вы хотите определять?

Начнём с этого.

 
Artyom Trishkin:

Для разных паттернов - своя логика должна быть, ведь не все они одинаковы. Да и для одного и того же паттерна разные программисты напишут по-разному логику.

А что именно, какой паттерн, вы хотите определять?

Начнём с этого.

Картинку прикрепил.

Нужно условие: фрактал "3" выше фрактала "2", и фрактал "1" выше "2" - FrDn3 > FrDn2 && FrDn2 < FrDn1  При этом смотрим свечи, фракталы уже образовались, и ждут подтверждения свечной модели,

и если есть "3" подряд растущие - покупка (стрелка) - GetBearBull(dSymbol,0,3)==1 (1 - покупка)

Для продаж - наоборот. 

В советник это засунуть просто, а вот в индикатор ...

 
Vitaly Muzichenko:

Картинку прикрепил.

Нужно условие: фрактал "3" выше фрактала "2", и фрактал "1" выше "2" - FrDn3 > FrDn2 && FrDn2 < FrDn1  При этом смотрим свечи, фракталы уже образовались, и ждут подтверждения свечной модели,

и если есть "3" подряд растущие - покупка (стрелка) - GetBearBull(dSymbol,0,3)==1 (1 - покупка)

Для продаж - наоборот. 

В советник это засунуть просто, а вот в индикатор ...

В индикаторе логика наоборот - если в советнике вы начинаете поиск вглубь истории, то в индикаторе - от её начала. Ищите сначала левый фрактал, затем средний, затем правый.

Управляем флагами.

  1. Флаг = false
  2. Нашли левый фрактал - ставим флаг true
  3. Нашли средний фрактал, если он выше левого - флаг в false, если ниже, идём на п.4
  4. Нашли правый фрактал, если он ниже среднего - флаг в false, если выше - идем на п.5
  5. Все фракталы найдены и флаг установлен - ищем три подряд бара так же с флагами.
 
Artyom Trishkin:

В индикаторе логика наоборот - если в советнике вы начинаете поиск вглубь истории, то в индикаторе - от её начала. Ищите сначала левый фрактал, затем средний, затем правый.

Управляем флагами.

  1. Флаг = false
  2. Нашли левый фрактал - ставим флаг true
  3. Нашли средний фрактал, если он выше левого - флаг в false, если ниже, идём на п.4
  4. Нашли правый фрактал, если он ниже среднего - флаг в false, если выше - идем на п.5
  5. Все фракталы найдены и флаг установлен - ищем три подряд бара так же с флагами.

Если-бы мог, то без вопросов, логику понимаю, а вот в коде реализовать не могу, поэтому прошу показать готовым вариантом, Я его единоразово увижу, и вопросы в будущем отпадут, а пока их тысяча и решить сам не могу.

Что со всем этим делать в индикаторе - не представляю(

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

Если-бы мог, то без вопросов, логику понимаю, а вот в коде реализовать не могу, поэтому прошу показать готовым вариантом, Я его единоразово увижу, и вопросы в будущем отпадут, а пока их тысяча и решить сам не могу.

Что со всем этим делать в индикаторе - не представляю(

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

Разве вам нужна функция, возвращающая номер бара фрактала по его номеру?

Вам нужна ф-ция, возвращающая наличие фрактала на нужном баре (индексе цикла+3)

Причина обращения: