Anulação dos indicadores padrão?! - página 2

 
A(s) Roche(s) está(ão) certa(s). Eu só queria escrever sobre isso, mas ele me venceu (como sempre). Mas. Meu indicador não tem nada a ver com isso, ele tem outro problema. O desenho é feito de forma diferente em diferentes pares de moedas (e os dados são sempre tirados de USDCHF e sempre no início da barra, aos 00 minutos), em tempo real. O número de barras é sempre 1. Portanto, há um bug. Sim, há. E até que seja fixado, você não pode testar e usar tais coisas sem risco.

Na verdade, meu indicador pode ser ainda mais simplificado. Nós simplesmente criamos em uma janela separada Abrir[0] para USDCHF e conectamos este indicador ao EURUSD e AUDUSD. Após algum tempo (na tabela horária - algumas horas), a divergência começará a aparecer.
 
A(s) Roche(s) está(ão) certa(s). Eu só queria escrever sobre isso, mas ele me venceu (como sempre). Mas. Meu indicador não tem nada a ver com isso, ele tem outro problema. O desenho é feito de forma diferente em diferentes pares de moedas (e os dados são sempre tirados de USDCHF e sempre no início da barra, aos 00 minutos), em tempo real. O número de barras é sempre 1. Portanto, há um bug. Sim, há. E até que seja corrigido, não podemos testar e usar tais coisas sem risco. <br / translate="no">.
Na verdade, meu indicador pode ser ainda mais simplificado. Nós simplesmente criamos em uma janela separada Abrir[0] para USDCHF e conectamos este indicador ao EURUSD e AUDUSD. Após algum tempo (na tabela horária - algumas horas) as divergências começarão a aparecer.


Apenas olhando para sua criação :) Seu estilo não mudou, você escreve claramente... para você :)
 
Versão do Quark, retrabalhada:
//+------------------------------------------------------------------+
//|                                                     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);
  }
//+------------------------------------------------------------------+


 
Há um pouco mais do que isso :)
Eu tenho dois pares - GBPUSD M5 e GBPJPY M5. Então percebi - Quark, como um usuário experiente, escondeu o erro mais profundamente :) Verifiquei a equação da média móvel exponencial - ela está correta. MAS... o código assume, que se uma nova barra abre em GBPJPY (onde o indicador está pairando), então uma nova barra abrirá em USDCHF (de onde Open[] é lido).
É mesmo assim? É por isso que o erro aparece gradualmente, em vários dias, porque as diferenças precisam de tempo para se acumular. Acho que expliquei tudo claramente...
 
E aqui está o resultado visual

 
A versão com três gráficos é ainda mais clara

 
Rosh, meu chapéu está fora para você. E, como prometido, peço desculpas. Especialmente para os desenvolvedores.
Como diz o ditado: "Eu me zanguei, eu estava errado, eu retiro tudo". ;о)
Realmente culpam os "buracos" da história. É interessante, a propósito, que eu tenho apenas um "buraco" de seu exemplo - 25.12.2001. Mas 14.03.2005 todas as barras estão presentes.
Ainda estou adivinhando, por que 8 horas de citações desapareceram, mas isso é outra história.
Em qualquer caso, muito obrigado pela ajuda. :о)
 
O problema é um pouco diferente aqui :)<br / translate="no"> Tenho dois pares - GBPUSD M5 e GBPJPY M5. Então percebi - Quark, como um usuário experiente, escondeu o erro mais profundamente :) Verifiquei a equação da média móvel exponencial - ela está correta. MAS... o código assume, que se uma nova barra abre em GBPJPY (onde o indicador está pairando), então uma nova barra abrirá em USDCHF (de onde Open[] é lido).
É mesmo assim? É por isso que o erro aparece gradualmente, em vários dias, porque as diferenças precisam de tempo para se acumular. Acho que expliquei tudo claramente...


Meu estilo é... Eu não sei. Eu queria fazer melhor. O que há de errado com isso? Críticas aceitas. Construtivo :)
Aqui está uma nova variante, sem MA de todo. Ele desenha iOpen(USDCHF) e iClose.

Agora sobre o acúmulo de erros devido ao tempo de abertura de diferentes bares. Formalmente, Open[0] é o mesmo, não importa o que seja (ele é formado em hh:00). Mas na prática, e se já chegou uma barra em nosso gráfico (primeiro tique, ou seja), e o USDCHF (moeda indicadora) ainda não chegou? Um... Seria de se pensar que um código construído corretamente perguntaria ao servidor, mas se isso não for feito, então sim, ou o valor do anterior (hora atrás) Abrir (muito errado!!!!) ou o valor do último tick será usado (o que também não é bom). Portanto, talvez a Roche tenha razão.

No entanto, não haverá acumulação de erros com isto (não é como se estivéssemos construindo AG, estamos apenas desenhando preços abertos).

Para investigar a questão, coloquei um novo indicador em dois gráficos que também desenha iClose.

Deixe-me observar que, mesmo neste caso, pode haver divergências. Por exemplo, se o último tick em uma das moedas estiver MUITO atrasado, e Abrir no gráfico vier antes de Fechar na moeda do indicador.

Para investigar esta questão, acrescentei um terceiro buffer ao indicador que desenha o Open da barra anterior. Acho que todos concordam que estes dados SEMPRE serão sincronizados no relógio. É difícil imaginar que uma moeda tenha um Open[0], e a outra ainda não tenha um Open[1].

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



Se o raciocínio acima estiver correto, então, acontece que devemos ser muito cuidadosos ao usar dados de outra moeda. Seria bom que os desenvolvedores escrevessem (em um ajudante, ou em qualquer lugar) algum tipo de recomendação.

Publicarei em cerca de 12 horas o que saiu do teste.

 
Quark, você não me ouviu.
 
<br / translate="no"> Quark, você não me ouviu.


Eu não entendo, explique.