Anulação dos indicadores padrão?!

 
Olá!
Por favor, informe sobre o seguinte problema.
Aqui está o código do Expert Advisor.
int handle; string filename="test_expert_log".csv"; int init() { handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';'); if(handle<1) { Print("File not found, last error ", 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,3,0,0,0,i); //test2=iStochastic("EURUSD",Período(),5,3,3,0,0,0,0,i); se (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Imprimir("Write Error!"} return(0); } return(0); }


O Expert Advisor funciona em EURUSD com uma simulação rápida nas barras formadas. Ele lê leituras estocásticas de outro par de moedas, eventualmente gerando um relatório do formulário:

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 e 78.13504823 (ver acima)
2006.10.20 16:00;4;78.13504823 e 78.65853659 (ver acima); etc.
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

é fácil ver que os valores dos indicadores são diferentes na mesma barra em uma nova série.
Entendo que o uso prático deste EA é duvidoso :o) mas o objetivo era mostrar o problema. Na prática parece assim: no terminal o indicador mostra corretamente, mas quando o chamo do Expert Advisor ele mostra dados errados. Depois de cortar tudo o que não influencia o indicador, obtivemos o seguinte resultado. Eu devo ser terrivelmente burro, mas não consigo encontrar meu erro.
A propósito, se eu mudar o par de moedas para o atual, tudo está bem.
Agradeço antecipadamente sua ajuda.

 
Mudou ligeiramente o deinit()
//+------------------------------------------------------------------+
//|                                         TestSymbolStochastic.mq4 |
//|                                                           satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

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



Funciona para mim (mas ainda não verifiquei o arquivo completo)

 
Shaitan... :о)
É claro que o problema não é fechar o arquivo, porque, como disse antes, já me deparei com diferentes valores de indicador no terminal e quando fui chamado do Consultor Especialista. E então eu desenhei a saída para um arquivo para estudar este "fenômeno".
Na verdade, tudo funcionou no meu outro computador também. No entanto, não funcionou nesse meio tempo.
Achei suficiente adicionar mais um par de moedas...
   test1=iStochastic("GBPUSD",Período(),5,3,3,0,0,0,0,i); test2=iStochastic("EURGBP",Período(),5,3,3,0,0,0,0,i);


como a situação se repetiu
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
Pode-se ver que o primeiro par sob as condições dadas (!) funciona bem, porém o segundo...
O que é estranho para mim é que o problema não é sistemático. O mesmo código, em condições aparentemente semelhantes, dá resultados diferentes. O terminal é 198 em todos os lugares. Testado em dois corretores diferentes. Uma delas é a MIG.
Talvez os estimados senhores desenvolvedores me digam como combater esta coisa desagradável?

 
Como eu descobri, o problema não é com estocasticidade e nem mesmo com indicadores. A questão é que o MT4 por alguma razão "encaixa" não na barra atual, mas na anterior.
Se fizermos a seguinte amostragem,
tempo1,tempo2,tempo3; para (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("Write error!"); }


Eu recebo o seguinte:

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
A partir daqui, é normal.
Às vezes o crash acontece em uma moeda, às vezes em duas. Não fomos capazes de descobrir o sistema. Ou depende da potência do computador (embora eu o tenha executado em um computador bastante rápido), ou depende de outra coisa.
Mas o fato é que os testes são impossíveis. Nos primeiros acessos, a MT fornece dados incorretos.
A questão permanece: É um bug ou uma característica. :о) Se é um bug, como posso combatê-lo? Talvez alguém tenha enfrentado tal problema?

 
Sem ir muito fundo, presumo que você tenha algo com sua história (ou talvez esteja relacionado a peculiaridades de modelagem de preços), preste atenção ao tempo e aos índices que você produz
a primeira impressão mostra que a barra com o índice 1 se tornou índice 3, 2 se tornou índice 4, além disso, parece que você iniciou o Expert Advisor no H4, e a hora 22:00 não lhe diz nada
provavelmente gostaria de ler novamente o artigo sobre a simulação no testador, ele provavelmente pontilharia todos os "i "s.
boa sorte, não se esqueça de informar os resultados aqui ;)

P.S. alternativamente, você poderia tentar outra versão da simulação e ver os resultados, e já podem ser tiradas algumas conclusões
 
Não é realmente tão simples assim. A história está OK, ou seja, as barras especificadas estão presentes e parecem estar OK. Novamente, como escrevi acima - o teste foi conduzido em dois terminais diferentes de dois corretores diferentes com histórico diferente (FIBO, MIG).
E esta imagem também é observada em outras TFs (1H,30M,15M etc.) e diferentes variantes de simulação de preços (todas as três) ainda levam aos erros mencionados.
E não há nada de sobrenatural no bar das quatro horas às 22:00 - um bar comum "de domingo". Abre às 22:00 horas. Nem todos os corretores cortam a história, como a Alpari, por exemplo. ;о)
No entanto, o problema foi localizado ainda mais. Acontece que esta EA não produz erros com todos os corretores. Nomeadamente, está naqueles corretores, que têm dados de "domingo". Especificamente, a Alpari trabalha normalmente, mas a FIBO e a MIG têm erros. E os erros aparecem somente quando olhamos as barras de "domingo".
Eu não acho que isto seja uma "característica". Parece mais um bug. Pelo menos porque os erros não ocorrem nos mesmos pares. Pode ocorrer em um momento em um par, em outro momento em outro, e no terceiro momento em ambos.
Eu ainda espero atrair a atenção dos desenvolvedores para este problema e obter uma resposta deles: qual é este problema e como combatê-lo ;o) (Não me diga: "trabalhe com Alpari" :o))

P.S. Em qualquer caso, graças à Profi_R pela participação, mas como você vê, soluções simples não ajudam, talvez eu tenha que ir fundo. :о)
 
Estou tentando fazer mais ou menos a mesma coisa no momento. Indicador:

#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);
}



Há pouca utilidade prática para ela, pois não se presta a testes de história (a segunda moeda cria lucros fantásticos se as barras das duas histórias não estiverem sincronizadas, já escrevi sobre isso antes). Mas não é essa a questão.

Como você pode ver pelo código, o indicador não depende da moeda que está anexado ao gráfico. Funciona sempre por USDCHF. Anexamos o indicador a dois gráficos, no meu caso AUDUSD e EURUSD, mas suponho que podemos anexá-lo a qualquer gráfico. Deixamo-lo por alguns dias. E vemos que os gráficos são DIFERENTES. O mesmo indicador. Em tempo real. O mesmo MT. Rastejar à força (desenganchar - desenganchar) - eles se tornam os mesmos. Por algum tempo.

Estou rastreando agora e se eu encontrar alguma coisa, eu o informarei. Pode, é claro, ser por minha causa :)

 
Aqui vamos nós. Como pode haver uma pretensão ao "meu" indicador, dizendo que há algo errado na lógica, escrevi um indicador simplificado para testar a "moeda auxiliar".

O código (veja abaixo) toma (não importa a que janela o indicador está anexado) dados de USDCHF, H1 e desenha um gráfico a) Aberto, MA(Aberto, 6) e MA(Aberto, 6, calculado manualmente, sem chamar o indicador padrão).

O indicador foi anexado ao EURUSD H1 e ao AUDUSD H1. Após 12 horas de trabalho, as diferenças podem ser vistas nos gráficos (lembre-se, os dados são retirados do USDCHF e não deve haver diferenças). Além disso, as diferenças não estão no MA, mas exatamente nas linhas Abertas (claro, no MA também, mas é secundário, por causa da Aberta).

Portanto, há um bug associado ao uso de dados de outra moeda. Prezados desenvolvedores?

#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);
}
 
Quanto mais longe na floresta, mais espessos são os partidários.
Primeiro, quanto maior for a história, maiores serão os erros.
Em segundo lugar, aqui está o código (desculpas pela desajeitação do código imediatamente):
#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);
  }


nos pares de moedas EURUSD e GBPUSD, sendo executado no EURGBP em 4H dá mais de 2000 erros
em 15M - mais de 26500.
E na 15M o turno não é uma barra, mas muitas, muitas mais (mais de 100 (!) barras)
aqui está um pedaço de tronco:
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
Este registro foi retirado do servidor Alpari com novo terminal e novo histórico (antes de 3.10.2005 em 15M para os três pares de moedas).
O objetivo de todas estas investigações é obter uma explicação inteligível deste fenômeno por parte dos desenvolvedores.
E o que me confunde é que não ouço uma palavra de vocês, queridos senhores, há cerca de uma semana.
Não sei como provar a seriedade do problema para você, para que você preste atenção a ele.
A simplicidade transparente da situação e o código me impedem de pensar em um erro trivial. Por isso, POR FAVOR, POR FAVOR, POR FAVOR, AOS DESIGNADORES:
Caros senhores! Peço-lhes encarecidamente que prestem atenção a este tópico e dêem pelo menos alguns comentários de sua parte. Se o erro for meu, por favor, não pense que a culpa é minha - pelo menos me diga onde procurá-lo. E, nesse caso, peço desculpas por isso. Se for um erro no MT4 - então eu acho que você deve respeitar o tempo das pessoas (não apenas eu, quero dizer) que gastam este precioso recurso para encontrar e trazer à sua atenção esta situação, que na verdade não é tarefa direta delas.
Com respeito e esperança de um diálogo construtivo ... :о)

 
Você vê, você se confundiu :)
Há quase vinte anos, sentado em meu dormitório e agitando meu chá em círculo com uma colher, descobri que a imagem através do funil ficou distorcida. Imediatamente esqueci a explicação simples e a vi como uma confirmação de que as massas de água se movendo em círculo causam mudanças locais de gravitação (e isso explica o desaparecimento de navios ao redor do Triângulo das Bermudas) e conseqüentemente a refração das ondas (luz). Este eclipse durou alguns minutos antes de eu perceber que era uma lente banal obtida a partir de água turbulenta :)

Mudei ligeiramente seu código:
//+------------------------------------------------------------------+
//|                                             RedrawIndicators.mq4 |
//|                                                           Satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

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



 
Seu código revelou o fato de que em diferentes barras de instrumentos com o mesmo índice nem sempre refletem o mesmo período de tempo.
Então a pergunta realmente soa assim - por que eles não são os mesmos, por que existem buracos na história? Eu corri este indicador no GBPJPY H4 e abri os dois arquivos resultantes.
Você pode ver imediatamente que o tempo é quebrado em dois lugares e o segundo arquivo mostra um monte de "erros".




Citações do PS Alpari.
Razão: