Standard-Blinker außer Kraft setzen?! - Seite 2

 
Roche(s) hat Recht. Ich wollte gerade darüber schreiben, aber er kam mir (wie immer) zuvor. Aber. Mein Indikator hat damit nichts zu tun, er hat ein anderes Problem. Sie wird für verschiedene Währungspaare unterschiedlich gezeichnet (und die Daten werden immer vom USDCHF und immer zu Beginn des Balkens, um 00 Minuten, genommen), in Echtzeit. Die Taktnummer ist immer 1. Es gibt also einen Fehler. Ja, die gibt es. Solange das Problem nicht behoben ist, können Sie solche Dinge nicht ohne Risiko testen und verwenden.

Mein Indikator kann sogar noch weiter vereinfacht werden. Wir erstellen einfach in einem separaten Fenster Open[0] für USDCHF und verbinden diesen Indikator mit EURUSD und AUDUSD. Nach einiger Zeit (auf dem Stundenchart - einige Stunden) wird eine Divergenz auftreten.
 
Roche(s) hat Recht. Ich wollte gerade darüber schreiben, aber er kam mir (wie immer) zuvor. Aber. Mein Indikator hat damit nichts zu tun, er hat ein anderes Problem. Sie wird für verschiedene Währungspaare unterschiedlich gezeichnet (und die Daten werden immer vom USDCHF und immer zu Beginn des Balkens, um 00 Minuten, genommen), in Echtzeit. Die Taktnummer ist immer 1. Es gibt also einen Fehler. Ja, die gibt es. Und solange das nicht behoben ist, können wir solche Dinge nicht ohne Risiko testen und verwenden. <br / translate="no">.
Mein Indikator kann sogar noch weiter vereinfacht werden. Wir erstellen einfach in einem separaten Fenster Open[0] für USDCHF und verbinden diesen Indikator mit EURUSD und AUDUSD. Nach einiger Zeit (auf dem Stundenchart - einige Stunden) wird eine Divergenz auftreten.


Ich sehe mir gerade deine Kreation an :) Ihr Stil hat sich nicht verändert, Sie schreiben klar und deutlich... für sich selbst :)
 
Die überarbeitete Version von Quark:
//+------------------------------------------------------------------+
//|                                                     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);
  }
//+------------------------------------------------------------------+


 
Es ist ein bisschen mehr als das :)
Ich habe zwei Paare - GBPUSD M5 und GBPJPY M5. Dann wurde mir klar - Quark hat als erfahrener Anwender den Fehler tiefer versteckt :) Ich habe die Gleichung des exponentiellen gleitenden Durchschnitts überprüft - sie ist korrekt. ABER... Der Code geht davon aus, dass, wenn ein neuer Balken auf GBPJPY geöffnet wird (wo der Indikator schwebt), dann wird ein neuer Balken auf USDCHF geöffnet (wo Open[] gelesen wird).
Ist das wirklich so? Deshalb tritt der Fehler erst nach und nach auf, und zwar über mehrere Tage hinweg, weil die Unterschiede Zeit brauchen, um sich zu akkumulieren. Ich denke, ich habe alles klar erklärt?
 
Und hier ist das visuelle Ergebnis

 
Die Version mit drei Diagrammen ist noch übersichtlicher

 
Rosh, ich ziehe den Hut vor Ihnen. Und, wie versprochen, entschuldige ich mich. Vor allem für die Entwickler.
Wie man so schön sagt: "Ich war wütend, ich hatte Unrecht, ich nehme alles zurück". ;о)
Geben Sie wirklich den "Löchern" in der Geschichte die Schuld. Interessant ist übrigens, dass ich in Ihrem Beispiel nur ein "Loch" habe - 25.12.2001. Aber am 14.03.2005 sind alle Balken vorhanden.
Ich bin immer noch am Rätseln, wo 8 Stunden Zitate verschwunden sind, aber das ist eine andere Geschichte.
Auf jeden Fall vielen Dank für die Hilfe. :о)
 
Das Problem ist hier ein wenig anders :)<br / translate="no"> Ich habe zwei Paare - GBPUSD M5 und GBPJPY M5. Dann wurde mir klar - Quark hat als erfahrener Anwender den Fehler tiefer versteckt :) Ich habe die Gleichung des exponentiellen gleitenden Durchschnitts überprüft - sie ist korrekt. ABER... Der Code geht davon aus, dass, wenn ein neuer Balken auf GBPJPY geöffnet wird (wo der Indikator schwebt), dann wird ein neuer Balken auf USDCHF geöffnet (wo Open[] gelesen wird).
Ist das wirklich so? Deshalb tritt der Fehler erst nach und nach auf, und zwar über mehrere Tage hinweg, weil die Unterschiede Zeit brauchen, um sich zu akkumulieren. Ich denke, ich habe alles klar erklärt?


Mein Stil ist... Ich weiß es nicht. Ich wollte es besser machen. Was ist daran falsch? Kritik angenommen. Konstruktiv :)
Hier ist eine neue Variante, ganz ohne MA. Es zeichnet iOpen(USDCHF) und iClose.

Nun zur Fehlerakkumulation aufgrund der unterschiedlichen Öffnungszeit der Balken. Formal ist Open[0] immer gleich (es wird um hh:00 gebildet). Aber was passiert in der Praxis, wenn ein Balken auf unserem Chart bereits angekommen ist (d.h. der erste Tick), der USDCHF (Indikatorwährung) aber noch nicht? Ähm ... Man sollte meinen, dass ein richtig konstruierter Code den Server fragen würde, aber wenn das nicht geschieht, dann wird entweder der Wert des vorherigen (vor einer Stunde) Open (sehr falsch!!!) oder der letzte Tick-Wert verwendet (was auch nicht gut ist). Vielleicht hat Roche also recht.

Dabei kommt es jedoch nicht zu einer Fehlerakkumulation (es ist ja nicht so, dass wir MAs bilden, wir zeichnen nur die offenen Preise).

Um das Problem zu untersuchen, habe ich einen neuen Indikator auf zwei Charts gesetzt, der auch iClose zeichnet.

Ich möchte darauf hinweisen, dass es auch in diesem Fall zu Abweichungen kommen kann. Zum Beispiel, wenn der letzte Tick in einer der Währungen SEHR verzögert ist und Open im Chart früher kam als Close in der Indikatorwährung.

Um dieses Problem zu untersuchen, habe ich dem Indikator einen dritten Puffer hinzugefügt, der das Open des vorherigen Balkens anzeigt. Ich denke, jeder wird zustimmen, dass diese Daten IMMER mit der Uhr synchronisiert werden. Es ist schwer vorstellbar, dass eine Währung Open[0] hat und die andere noch nicht 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);
}



Wenn die obige Argumentation richtig ist, dann zeigt sich, dass wir sehr vorsichtig sein sollten, wenn wir Daten aus einer anderen Währung verwenden. Es wäre gut, wenn die Entwickler (in einem Hilfsmittel oder wo auch immer) eine Art Empfehlung schreiben würden.

Ich werde in etwa 12 Stunden posten, was bei dem Test herausgekommen ist.

 
Quark, Sie haben mich nicht verstanden.
 
<br / translate="no"> Quark, Sie haben mich nicht verstanden.


Ich verstehe das nicht, erklären Sie es mir.