Перерисовка стандартных индикаторов?!

 
Добрый день!
Подскажите пожалуйста по следующей проблеме.
Вот код эксперта.
int handle;
string filename="test_expert_log.csv";

int init()
  {
   handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';');
  if(handle<1)
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   return(0);
  }
int start()
  {
double test1,test2,test3;
int i;

  for (i=1;i<10;i++)
      {
       test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,0,i);

       if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Ошибка записи!");
      }

   return(0);
  }


Эксперт запускается на паре EURUSD с быстрой имитацией на сфоррмировавшихся барах. Он считывает показания стохастика с другой валютной пары, в конечном итоге формируется отчет вида:

2006.10.22 22:00;1;76.79738562
2006.10.20 20:00;2;78.13504823
2006.10.20 16:00;3;78.65853659
2006.10.20 12:00;4;80.50139276
2006.10.20 08:00;5;80.25974026
2006.10.20 04:00;6;86.36363636
2006.10.20 00:00;7;86.96969697
2006.10.19 20:00;8;80
2006.10.19 16:00;9;53.76884422
2006.10.23 00:00;1;65.15151515
2006.10.22 22:00;2;74.83660131
2006.10.20 20:00;3;76.79738562 а было 78.13504823 (см. выше)
2006.10.20 16:00;4;78.13504823 а было 78.65853659 (см. выше) и т.д.
2006.10.20 12:00;5;78.65853659
2006.10.20 08:00;6;80.50139276
2006.10.20 04:00;7;80.25974026
2006.10.20 00:00;8;86.36363636
2006.10.19 20:00;9;86.96969697
2006.10.23 04:00;1;52.85714286
2006.10.23 00:00;2;65.15151515
2006.10.22 22:00;3;74.83660131
2006.10.20 20:00;4;76.79738562
2006.10.20 16:00;5;78.13504823
2006.10.20 12:00;6;78.65853659
2006.10.20 08:00;7;80.50139276
2006.10.20 04:00;8;80.25974026
2006.10.20 00:00;9;86.36363636
2006.10.23 08:00;1;21.83406114
2006.10.23 04:00;2;52.85714286
2006.10.23 00:00;3;65.15151515
2006.10.22 22:00;4;74.83660131
2006.10.20 20:00;5;76.79738562
2006.10.20 16:00;6;78.13504823
2006.10.20 12:00;7;78.65853659
2006.10.20 08:00;8;80.50139276
2006.10.20 04:00;9;80.25974026

легко заметить, что при новом прогоне на одном и том же баре значения индикатора разные.
Понимаю, что практическая польза от данного советника сомнительна :о) но целью было показать возникшую проблему. Т.к. на практике это выглядит так: в терминале индикатор показывает правильно, а при вызове из эксперта - иные данные, неправильные. После отсекания всего не оказывающего влияния получился вот такой результат. Я наверно уже жутко туплю, но никак не пойму, где моя ошибка.
Кстати, если сменить валютную пару на текущую - то все ОК.
Заранее признателен за помощь.

 
Чуток изменил deinit()
//+------------------------------------------------------------------+
//|                                         TestSymbolStochastic.mq4 |
//|                                                           satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "satori"
#property link      "http://www.metaquotes.ru/forum/7790/&quot;

int handle;
string filename="test_expert_log.csv";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';');
  if(handle<1)
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double test1,test2,test3;
int i;

  for (i=1;i<10;i++)
      {
       test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,0,i);

       if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Ошибка записи!");
      }

//----
   return(0);
  }
//+------------------------------------------------------------------+



У меня все работает (правда весь файл не проверял)

 
Шайтан... :о)
Проблема конечно не в закрытии файла, ибо как я говорил изначально столкнулся с разными значениями индикатора в терминале и при вызове из эксперта. А уже потом сделал вывод в файл для изучения данного "феномена".
На самом деле у меня на другом компе тоже все заработало. Однако до поры, до времени...
Мне оказалось достаточным добавить еще одну валютную пару...
   test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       test2=iStochastic("EURGBP",Period(),5,3,3,0,0,0,i);


как ситуация повторилась
2006.10.22 22:00;1;74.83660131;19.04761905
2006.10.20 20:00;2;76.79738562;13.91304348
2006.10.20 16:00;3;78.13504823;25.26315789
2006.10.20 12:00;4;78.65853659;48.7804878
2006.10.20 08:00;5;80.50139276;81.57894737
2006.10.20 04:00;6;80.25974026;79.74683544
2006.10.20 00:00;7;86.36363636;74.66666667
2006.10.19 20:00;8;86.96969697;76.54320988
2006.10.19 16:00;9;80;79.22077922
2006.10.23 00:00;1;65.15151515;29.78723404
2006.10.22 22:00;2;74.83660131;19.67213115
2006.10.20 20:00;3;76.79738562;19.04761905
2006.10.20 16:00;4;78.13504823;13.91304348
2006.10.20 12:00;5;78.65853659;25.26315789
2006.10.20 08:00;6;80.50139276;48.7804878
2006.10.20 04:00;7;80.25974026;81.57894737
Видно, что первая пара в данных условиях (!) работает нормально, однако вторая...
Для меня странно другое - проблема не систематична. Один и тот же код во вроде бы сходных условиях дает разные результаты. Терминал везде 198. Проверялось на двух разных брокерах. Один из них MIG.
Может уважаемые господа разработчики подскажут, как бороться с данной напастью?

 
Как выяснилось, проблема не в стохастике и вообще не в индикаторах. Дело в том, что по какой-то причине МТ4 "подсовывает" не текущий бар, а предыдущий.
Если сделать вот такую выборку,
string time1,time2,time3;

  for (i=1;i<10;i++)
      {
      time1=TimeToStr(iTime("GBPUSD",Period(),i));
      time2=TimeToStr(iTime("EURGBP",Period(),i));
      time3=TimeToStr(iTime("EURUSD",Period(),i));
       if (FileWrite (handle,TimeToStr(Time[i]),i,time1,time2,time3)<=0) Print("Ошибка записи!");
      }


то у меня получается следующее:

2006.10.22 22:00;1;2006.10.22 22:00;2006.10.20 20:00;2006.10.22 22:00
2006.10.20 20:00;2;2006.10.20 20:00;2006.10.20 16:00;2006.10.20 20:00
2006.10.20 16:00;3;2006.10.20 16:00;2006.10.20 12:00;2006.10.20 16:00
2006.10.20 12:00;4;2006.10.20 12:00;2006.10.20 08:00;2006.10.20 12:00
2006.10.20 08:00;5;2006.10.20 08:00;2006.10.20 04:00;2006.10.20 08:00
2006.10.20 04:00;6;2006.10.20 04:00;2006.10.20 00:00;2006.10.20 04:00
2006.10.20 00:00;7;2006.10.20 00:00;2006.10.19 20:00;2006.10.20 00:00
2006.10.19 20:00;8;2006.10.19 20:00;2006.10.19 16:00;2006.10.19 20:00
2006.10.19 16:00;9;2006.10.19 16:00;2006.10.19 12:00;2006.10.19 16:00
2006.10.23 00:00;1;2006.10.23 00:00;2006.10.23 00:00;2006.10.23 00:00
2006.10.22 22:00;2;2006.10.22 22:00;2006.10.22 22:00;2006.10.22 22:00
2006.10.20 20:00;3;2006.10.20 20:00;2006.10.20 20:00;2006.10.20 20:00
дальше уже нормально.
Иногда сбой происходит на одной валюте, иногда на двух. Систему мы выяснить не удалось. Толи это зависит от мощности машины (хотя запускалось на достаточно шустрой), толи еще от чего-то...
Но факт на лицо - тестирование невозможно. При первых же обращениях МТ дает некорректные данные.
Остался вопрос: баг ли это или фича. :о) Если фича, то как с ней бороться. Может кто-то сталкивался с подобным?

 
не вникая глубоко рискну предположить что у тебя что-то с историей (а может связано с особенностями моделирования цены), обрати внимание на время и индексы которые ты выводишь
из первого принтинга видно что бар с индексом 1 стал с индексом 3, 2 стал 4, кроме того судя по всему запускал эксперта на Н4, а время 22:00 тебе ни о чем не говорит
наверно я бы еще раз прочел статейку о моделировании в тестере, она скорее всего расставит все точки над "и"
успехов, результаты не забудь доложить здесь ;)

P.S. альтернативно можно попробовать другой вариант моделирования и посмотреть результаты, а там уже и выводы кое-какие можно будет сделать
 
На самом деле не все так просто. С историей все в порядке, т.е. указанные бары присутствуют и с ними вроде все ОК. Опять же, как я писал выше - тест проводился на двух разных терминалах двух разных брокеров с разной историей (FIBO, MIG).
Причем такая картина наблюдается и на других TF (1Н,30М,15М и т.д.) да и разные варианты моделирования цены (все три) все равно приводят к упомянутым ошибкам.
И в четырехчасовом баре на 22:00 нет ничего сверхъестественного - обычный "воскресный" бар. Он действительно открывается в 22:00. Не все же брокеры урезают историю, как например Альпари. ;о)
Однако проблему удалось локализовать еще больше. Оказалось, что данный вид эксперта выдает ошибки не у всех брокеров. А именно у тех, у которых присутствуют "воскресные" данные. Если конкретно, то Альпари - работает нормально, а у FIBO и MIG - ошибки. Причем ошибки выдаются только когда мы смотрим в "воскресные" бары.
Не думаю, что это "фича". Скорее похоже на баг. Хотя бы потому, что ошибки не проявляются на одинаковых парах. Они в один момент могут быть на одной паре, в другой момент - на другой, а в третий - сразу на двух.
Я все еще не теряю надежды привлечь внимание разработчиков к данной проблеме и получить от них ответ: что это за напасть, и как с ней бороться ;о) (только не надо говорить: "работай с Альпари" :о))

P.S. В любом случае, спасибо Profi_R за участие, но как видишь, простые решения не помогают, видимо придется вникать глубоко. :о)
 
Я сейчас пытаюсь разобраться примерно с тем же. Индикатор:

#property copyright "Copyright Quark"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color2 Red
#property indicator_minimum -1
#property indicator_maximum 1

// indicator parameters
extern int nPeriod = 9;
extern int nPeriod_1 = 6;

// indicator buffers
double dUsdChf, dUsdChfPrev;

double arrGroupBuffer[];
double arrGroupMaBuffer[];

int nExtCountedBars = 0;

////////////////////////
int init()
{
	string strIndicatorShortName = "Group(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_NONE);
	SetIndexShift(0, 0);
		
	SetIndexStyle(1, DRAW_LINE);
	SetIndexShift(1, 0);

	IndicatorDigits(4);
		
	// indicator buffers mapping
	SetIndexBuffer(0, arrGroupBuffer);
	SetIndexBuffer(1, arrGroupMaBuffer);

	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	// last counted bar will be recounted
//	if(nExtCountedBars > 0) 
//		nExtCountedBars--;
		
	int nPos = Bars - nExtCountedBars - 1;

	double dPr = 2.0 / (nPeriod + 1);
	
	while(nPos > 0)
	{
		if(!IsTesting())
		{
			dUsdChf = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos - 1);
			dUsdChfPrev = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos);
		}

		arrGroupBuffer[nPos - 1] = 0;
			
		if(dUsdChfPrev - dUsdChf > 0)
			arrGroupBuffer[nPos - 1] += 1;
		else if(dUsdChfPrev - dUsdChf < 0)
			arrGroupBuffer[nPos - 1] -= 1;

		if(nPeriod_1 == 1)
			arrGroupMaBuffer[nPos - 1] = arrGroupBuffer[nPos - 1];
		else 
		{
			dPr = 2.0 / (nPeriod_1 + 1);

			arrGroupMaBuffer[nPos - 1] = arrGroupBuffer[nPos - 1] * dPr + 
				arrGroupMaBuffer[nPos] * (1 - dPr);
		}
		
		nPos--;
	}

	return(0);
}



Практической пользы от него мало, так как он не поддается тестированию на истории (вторая валюта создает фантастические прибыли, если бары двух историй не синхронизированы, я об этом уже писал). Но дело не в этом.

Как видно из кода, индикатор от валюты, к чарту которой он присоединен, не зависит. Он всегда работает по USDCHF. Присоединяем индикатор к двум чартам, в моем случае, AUDUSD и EURUSD, но полагаю, можно к любым. Оставляем на несколько дней. И видим, что графики - РАЗНЫЕ. Один и тот же индикатор. Реал тайм. Один и тот же МТ. Перерисовываем принудительно (отцепить - прицепить) - становятся одинаковыми. На какое-то время.

Сейчас я это дело трассирую, если что нарою, сообщу. Возможно, конечно, что дело во мне :)

 
Ну вот. Поскольку к "моему" индикатору может быть прерензия, мол, в логике что-то не так, я написал упрощенный индикатор для тестирования "валюты-помошника".

Код (см. ниже) берет (независимо от того, к какому окну прикреплен индикатор) данные из USDCHF, H1 и рисует график а) Open, MA(Open, 6) и MA(Open, 6, рассчитанная вручную, без вызова стандартного индикатора).

Индикатор был прикреплен к EURUSD H1 и AUDUSD H1. После 12 часов работы на графиках видны различия (напомню, данные берутся из USDCHF и различий быть не должно). Причем, различия не в МА, а именно в линиях Open (в МА, конечно, тоже, но это вторично, из-за Open).

Таким образом, имеет место баг, связанный с использованием данных другой валюты. Ув. разработчики?

#property copyright "Copyright Quark"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Aqua
#property indicator_color3 Red


// indicator parameters
extern int nPeriod = 6;

double arrOpen[];
double arrMa[];
double arrMyMa[];

int nExtCountedBars = 0;

double dUsdChf, dUsdChfPrev;

////////////////////////
int init()
{
	string strIndicatorShortName = "Test(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_LINE);
	SetIndexShift(0, 0);

	SetIndexStyle(1, DRAW_LINE);
	SetIndexShift(1, 0);

	SetIndexStyle(2, DRAW_LINE);
	SetIndexShift(2, 0);

	IndicatorDigits(4);
		
	// indicator buffers mapping
	SetIndexBuffer(0, arrOpen);
	SetIndexBuffer(1, arrMa);
	SetIndexBuffer(2, arrMyMa);
		
	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	int nPos = Bars - nExtCountedBars - 1;

	double dPr = 2.0 / (nPeriod + 1);
	
	while(nPos > 0)
	{
		dUsdChf = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos - 1);
		dUsdChfPrev = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos);

		arrOpen[nPos - 1] = iOpen("USDCHF", 0, nPos - 1);
		arrMa[nPos - 1] = dUsdChf;

		arrMyMa[nPos - 1] = arrOpen[nPos - 1] * dPr + 
				arrMyMa[nPos] * (1 - dPr);

		nPos--;
	}

	return(0);
}
 
Чем дальше в лес - тем толще партизаны.
Во-первых, чем больше история, тем больше ошибок.
Во-вторых, вот такой код (сразу прошу прощения за корявость кода):
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int       BarsCount=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";
string Para;
int TF;
int handle,handle2;
int init()
  {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexLabel(0,Currency1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexLabel(1,Currency2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

   string Para=Symbol();
   int TF=Period();
   handle= FileOpen("testfile.csv",FILE_CSV|FILE_WRITE,';');
   handle2= FileOpen("testfile2.csv",FILE_CSV|FILE_WRITE,';');
  if(handle<1 || handle2<1 )
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   return(0);
  }
int deinit()
  {
   FileClose(handle);
   return(0);
  }
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       ExtMapBuffer1[i]=iTime(Currency1,Period(),i);
       Sleep(1000);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),i);
       ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
       tt1=Time[i]-ExtMapBuffer1[i];
       tt2=Time[i]-ExtMapBuffer2[i];
       if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) 
        {
      if (FileWrite (handle,
      i,TimeToStr(Time[i]),TimeToStr(ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer2[i])
       )<=0) Print("нифига не пишет!!");
        }
        FileFlush(handle);
      if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }
   return(0);
  }


на валютных парах EURUSD и GBPUSD, будучи запущенным на EURGBP на 4Н дает больше 2000 ошибок
на 15М - более 26500.
Причем на 15М сдвиг составляет не один бар, а много-много больше (более 100 (!) баров)
вот кусок лога:
15.06.2006 1:45 16.06.2006 0:45 16.06.2006 0:00
15.06.2006 1:30 16.06.2006 0:30 15.06.2006 23:45
15.06.2006 1:15 16.06.2006 0:15 15.06.2006 23:30
15.06.2006 1:00 16.06.2006 0:00 15.06.2006 23:15
15.06.2006 0:45 15.06.2006 23:45 15.06.2006 23:00
15.06.2006 0:30 15.06.2006 23:30 15.06.2006 22:45
15.06.2006 0:15 15.06.2006 23:15 15.06.2006 22:30
15.06.2006 0:00 15.06.2006 23:00 15.06.2006 22:15
14.06.2006 23:45 15.06.2006 22:45 15.06.2006 22:00
14.06.2006 23:30 15.06.2006 22:30 15.06.2006 21:45
14.06.2006 23:15 15.06.2006 22:15 15.06.2006 21:30
14.06.2006 23:00 15.06.2006 22:00 15.06.2006 21:15
14.06.2006 22:45 15.06.2006 21:45 15.06.2006 21:00
14.06.2006 22:30 15.06.2006 21:30 15.06.2006 20:45
Данный лог снимался с сервера Альпари на свежевыкаченном терминале и свежей истории (до 3.10.2005 на 15М по всем трем валютным парам).
Смысл всех этих изысканий - получить вразумительное объяснение данному явлению от разработчиков.
Причем меня смущает то, что вот уже неделю от Вас, уважаемые господа, нет ни слова.
Я уже не знаю, каким образом доказать Вам серьезность проблемы, дабы Вы обратили на нее свое внимание.
Прозрачная простота ситуации и кода не позволяет мне думать о банальной ошибке. Поэтому В ОЧЕРЕДНОЙ РАЗ ОБРАЩАЮСЬ К РАЗРАБОТЧИКАМ:
Уважаемые господа! Убедительно прошу Вас обратить внимание на данную ветку и дать ХОТЬ КАКИЕ-ТО комментарии со своей стороны. Если это моя ошибка, то не сочтите за труд - подскажите хотя бы где ее искать. И в этом случае я принесу свои извинения за нее. Если же это ошибка в МТ4 - то я думаю стоит уважать время людей (я не только себя имею ввиду) которые тратят этот драгоценный ресурс дабы обнаружить и привлечь Ваше внимание к сложившейся ситуации, что вообще -то не является их прямой задачей.
С уважением и надеждой на конструктивный диалог... :о)

 
Видите ли, Вы сами себя запутали :)
Почти двадцать лет назад, сидя в общаге и размешивая ложечкой по кругу чай, я обнаружил, что изображение сквозь воронку стало искаженным. Я тут же забыл простое объяснение, а увидел в этом подтверждение того, что движущиеся по кругу водные массы вызвывают локальное изменение силы гравитации( и это объясняет исчезновение судов в районе Бермудского треугольника) и соответствено преломление волн (света). Это затмение длилось несколько минут,прежде чем до меня дошло, что это банальная линза, полученная из закрученной воды :)

Я Ваш код немного изменил:
//+------------------------------------------------------------------+
//|                                             RedrawIndicators.mq4 |
//|                                                           Satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Satori"
#property link      "http://www.metaquotes.ru/forum/7790/&quot;

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int       BarsCount=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";

int handle,handle2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexLabel(0,Currency1);

   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexLabel(1,Currency2);

   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

   handle= FileOpen("TestFile.csv",FILE_CSV|FILE_WRITE,';');
   handle2= FileOpen("TestFile2.csv",FILE_CSV|FILE_WRITE,';');
  if(handle<1 || handle2<1 )
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   else
   {
   FileWrite (handle,"index",Symbol(),Currency1,Currency2);
   FileWrite (handle2,"index",Symbol(),"  ",Currency1,"  ",Currency2);
   }

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2,TimeMain;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       TimeMain=Time[i];
       ExtMapBuffer1[i]=iTime(Currency1,Period(),iBarShift(Currency1,Period(),TimeMain));
       //Sleep(1000);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),iBarShift(Currency2,Period(),TimeMain));
       ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
       tt1=Time[i]-ExtMapBuffer1[i];
       tt2=Time[i]-ExtMapBuffer2[i];
       if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) 
         {
         if (FileWrite (handle,
         i,TimeToStr(Time[i]),TimeToStr(ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer2[i])
          )<=0) Print("нифига не пишет!!");
         }
        FileFlush(handle);
        if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,i,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }//----
   return(0);
  }
//+------------------------------------------------------------------+



 
Ваш код выявлял тот факт, что на разных инструментах бары с одним и тем же индексом не всегда отражают один и тот же временной интервал.
То есть, вопрос на самом деле звучит так - почему они не одинаковы, почему есть дыры в истории? Я прогнал этот индикатор на GBPJPY H4 и открыл два полученных файла.
Сразу видно, что в двух местах время ломается, и второй файл показывают кучу "ошибок"




PS Котировки Альпари.
Причина обращения: