Код:
//+------------------------------------------------------------------+
//|                                           Test_CopyTime_func.mq5 |
//|                            Copyright 2018, ir0407@forexdengi.com |
//|                                            ir0407@forexdengi.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, ir0407@forexdengi.com"
#property link      "ir0407@forexdengi.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input ENUM_TIMEFRAMES Tf1        = PERIOD_M15; //Исходный ТФ
input int             StartValue = 100;        //Стартовый бар
input ENUM_TIMEFRAMES Tf2        = PERIOD_H1;  //ТФ для поиска
input int             FindCount  = 10;         //Кол-во элементов для поиска

struct FIND_RESULT
{
  ENUM_TIMEFRAMES FindTf;
  int             FindBar;
  datetime        FindTime;
  ENUM_TIMEFRAMES ResultTf;
  int             ResultBar;
  datetime        ResultTime;
};

FIND_RESULT ResultArray[];

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  int SizeOfArray = ArrayResize(ResultArray, FindCount);
  MathSrand(GetTickCount());
  for(int i = StartValue, j = 0; j < FindCount; i += MathRand() % 9, j++)
  {
    ResultArray[j].FindTf = Tf1;
    ResultArray[j].FindBar = i;
    ResultArray[j].FindTime = iTimeByPos(Tf1, i);
    ResultArray[j].ResultTf = Tf2;
    ResultArray[j].ResultBar = iBarShift(Symbol(), Tf2, ResultArray[j].FindTime, true, ResultArray[j].ResultTime);
    
    if(ResultArray[j].FindTime == WRONG_VALUE || 
       ResultArray[j].ResultTime == WRONG_VALUE) return;
     
  }
  
  
  for(int i = 0; i < SizeOfArray; i++)
  {
    Print("ТФ1 = ", TfToString(ResultArray[i].FindTf), 
          "; BarIndex1 = ", IntegerToString(ResultArray[i].FindBar), 
          "; BarTime1 = ", TimeToString(ResultArray[i].FindTime, TIME_DATE|TIME_MINUTES|TIME_SECONDS),
          "; ТФ2 = ", TfToString(ResultArray[i].ResultTf), 
          "; BarIndex2 = ", IntegerToString(ResultArray[i].ResultBar), 
          "; BarTime2 = ", TimeToString(ResultArray[i].ResultTime, TIME_DATE|TIME_MINUTES|TIME_SECONDS));
    //Sleep(150);
  }
}

//+------------------------------------------------------------------+
datetime iTimeByPos(ENUM_TIMEFRAMES Tf, int BarIndex)
{
  datetime Result[1];
  ResetLastError();
  
  for(int i = 0; i < 5; i++)
  {
    if(CopyTime(Symbol(), Tf, BarIndex, 1, Result) == 1)
      break;
    else
    {
      Print("ERROR(", GetLastError(), ") @ iTimeByPos(", Tf, ", ", IntegerToString(BarIndex), ")");
      Sleep(500);
    }
  }
  return((GetLastError() == 0) ? Result[0] : WRONG_VALUE);
}

//+------------------------------------------------------------------+
datetime iTimeByTime(ENUM_TIMEFRAMES Tf, datetime BarTime)
{
  datetime Result[1];
  for(int i = 0; i < 5; i++)
  {
    if(CopyTime(Symbol(), Tf, BarTime, 1, Result) == 1)
      break;
    else    
    {
      Print("ERROR(", GetLastError(), ") @ iTimeByTime(", Tf, ", ", TimeToString(BarTime,TIME_DATE|TIME_MINUTES|TIME_SECONDS), ")");
      Sleep(500);
    }
  }
  return((GetLastError() == 0) ? Result[0] : WRONG_VALUE);
}
  
//+------------------------------------------------------------------+
int iBarShift( const string symbol,               // Символ
              const ENUM_TIMEFRAMES timeframe,    // Период
              const datetime time,                // Время для нахождения номера бара
              const bool asSeries,                // Флаг порядка нумерации
              datetime &barOpenTime               // Время открытия бара (out)
             )
  {
//--- Искомый номер
   int res=WRONG_VALUE;
//--- Время открытия последнего бара
   datetime lastBar;
//--- Получаем время открытия последнего бара по символу/периоду
   if(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,lastBar))
     {
      //--- Количество баров в истории
      const int bars=Bars(symbol,timeframe);
      const bool sync = (bool)SeriesInfoInteger( symbol, timeframe, SERIES_SYNCHRONIZED );
      if( bars <= 0 || !sync )                    // Если функция не сработала|история не синхронизирована
         return( res );                           // Возвращаем ложное значение
      //--- Проверка на нулевой бар
      if( time >= lastBar )                       // Если время не больше времени открытия последней свечи
         res =( asSeries ) ? 0 : bars-1;          // Номер последнего бара
      else                                        // Если время меньше времени открытия последней свечи
        {
         //--- Получаем количество баров в истории до времени открытия свечи time
         int shift=Bars(symbol,timeframe,time,lastBar);
         //--- Определяем время открытия бара для времени time
         barOpenTime=iTimeByTime(timeframe,time);
         //--- Проверяем корректность данных
         if(barOpenTime>0 && shift>0) // Если время корректно и количество баров найдено
           {
            //--- Проверяем, совпадает ли время открытия бара с временем time
            shift=(barOpenTime==time) ? shift-1 : shift;   // Изменяем сдвиг при необходимости
            //--- Определяем номер бара в зависимости от индексации баров
            res=(asSeries) ? shift : bars-shift-1;
           }
        }
     }
   else                         // Если значение не получено - ошибка
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": Время открытия последнего бара по "+symbol+
            " "+EnumToString(timeframe)+" не получено!");
//--- Возвращаем номер бара
   return( res );
  }

string TfToString(ENUM_TIMEFRAMES Tf)
{
  string Result;
  switch(Tf)
  {
    case PERIOD_CURRENT: Result = TfToString(Period()); break;
    case PERIOD_M1:      Result = "M1"; break;
    case PERIOD_M2:      Result = "M2"; break;
    case PERIOD_M3:      Result = "M3"; break;
    case PERIOD_M4:      Result = "M4"; break;
    case PERIOD_M5:      Result = "M5"; break;
    case PERIOD_M6:      Result = "M6"; break;
    case PERIOD_M10:     Result = "M10"; break;
    case PERIOD_M12:     Result = "M12"; break;
    case PERIOD_M15:     Result = "M15"; break;
    case PERIOD_M20:     Result = "M20"; break;
    case PERIOD_M30:     Result = "M30"; break;
    case PERIOD_H1:      Result = "H1"; break;
    case PERIOD_H2:      Result = "H2"; break;
    case PERIOD_H3:      Result = "H3"; break;
    case PERIOD_H4:      Result = "H4"; break;
    case PERIOD_H6:      Result = "H6"; break;
    case PERIOD_H8:      Result = "H8"; break;
    case PERIOD_H12:     Result = "H12"; break;
    case PERIOD_D1:      Result = "D1"; break;
    case PERIOD_W1:      Result = "W1"; break;
    case PERIOD_MN1:     Result = "MN1"; break;
  }
  return(Result);
}