¿Anulación de los indicadores estándar?

 
¡Hola!
Le ruego que me asesore sobre el siguiente problema.
Aquí está el código del Asesor Experto.
int handle; string filename="test_expert_log.csv"; int init() { handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';'); if(handle<1) { Print("Archivo no encontrado, último 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,i); //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,i); if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("¡Error de escritura!"); } return(0); }


El Asesor Experto se ejecuta en EURUSD con una simulación rápida en las barras formadas. Lee las lecturas estocásticas de otro par de divisas, generando finalmente un informe de la forma

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 y 78.13504823 (ver arriba)
2006.10.20 16:00;4;78.13504823 y 78.65853659 (ver arriba); 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

es fácil ver que los valores de los indicadores son diferentes en la misma barra en una nueva ejecución.
Entiendo que el uso práctico de este EA es dudoso :o) pero el propósito era mostrar el problema. En la práctica se ve así: en el terminal el indicador se muestra correctamente, pero cuando lo llamo desde el Asesor Experto muestra datos diferentes, erróneos. Después de recortar todo lo que no influye en el indicador, obtuvimos el siguiente resultado. Debo ser terriblemente tonto pero no encuentro mi error.
Por cierto, si cambio el par de divisas por el actual, todo va bien.
Agradezco de antemano su ayuda.

 
Se ha modificado ligeramente 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);
  }
//+------------------------------------------------------------------+



A mí me funciona (pero no he comprobado todo el archivo)

 
Shaitan... :о)
Por supuesto el problema no es el cierre del archivo, porque como he dicho antes me he enfrentado a diferentes valores del indicador en el terminal y cuando se llama desde el Asesor Experto. Y luego dibujé la salida a un archivo para estudiar este "fenómeno".
De hecho, todo funcionó también en mi otro ordenador. Sin embargo, no funcionó mientras tanto.
Me pareció suficiente añadir un par de divisas más...
   test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,i); test2=iStochastic("EURGBP",Period(),5,3,3,0,0,i);


cómo se repitió la situación
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
Se puede ver que el primer par en las condiciones dadas (!) funciona bien, sin embargo el segundo...
Lo que me extraña es que el problema no sea sistemático. El mismo código en condiciones aparentemente similares da resultados diferentes. El terminal es 198 en todas partes. Probado en dos corredores diferentes. Uno de ellos es el MIG.
¿Quizá los estimados señores desarrolladores me digan cómo combatir esta cosa tan desagradable?

 
Como he descubierto, el problema no es con la estocasticidad y no con los indicadores en absoluto. El asunto es que MT4 por alguna razón "encaja" no la barra actual sino la anterior.
Si hacemos el siguiente muestreo,
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("¡Error de escritura!"); }


Me sale lo siguiente:

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 de aquí es normal.
A veces el choque se produce en una moneda, a veces en dos. No hemos sido capaces de entender el sistema. O bien depende de la potencia del ordenador (aunque yo lo ejecuté en uno bastante rápido), o bien depende de otra cosa.
Pero el hecho es que las pruebas son imposibles. En los primeros accesos MT da datos incorrectos.
La pregunta sigue siendo: ¿es un error o una característica? :о) Si se trata de un error, ¿cómo puedo combatirlo? ¿Quizás alguien se ha enfrentado a un problema así?

 
Sin profundizar demasiado, asumo que tienes algo mal en tu historial (o quizás tenga que ver con la modelización de precios), presta atención a la hora y a los índices que estás visualizando
la primera impresión muestra que la barra con el índice 1 se ha convertido en el índice 3, el 2 se ha convertido en el índice 4, además, parece que has iniciado el Asesor Experto en H4, y la hora 22:00 no te dice nada
probablemente me gustaría volver a leer el artículo sobre la simulación en el probador, probablemente pondría todos los puntos sobre las íes.
buena suerte, no olvides informar de los resultados aquí ;)

P.D. alternativamente podrías probar otra versión de la simulación y ver los resultados, y ahí ya se pueden sacar algunas conclusiones
 
En realidad no es tan sencillo. El historial está bien, es decir, las barras especificadas están presentes y parecen estar bien. Una vez más, como escribí anteriormente - la prueba se llevó a cabo en dos terminales diferentes de dos corredores diferentes con diferente historia (FIBO, MIG).
Y este cuadro se observa también en otros TFs (1H,30M,15M etc.) y diferentes variantes de simulación de precios (los tres) siguen conduciendo a los errores mencionados.
Y no hay nada sobrenatural en el bar de las cuatro a las 22:00: un bar "dominical" normal y corriente. Abre a las 22:00. No todos los corredores de bolsa cortan la historia, como Alpari, por ejemplo. ;о)
Sin embargo, el problema estaba aún más localizado. Resultó que este EA no produce errores con todos los corredores. Concretamente, es en esos corredores, que tienen datos "dominicales". En concreto, Alpari funciona con normalidad, pero FIBO y MIG presentan errores. Y los errores sólo aparecen cuando miramos las barras de los "domingos".
No creo que esto sea una "característica". Parece más bien un bicho. Al menos porque los errores no se producen en los mismos pares. Puede ocurrir en un momento en un par, en otro momento en otro par, y en el tercer momento en ambos pares.
Todavía espero atraer la atención de los desarrolladores a este problema y obtener una respuesta de ellos: qué es este problema y cómo combatirlo ;o) (No me digas: "trabaja con Alpari" :o))

P.D. En cualquier caso, gracias a Profi_R por la participación, pero como ves, las soluciones simples no sirven, quizás tenga que profundizar. :о)
 
En este momento estoy tratando de resolver más o menos lo mismo. 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);
}



Tiene poca utilidad práctica, ya que no se presta a la comprobación del historial (la segunda moneda crea fantásticas ganancias si las barras de los dos historiales no están sincronizadas, ya he escrito sobre esto). Pero esa no es la cuestión.

Como se puede ver en el código, el indicador no depende de la divisa a la que está unido el gráfico. Siempre funciona para el USDCHF. Adjuntamos el indicador a dos gráficos, en mi caso AUDUSD y EURUSD, pero supongo que podemos adjuntarlo a cualquier gráfico. Lo dejamos durante unos días. Y vemos que los gráficos son DIFERENTES. El mismo indicador. En tiempo real. La misma MT. Volver a dibujar a la fuerza (desenganchar - desenganchar) - se convierten en lo mismo. Durante algún tiempo.

Estoy rastreando ahora y si encuentro algo, os lo haré saber. Puede ser, por supuesto, por mi culpa :)

 
Aquí está. Como puede haber una pretensión de "mi" indicador, diciendo que hay algo mal en la lógica, escribí un indicador simplificado para probar la "moneda de ayuda".

El código (ver abajo) toma (no importa a qué ventana se adjunte el indicador) los datos de USDCHF, H1 y dibuja un gráfico a) Open, MA(Open, 6) y MA(Open, 6, calculado manualmente, sin llamar al indicador estándar).

El indicador se ha adjuntado al EURUSD H1 y al AUDUSD H1. Después de 12 horas de trabajo las diferencias se pueden ver en los gráficos (ojo, los datos están tomados del USDCHF y no debería haber diferencias). Además, las diferencias no están en la MA, sino exactamente en las líneas de Open (por supuesto, en la MA también, pero es secundario, por la Open).

Por lo tanto, hay un error asociado al uso de datos de otra moneda. Estimados desarrolladores...

#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);
}
 
Cuanto más se adentra en el bosque, más densos son los partisanos.
En primer lugar, cuanto mayor sea la historia, mayores serán los errores.
En segundo lugar, aquí está el código (disculpas por lo engorroso del código):
#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);
  }


en los pares de divisas EURUSD y GBPUSD, al ser ejecutado en EURGBP en 4H da más de 2000 errores
en el 15M - más de 26500.
Y en el 15M el desplazamiento no es de una barra, sino de muchas, muchas más (más de 100 (!) barras)
aquí hay un trozo 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 fue tomado del servidor de Alpari con un terminal fresco y un historial reciente (hasta el 3.10.2005 en 15M para los tres pares de divisas).
El objetivo de todas estas investigaciones es conseguir una explicación inteligible de este fenómeno por parte de los desarrolladores.
Y lo que me confunde es que no he escuchado una palabra de ustedes, queridos señores, desde hace una semana.
No sé cómo demostrarle la gravedad del problema para que le preste atención.
La transparente simplicidad de la situación y del código me impide pensar en un error trivial. Así que POR FAVOR HAGAMOS UN LLAMADO A LOS DISEÑADORES:
Estimados señores. Le pido encarecidamente que preste atención a este hilo y que aporte al menos algún comentario de su parte. Si es un error mío, por favor, no piense que es culpa mía, al menos dígame dónde buscarlo. Y en ese caso me disculparé por ello. Si se trata de un error en MT4 - entonces creo que usted debe respetar el tiempo de las personas (no sólo yo, quiero decir) que gastan este precioso recurso con el fin de encontrar y llamar la atención sobre esta situación, que en realidad no es su tarea directa.
Con respeto y esperanza de un diálogo constructivo... :о)

 
Ya ves, te has confundido :)
Hace casi veinte años, sentado en mi dormitorio y removiendo mi té en círculo con una cuchara, descubrí que la imagen a través del embudo se distorsionaba. Inmediatamente olvidé la sencilla explicación y lo vi como una confirmación de que las masas de agua que se mueven en círculo provocan cambios locales de gravitación (y eso explica la desaparición de barcos alrededor del Triángulo de las Bermudas) y, en consecuencia, la refracción de las ondas (la luz). Este eclipse duró unos minutos antes de que me diera cuenta de que se trataba de una lente banal obtenida de remolinos de agua :)

He modificado ligeramente su 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);
  }
//+------------------------------------------------------------------+



 
Su código reveló el hecho de que en diferentes instrumentos las barras con el mismo índice no siempre reflejan el mismo marco temporal.
Así que la pregunta es realmente la siguiente: ¿por qué no son iguales, por qué hay agujeros en la historia? Corrí este indicador en GBPJPY H4 y abrí los dos archivos resultantes.
Inmediatamente se puede ver que la sincronización se rompe en dos lugares y el segundo archivo muestra un montón de "errores"




Citas de PS Alpari.