Les indicateurs standard sont prioritaires ! - page 2

 
Roche(s) a raison. Je voulais juste écrire à ce sujet, mais il m'a devancé (comme toujours). Mais. Mon indicateur n'a rien à voir avec cela, il a un autre problème. Il est dessiné différemment sur les différentes paires de devises (et les données sont toujours prises sur l'USDCHF et toujours au début de la barre, à 00 minutes), en temps réel. Le numéro de la barre est toujours 1. Donc, il y a un bug. Si, il y en a un. Et tant qu'il n'est pas corrigé, vous ne pouvez pas tester et utiliser de telles choses sans risque.

En fait, mon indicateur peut être encore simplifié. Nous créons simplement dans une fenêtre séparée Open[0] pour USDCHF et nous connectons cet indicateur à EURUSD et AUDUSD. Après un certain temps (sur le graphique horaire - quelques heures), une divergence commencera à apparaître.
 
Roche(s) a raison. Je voulais juste écrire à ce sujet, mais il m'a devancé (comme toujours). Mais. Mon indicateur n'a rien à voir avec cela, il a un autre problème. Il est dessiné différemment sur les différentes paires de devises (et les données sont toujours prises sur l'USDCHF et toujours au début de la barre, à 00 minutes), en temps réel. Le numéro de la barre est toujours 1. Donc, il y a un bug. Si, il y en a un. Et tant qu'il n'est pas corrigé, nous ne pouvons pas tester et utiliser de telles choses sans risque. <br / translate="no">.
En fait, mon indicateur peut être encore simplifié. Nous créons simplement dans une fenêtre séparée Open[0] pour USDCHF et nous connectons cet indicateur à EURUSD et AUDUSD. Après un certain temps (sur le graphique horaire - quelques heures), des divergences commenceront à apparaître.


Je regarde votre création :) Votre style n'a pas changé, vous écrivez clairement... pour vous-même :)
 
La version de Quark, retravaillée :
//+------------------------------------------------------------------+
//|                                                     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);
  }
//+------------------------------------------------------------------+


 
Il y a un peu plus que cela :)
J'ai deux paires - GBPUSD M5 et GBPJPY M5. Puis j'ai réalisé - Quark, en tant qu'utilisateur expérimenté, a caché l'erreur plus profondément :) J'ai vérifié l'équation de la moyenne mobile exponentielle - elle est correcte. MAIS... le code suppose que si une nouvelle barre s'ouvre sur GBPJPY (où l'indicateur se trouve), alors une nouvelle barre s'ouvrira sur USDCHF (où Open[] est lu).
Est-ce vraiment le cas ? C'est pourquoi l'erreur apparaît progressivement, en plusieurs jours, car les différences ont besoin de temps pour s'accumuler. Je pense avoir tout expliqué clairement ?
 
Et voici le résultat visuel

 
La version avec trois graphiques est encore plus claire

 
Rosh, je vous tire mon chapeau. Et, comme promis, je m'excuse. Surtout pour les développeurs.
Comme le dit le dicton : "Je me suis mis en colère, j'ai eu tort, je retire tout ce que j'ai dit". ;о)
Je blâme vraiment les "trous" dans l'histoire. Il est intéressant, d'ailleurs, que je n'ai qu'un seul "trou" dans votre exemple - 25.12.2001. Mais le 14.03.2005, toutes les barres sont présentes.
Je me demande encore pourquoi 8 heures de citations ont disparu, mais c'est une autre histoire.
En tout cas, merci beaucoup pour votre aide. :о)
 
Le problème est un peu différent ici :)<br / translate="no">J'ai deux paires - GBPUSD M5 et GBPJPY M5. Puis j'ai réalisé - Quark, en tant qu'utilisateur expérimenté, a caché l'erreur plus profondément :) J'ai vérifié l'équation de la moyenne mobile exponentielle - elle est correcte. MAIS... le code suppose que si une nouvelle barre s'ouvre sur GBPJPY (où l'indicateur se trouve), alors une nouvelle barre s'ouvrira sur USDCHF (où Open[] est lu).
Est-ce vraiment le cas ? C'est pourquoi l'erreur apparaît progressivement, en plusieurs jours, car les différences ont besoin de temps pour s'accumuler. Je pense avoir tout expliqué clairement ?


Mon style est... Je ne sais pas. Je voulais faire mieux. Qu'est-ce qu'il y a de mal à ça ? Critique acceptée. Constructif :)
Voici une nouvelle variante, sans MA du tout. Il dessine iOpen(USDCHF) et iClose.

Maintenant, en ce qui concerne l'accumulation d'erreurs due aux différents temps d'ouverture des barres. Formellement, Open[0] est le même quoi qu'il arrive (il est formé à hh:00). Mais en pratique, que se passe-t-il si une barre sur notre graphique est déjà arrivée (premier tick, c'est-à-dire), et que l'USDCHF (devise de l'indicateur) ne l'est pas encore ? Hum... On pourrait penser qu'un code correctement construit demanderait au serveur, mais si cela n'est pas fait, alors oui, soit la valeur de l'Open précédent (il y a une heure) (très mauvais !!!) ou la valeur du dernier tick sera utilisée (ce qui n'est pas bon non plus). Alors peut-être que Roche a raison.

Cependant, il n'y aura pas d'accumulation d'erreurs avec ceci (ce n'est pas comme si nous construisions des MAs, nous dessinons juste des prix ouverts).

Pour étudier le problème, j'ai placé un nouvel indicateur sur deux graphiques qui dessine également iClose.

Permettez-moi de noter que même dans ce cas, il peut y avoir des divergences. Par exemple, si le dernier tick dans l'une des devises est TRÈS retardé, et que l'Open sur le graphique arrive avant le Close sur la devise de l'indicateur.

Pour étudier ce problème, j'ai ajouté un troisième tampon à l'indicateur dessinant l'Open de la barre précédente. Je pense que tout le monde est d'accord pour dire que ces données seront TOUJOURS synchronisées sur la montre. Il est difficile d'imaginer qu'une monnaie a un Open[0], et que l'autre n'a pas encore d'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);
}



Si le raisonnement ci-dessus est correct, il s'avère que nous devons être très prudents lorsque nous utilisons des données provenant d'une autre devise. Il serait bon que les développeurs écrivent (dans une aide, ou ailleurs) une sorte de recommandation.

Je posterai dans environ 12 heures ce qui est ressorti du test.

 
Quark, vous ne m'avez pas entendu.
 
<br / translate="no">Quark, vous ne m'avez pas entendu.


Je ne comprends pas, explique.