¿Anulación de los indicadores estándar? - página 2

 
Roche(s) tiene razón. Sólo quería escribir sobre ello, pero se me adelantó (como siempre). Pero. Mi indicador no tiene nada que ver, tiene otro problema. Se dibuja de forma diferente en los distintos pares de divisas (y los datos se toman siempre del USDCHF y siempre al principio de la barra, a los 00 minutos), en tiempo real. El número de barra es siempre 1. Por lo tanto, hay un error. Sí, lo hay. Y hasta que no se arregle, no se puede probar y usar esas cosas sin riesgo.

De hecho, mi indicador puede simplificarse aún más. Simplemente creamos en una ventana separada Open[0] para USDCHF y conectamos este indicador a EURUSD y AUDUSD. Después de algún tiempo (en el gráfico horario - unas pocas horas) la divergencia comenzará a aparecer.
 
Roche(s) tiene razón. Sólo quería escribir sobre ello, pero se me adelantó (como siempre). Pero. Mi indicador no tiene nada que ver, tiene otro problema. Se dibuja de forma diferente en los distintos pares de divisas (y los datos se toman siempre del USDCHF y siempre al principio de la barra, a los 00 minutos), en tiempo real. El número de barra es siempre 1. Por lo tanto, hay un error. Sí, lo hay. Y hasta que no se arregle, no podemos probar y utilizar esas cosas sin riesgo. <br / translate="no">.
De hecho, mi indicador puede simplificarse aún más. Simplemente creamos en una ventana separada Open[0] para USDCHF y conectamos este indicador a EURUSD y AUDUSD. Después de algún tiempo (en el gráfico horario - unas horas) comenzarán a aparecer divergencias.


Sólo con ver tu creación :) Tu estilo no ha cambiado, escribes con claridad... para ti :)
 
La versión de Quark, retocada:
//+------------------------------------------------------------------+
//|                                                     QuarkBug.mq4 |
//|                                                            Quark |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Quark"
#property link      "http://www.metaquotes.ru/forum/7790/"


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

////////////////////////
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
	string strIndicatorShortName = "Test(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_LINE);
	SetIndexBuffer(0,arrOpen);
	SetIndexLabel(0,"arrOpen");

	SetIndexStyle(1, DRAW_LINE);
	SetIndexBuffer(1,arrMa);
	SetIndexLabel(1,"arrMa");

	SetIndexStyle(2, DRAW_LINE);
	SetIndexBuffer(2,arrMyMa);
	SetIndexLabel(2, "arrMyMa");

	IndicatorDigits(MarketInfo("USDCHF",MODE_DIGITS));		
	// indicator buffers mapping
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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.0);
	
	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--;
		if (nPos<2) Print("nPos=",nPos);
   	}

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


 
Hay algo más que eso :)
Tengo dos pares - GBPUSD M5 y GBPJPY M5. Entonces me di cuenta - Quark, como usuario experimentado, ha ocultado el error más profundamente :) He comprobado la ecuación de la media móvil exponencial - es correcta. PERO... el código asume que si se abre una nueva barra en GBPJPY (donde el indicador está rondando), entonces se abrirá una nueva barra en USDCHF (de donde se lee Open[]).
¿Es realmente así? Por eso el error aparece gradualmente, en varios días, porque las diferencias necesitan tiempo para acumularse. Creo que lo he explicado todo con claridad...
 
Y aquí está el resultado visual

 
La versión con tres gráficos es aún más clara

 
Rosh, me quito el sombrero. Y, como prometí, me disculpo. Especialmente a los desarrolladores.
Como dice el refrán: "Me enfadé, me equivoqué, lo retiro todo". ;о)
La culpa la tienen los "agujeros" de la historia. Es interesante, por cierto, que sólo tengo un "agujero" de su ejemplo - 25.12.2001. Pero 14.03.2005 todas las barras están presentes.
Todavía estoy adivinando, donde 8 horas de citas han desaparecido, pero eso es otra historia.
En cualquier caso, muchas gracias por la ayuda. :о)
 
El problema es un poco diferente aquí :)<br / translate="no"> Tengo dos pares - GBPUSD M5 y GBPJPY M5. Entonces me di cuenta - Quark, como usuario experimentado, ha ocultado el error más profundamente :) He comprobado la ecuación de la media móvil exponencial - es correcta. PERO... el código asume que si se abre una nueva barra en GBPJPY (donde el indicador está rondando), entonces se abrirá una nueva barra en USDCHF (de donde se lee Open[]).
¿Es realmente así? Por eso el error aparece gradualmente, en varios días, porque las diferencias necesitan tiempo para acumularse. Creo que lo he explicado todo con claridad...


Mi estilo es... No lo sé. Quería hacerlo mejor. ¿Qué tiene de malo? Se acepta la crítica. Constructivo :)
Aquí hay una nueva variante, sin MA en absoluto. Dibuja iOpen(USDCHF) y iClose.

Ahora sobre la acumulación de errores debido a los diferentes tiempos de apertura de las barras. Formalmente, Open[0] es el mismo sin importar qué (se forma en hh:00). Pero en la práctica, ¿qué pasa si una barra de nuestro gráfico ya ha llegado (primer tick, es decir), y el USDCHF (moneda indicadora) aún no? Um... Uno pensaría que un código bien construido preguntaría al servidor, pero si eso no se hace, entonces sí, se utilizará el valor de la apertura anterior (de hace una hora) (¡¡muy mal!!) o el valor del último tick (que tampoco es muy bueno). Así que tal vez Roche tenga razón.

Sin embargo, no habrá acumulación de errores con esto (no es que estemos construyendo MAs, sólo estamos dibujando precios abiertos).

Para investigar el problema, he puesto un nuevo indicador en dos gráficos que también dibuja iClose.

Permítanme señalar que, incluso en este caso, puede haber divergencias. Por ejemplo, si el último tick en una de las divisas está MUY retrasado, y la Apertura en el gráfico llegó antes que el Cierre en la divisa del indicador.

Para investigar este problema, he añadido un tercer buffer al indicador que dibuja la apertura de la barra anterior. Creo que todo el mundo estará de acuerdo en que estos datos estarán SIEMPRE sincronizados en el reloj. Es difícil imaginar que una moneda tenga Open[0] y la otra no tenga Open[1] todavía.

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

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

// indicator parameters
extern int nPeriod = 6;

double arrOpen[];
double arrClose1[];
double arrOpen1[];

int nExtCountedBars = 0;

////////////////////////
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, arrClose1);
	SetIndexBuffer(2, arrOpen1);	
		
	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	int nPos = Bars - nExtCountedBars - 1;

	while(nPos > 0)
	{
		arrOpen[nPos - 1] = iOpen("USDCHF", 0, nPos - 1);
		arrClose1[nPos - 1] = iClose("USDCHF", 0, nPos);
		arrOpen1[nPos - 1] = iOpen("USDCHF", 0, nPos);		

		nPos--;
	}

	return(0);
}



Si el razonamiento anterior es correcto, resulta que hay que tener mucho cuidado cuando se utilizan datos de otra moneda. Sería bueno que los desarrolladores escribieran (en un ayudante, o donde sea) algún tipo de recomendación.

En unas 12 horas publicaré lo que ha salido de la prueba.

 
Quark, no me has oído.
 
<br / translate="no"> Quark, no me has oído.


No lo entiendo, explica.
Razón de la queja: