Standart göstergeleri yeniden mi çiziyorsunuz?! - sayfa 2

 
Rosh(b) haklı. Sadece bunun hakkında yazmak istedim, ama (her zamanki gibi) benden önce geldi. Ancak. Benim göstergemin bununla hiçbir ilgisi yok, onun farklı bir sorunu var. Farklı döviz çiftlerinde farklı şekilde çizilir (ve veriler her zaman USDCHF'den alınır ve her zaman çubuğun başında, 00 dakikada), gerçek zamanlı olarak. Çubuk numarası her zaman 1'dir. Yani bir hata var. Orada. Ve iyileşene kadar bu tür şeyleri risk almadan test edip kullanamazsınız.

Aslında, göstergem daha da basitleştirilebilir. USDCHF için ayrı bir Open[0] penceresi oluşturduk ve bu göstergeyi EURUSD ve AUDUSD'ye bağladık. Bir süre sonra (saatlik grafikte - birkaç saat), farklılıklar görünmeye başlayacaktır.
 
Rosh(b) haklı. Sadece bunun hakkında yazmak istedim, ama (her zamanki gibi) benden önce geldi. Ancak. Benim göstergemin bununla bir ilgisi yok, onun farklı bir sorunu var. Farklı döviz çiftlerinde farklı şekilde çizilir (ve veriler her zaman USDCHF'den alınır ve her zaman çubuğun başında, 00 dakikada), gerçek zamanlı olarak. Çubuk numarası her zaman 1'dir. Yani bir hata var. Orada. Ve iyileşene kadar bu tür şeyleri risk almadan test edip kullanamazsınız.

Aslında, göstergem daha da basitleştirilebilir. USDCHF için ayrı bir Open[0] penceresi oluşturduk ve bu göstergeyi EURUSD ve AUDUSD'ye bağladık. Bir süre sonra (saatlik grafikte - birkaç saat), farklılıklar görünmeye başlayacaktır.


Sadece kreasyonunuzu izliyorum :) Üslubunuz değişmemiş, siz de net yazıyorsunuz... Kendiniz için :)
 
Quark'ın varyantı, yeniden düzenlendi:
//+------------------------------------------------------------------+
//|                                                     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);
  }
//+------------------------------------------------------------------+
 
Burada çip diğerine biraz gömülü :)
İki çifti kapattım - GBPUSD M5 ve GBPJPY M5, bakmaya başladım - hiçbir fark yok gibi görünüyor. Sonra aklıma geldi - Quark, deneyimli bir kullanıcı olarak hatayı daha derine sakladı :) Üstel hareketli ortalama formülünü kontrol ettim - doğru. AMA... kod, GBPJPY'de (göstergenin asılı olduğu) yeni bir çubuk açılırsa, USDCHF'de (Açık[] okumalarının alındığı yerden) yeni bir çubuk açılacağı varsayımı üzerine inşa edilmiştir.
Gerçekten mi ? Bu nedenle, tutarsızlıkların birikmesi zaman aldığından, hata birkaç gün içinde kademeli olarak ortaya çıkar. Sanırım her şey açık bir şekilde açıklanmış mı?
 
Ve işte görsel sonuç

 
Üç grafikli seçenek daha da net

 
Rosh, sana şapka çıkarıyorum. Ve söz verdiğim gibi özür dilerim. Özellikle geliştiriciler için.
Söylediği gibi: "Alevlendim, yanılmışım, sözlerimi geri alıyorum." ;hakkında)
Gerçekten de, tarihteki "deliğin" hatası. Bu arada, örneğinizden sadece bir "deliğim" olması ilginç - 12/25/2001. ve 14 Mart 2005'te tüm barlar mevcuttur.
8 saatlik alıntıların nerede kaybolduğu görülecektir, ancak bu başka bir hikaye.
Her durumda, yardımın için çok teşekkürler. :hakkında)
 
Burada çip diğerine biraz gömülü :)
İki çifti kapattım - GBPUSD M5 ve GBPJPY M5, bakmaya başladım - hiçbir fark yok gibi görünüyor. Sonra aklıma geldi - Quark, deneyimli bir kullanıcı olarak hatayı daha derine sakladı :) Üstel hareketli ortalama formülünü kontrol ettim - doğru. AMA... kod, GBPJPY'de (göstergenin asılı olduğu) yeni bir çubuk açılırsa, USDCHF'de (Açık[] okumalarının alındığı yerden) yeni bir çubuk açılacağı varsayımı üzerine inşa edilmiştir.
Gerçekten mi ? Bu nedenle, tutarsızlıkların birikmesi zaman aldığından, hata birkaç gün içinde kademeli olarak ortaya çıkar. Sanırım her şey açık bir şekilde açıklanmış mı?


Benim tarzım... Şey, bilmiyorum. En iyisini istedim. Ve yanlış olan ne? Eleştiriyi kabul ediyorum. yapıcı :)
İşte MA içermeyen yeni bir sürüm. iOpen(USDCHF) ve iClose çekiyor.

Şimdi, çubukların farklı açılma süreleri nedeniyle hatanın birikmesi hakkında. Resmi olarak, Open[0] ne olursa olsun aynıdır (ss:00'da oluşturulur). Ancak pratikte, grafiğimizdeki çubuk zaten geldiyse (ilk işaret, yani), ancak USDCHF'de (gösterge para birimi) henüz gelmediyse? Hm... İyi biçimlendirilmiş bir kodun sunucuya istekte bulunacağını düşünebilirsiniz, ancak bu yapılmazsa, evet, önceki (bir saat önce) Açık (çok yanlış !!!) veya sonuncunun değeri kene değeri (ki bu da çok iyi değildir) iyi kullanılacaktır). Belki de Roche haklıdır.

Ancak, hata birikimi olmayacak (MA oluşturmuyoruz, sadece açılış fiyatlarını çiziyoruz).

Sorunu araştırmak için iki çizelgeye de iClose çizen yeni bir gösterge astım.

Bu durumda bile tutarsızlıkların mümkün olduğunu not ediyorum. Örneğin, para birimlerinden birinin son işareti ÇOK gecikmeliyse ve grafikteki Açık, gösterge para birimindeki Kapat'tan daha önce geldiyse.

Sorunu araştırmak için, önceki çubuğun Açık'ını çizen göstergeye üçüncü bir arabellek ekledim. Sanırım herkes bu verilerin HER ZAMAN saatte senkronize edileceğini kabul edecek. Open[0]'ın bir para birimi için geldiğini, Open[1]'in henüz başka bir para birimi için gelmediğini hayal etmek zor.

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



Yukarıdaki mantık doğruysa, başka bir para biriminden veri kullanırken çok dikkatli olmamız gerektiği ortaya çıkıyor. Geliştiricilerin (yardımda veya başka bir yerde) bazı öneriler yazması iyi olurdu.

12 saat sonra testten çıkanları yazacağım.

 
Quark, beni duymadın.
 

Quark, beni duymadın.


Anlamıyorum, lütfen açıkla.
Neden: