Gli indicatori standard si sovrascrivono?! - pagina 2

 
Roche(s) ha ragione. Volevo solo scriverne, ma lui mi ha battuto sul tempo (come sempre). Ma. Il mio indicatore non c'entra niente, ha un altro problema. È disegnato in modo diverso su diverse coppie di valute (e i dati sono sempre presi da USDCHF e sempre all'inizio della barra, a 00 minuti), in tempo reale. Il numero della barra è sempre 1. Quindi, c'è un bug. Sì, c'è. E fino a quando non sarà risolto, non si può testare e usare queste cose senza rischi.

In effetti, il mio indicatore può essere ulteriormente semplificato. Creiamo semplicemente in una finestra separata Open[0] per USDCHF e colleghiamo questo indicatore a EURUSD e AUDUSD. Dopo un po' di tempo (sul grafico orario - alcune ore) la divergenza inizierà ad apparire.
 
Roche(s) ha ragione. Volevo solo scriverne, ma lui mi ha battuto sul tempo (come sempre). Ma. Il mio indicatore non c'entra niente, ha un altro problema. È disegnato in modo diverso su diverse coppie di valute (e i dati sono sempre presi da USDCHF e sempre all'inizio della barra, a 00 minuti), in tempo reale. Il numero della barra è sempre 1. Quindi, c'è un bug. Sì, c'è. E finché non sarà risolto, non possiamo testare e usare queste cose senza rischi. <br / translate="no">.
In effetti, il mio indicatore può essere ulteriormente semplificato. Creiamo semplicemente in una finestra separata Open[0] per USDCHF e colleghiamo questo indicatore a EURUSD e AUDUSD. Dopo un po' di tempo (sul grafico orario - alcune ore) le divergenze inizieranno ad apparire.


Solo guardando la tua creazione :) Il tuo stile non è cambiato, scrivi chiaramente... per te stesso :)
 
La versione di Quark, rielaborata:
//+------------------------------------------------------------------+
//|                                                     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);
  }
//+------------------------------------------------------------------+


 
C'è un po' più di questo :)
Ho due coppie - GBPUSD M5 e GBPJPY M5. Poi ho capito - Quark, come utente esperto, ha nascosto l'errore più in profondità :) Ho controllato l'equazione della media mobile esponenziale - è corretta. MA... il codice presuppone che se una nuova barra si apre su GBPJPY (dove l'indicatore è in bilico), allora una nuova barra si aprirà su USDCHF (da dove viene letto Open[]).
È davvero così? Ecco perché l'errore appare gradualmente, in diversi giorni, perché le differenze hanno bisogno di tempo per accumularsi. Penso di aver spiegato tutto chiaramente?
 
Ed ecco il risultato visivo

 
La versione con tre grafici è ancora più chiara

 
Rosh, tanto di cappello. E, come promesso, mi scuso. Soprattutto agli sviluppatori.
Come dice il proverbio: "Mi sono arrabbiato, ho sbagliato, mi rimangio tutto". ;о)
Davvero biasimare i "buchi" nella storia. È interessante, a proposito, che ho solo un "buco" del tuo esempio - 25.12.2001. Ma 14.03.2005 tutte le barre sono presenti.
Sto ancora cercando di capire perché 8 ore di citazioni sono scomparse, ma questa è un'altra storia.
In ogni caso, grazie mille per l'aiuto. :о)
 
Il problema è un po' diverso qui :)<br / translate="no"> Ho due coppie - GBPUSD M5 e GBPJPY M5. Poi ho capito - Quark, come utente esperto, ha nascosto l'errore più in profondità :) Ho controllato l'equazione della media mobile esponenziale - è corretta. MA... il codice presuppone che se una nuova barra si apre su GBPJPY (dove l'indicatore è in bilico), allora una nuova barra si aprirà su USDCHF (da dove viene letto Open[]).
È davvero così? Ecco perché l'errore appare gradualmente, in diversi giorni, perché le differenze hanno bisogno di tempo per accumularsi. Penso di aver spiegato tutto chiaramente?


Il mio stile è... Non lo so. Volevo fare meglio. Cosa c'è che non va? Critiche accettate. Costruttivo :)
Ecco una nuova variante, senza MA. Disegna iOpen(USDCHF) e iClose.

Ora circa l'accumulo di errori dovuto al diverso tempo di apertura della barra. Formalmente, Open[0] è lo stesso in ogni caso (è formato alle hh:00). Ma in pratica, cosa succede se una barra sul nostro grafico è già arrivata (primo tick, cioè), e l'USDCHF (valuta indicatore) non lo è ancora? Ehm... Si potrebbe pensare che un codice costruito correttamente chieda al server, ma se questo non viene fatto, allora sì, o viene usato il valore del precedente (ora fa) Open (molto sbagliato!!!) o il valore dell'ultimo tick (anche questo non va bene). Quindi forse Roche ha ragione.

Tuttavia, non ci sarà alcun accumulo di errori con questo (non è che stiamo costruendo delle MA, stiamo solo disegnando i prezzi aperti).

Per indagare il problema, ho messo un nuovo indicatore su due grafici che disegna anche iClose.

Devo notare che anche in questo caso, le divergenze sono possibili. Per esempio, se l'ultimo tick in una delle valute è MOLTO ritardato, e Open sul grafico arriva prima di Close sulla valuta dell'indicatore.

Per studiare questo problema, ho aggiunto un terzo buffer all'indicatore che disegna l'apertura della barra precedente. Penso che tutti siano d'accordo sul fatto che questi dati saranno SEMPRE sincronizzati sull'orologio. È difficile immaginare che una valuta abbia Open[0] e l'altra non abbia ancora 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 il ragionamento di cui sopra è corretto, allora si scopre che dobbiamo stare molto attenti quando usiamo i dati di un'altra valuta. Sarebbe bene che gli sviluppatori scrivessero (in un helper, o dovunque) qualche tipo di raccomandazione.

Tra circa 12 ore posterò quello che è venuto fuori dal test.

 
Quark, non mi hai sentito.
 
<br / translate="no"> Quark, non mi hai sentito.


Non capisco, spiega.