Standart göstergeleri yeniden mi çiziyorsunuz?!

 
Tünaydın!
Lütfen aşağıdaki konu hakkında tavsiyede bulunun.
İşte uzman kodu.
int tanıtıcı;
string filename="test_expert_log.csv";

int init()
  {
   tutamaç= FileOpen(dosyaadı,FILE_CSV|FILE_WRITE,';');
  if(işlem<1)
   {
    Print("Dosya bulunamadı, son hata", GetLastError());
    dönüş(yanlış);
   }
   dönüş(0);
  }
int başlangıç()
  {
çift test1, test2, test3;
int i;

  (i=1;i<10;i++) için
      {
       test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,0,i);

       if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Yazma hatası!");
      }

   dönüş(0);
  }


EA, oluşturulmuş çubuklar üzerinde hızlı bir simülasyon ile EURUSD çifti üzerinde başlatılır. Başka bir döviz çiftinden gelen stokastik okumaları okur ve sonunda şöyle bir rapor oluşturur:

2006.10.22 22:00;1;76.79738562
2006.10.20 20:00;2;78.13504823
2006.10.20 16:00;3;78.65853659
2006.10.20 12:00;4;80.50139276
2006.10.20 08:00;5;80.25974026
2006.10.20 04:00;6;86.36363636
2006.10.20 00:00;7;86.96969697
2006.10.19 20:00;8;80
2006.10.19 16:00;9;53.76884422
2006.10.23 00:00;1;65.15151515
2006.10.22 22:00;2;74.83660131
2006.10.20 20:00;3;76.79738562 a, 78.13504823 idi (yukarıya bakın)
2006.10.20 16:00;4;78.13504823 a 78.65853659 idi (yukarıya bakın), vb.
2006.10.20 12:00;5;78.65853659
2006.10.20 08:00;6;80.50139276
2006.10.20 04:00;7;80.25974026
2006.10.20 00:00;8;86.36363636
2006.10.19 20:00;9;86.96969697
2006.10.23 04:00;1;52.85714286
2006.10.23 00:00;2;65.15151515
2006.10.22 22:00;3;74.83660131
2006.10.20 20:00;4;76.79738562
2006.10.20 16:00;5;78.13504823
2006.10.20 12:00;6;78.65853659
2006.10.20 08:00;7;80.50139276
2006.10.20 04:00;8;80.25974026
2006.10.20 00:00;9;86.36363636
2006.10.23 08:00;1;21.83406114
2006.10.23 04:00;2;52.85714286
2006.10.23 00:00;3;65.15151515
2006.10.22 22:00;4;74.83660131
2006.10.20 20:00;5;76.79738562
2006.10.20 16:00;6;78.13504823
2006.10.20 12:00;7;78.65853659
2006.10.20 08:00;8;80.50139276
2006.10.20 04:00;9;80.25974026

Yeni bir çalıştırmada aynı çubukta gösterge değerlerinin farklı olduğunu görmek kolaydır.
Bu danışmanın pratik kullanımının şüpheli olduğunu anlıyorum :o) ama amaç sorunu göstermekti. Çünkü Pratikte şuna benziyor: terminalde gösterge doğru gösteriyor, ancak Uzman Danışmandan çağrıldığında diğer verileri yanlış gösteriyor. Etkisi olmayan her şeyi kestikten sonra sonuç bu. Muhtemelen zaten çok aptalım, ama hatamın nerede olduğunu anlayamıyorum.
Bu arada, döviz çiftini mevcut olanla değiştirirseniz, her şey yolunda demektir.
Yardım için şimdiden teşekkürler.

 
Biraz değiştirilmiş deinit()
//+------------------------------------------------------------------+
//|                                         TestSymbolStochastic.mq4 |
//|                                                           satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

int handle;
string filename="test_expert_log.csv";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';');
  if(handle<1)
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double test1,test2,test3;
int i;

  for (i=1;i<10;i++)
      {
       test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,0,i);

       if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Ошибка записи!");
      }

//----
   return(0);
  }
//+------------------------------------------------------------------+



Her şey benim için çalışıyor (tüm dosyayı kontrol etmemiş olmama rağmen)

 
Şeytan... :o)
Sorun tabii ki dosyayı kapatmakta değil çünkü dediğim gibi başlangıçta terminalde ve Expert Advisor'dan çağrıldığımda farklı gösterge değerleri ile karşılaştım. Ve ancak o zaman bu "olguyu" incelemek için dosyanın çıktısını aldı.
Aslında, her şey diğer bilgisayarımda da çalıştı. Ancak şimdilik...
Bir döviz çifti daha eklemek benim için yeterli oldu...
 test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       test2=iStochastic("EURGBP",Period(),5,3,3,0,0,0,i);


durum nasıl oldu
2006.10.22 22:00;1;74.83660131;19.04761905
2006.10.20 20:00;2;76.79738562;13.91304348
2006.10.20 16:00;3;78.13504823;25.26315789
2006.10.20 12:00;4;78.65853659;48.7804878
2006.10.20 08:00;5;80.50139276;81.57894737
2006.10.20 04:00;6;80.25974026;79.74683544
2006.10.20 00:00;7;86.36363636;74.66666667
2006.10.19 20:00;8;86.96969697;76.54320988
2006.10.19 16:00;9;80;79.22077922
2006.10.23 00:00;1;65.15151515;29.78723404
2006.10.22 22:00;2;74.83660131;19.67213115
2006.10.20 20:00;3;76.79738562;19.04761905
2006.10.20 16:00;4;78.13504823;13.91304348
2006.10.20 12:00;5;78.65853659;25.26315789
2006.10.20 08:00;6;80.50139276;48.7804878
2006.10.20 04:00;7;80.25974026;81.57894737
Bu koşullar altında ilk çiftin (!) iyi çalıştığı görülebilir, ancak ikincisi ...
Benim için başka bir şey garip - sorun sistematik değil. Görünüşte benzer koşullarda aynı kod farklı sonuçlar verir. Her yerde terminal 198. İki farklı broker üzerinde test edildi. Bunlardan biri MIG'dir.
Belki sevgili baylar, geliştiriciler size bu belayla nasıl başa çıkacağınızı söylerler?

 
Anlaşıldığı üzere, sorun stokastikte değil, göstergelerde de değil. Gerçek şu ki, bir nedenden dolayı MT4 mevcut çubuğu değil, öncekini "kayıyor".
Böyle bir seçim yaparsak,
 stringtime1,time2,time3;

  (i=1;i<10;i++) için
      {
      time1=TimeToStr(iTime("GBPUSD",Period(),i));
      time2=TimeToStr(iTime("EURGBP",Period(),i));
      time3=TimeToStr(iTime("EURUSD",Period(),i));
       if (FileWrite (handle,TimeToStr(Time[i]),i,time1,time2,time3)<=0) Print("Yazma hatası!");
      }


sonra aşağıdakileri alıyorum:

2006.10.22 22:00;1;2006.10.22 22:00;2006.10.20 20:00;2006.10.22 22:00
2006.10.20 20:00;2;2006.10.20 20:00;2006.10.20 16:00;2006.10.20 20:00
2006.10.20 16:00;3;2006.10.20 16:00;2006.10.20 12:00;2006.10.20 16:00
2006.10.20 12:00;4;2006.10.20 12:00;2006.10.20 08:00;2006.10.20 12:00
2006.10.20 08:00;5;2006.10.20 08:00;2006.10.20 04:00;2006.10.20 08:00
2006.10.20 04:00;6;2006.10.20 04:00;2006.10.20 00:00;2006.10.20 04:00
2006.10.20 00:00;7;2006.10.20 00:00;2006.10.19 20:00;2006.10.20 00:00
2006.10.19 20:00;8;2006.10.19 20:00;2006.10.19 16:00;2006.10.19 20:00
2006.10.19 16:00;9;2006.10.19 16:00;2006.10.19 12:00;2006.10.19 16:00
2006.10.23 00:00;1;2006.10.23 00:00;2006.10.23 00:00;2006.10.23 00:00
2006.10.22 22:00;2;2006.10.22 22:00;2006.10.22 22:00;2006.10.22 22:00
2006.10.20 20:00;3;2006.10.20 20:00;2006.10.20 20:00;2006.10.20 20:00
devamı normaldir.
Bazen arıza bir para biriminde, bazen iki para biriminde meydana gelir. Sistemi bulamadık. Makinenin gücüne (oldukça hızlı bir şekilde başlatılmasına rağmen) veya başka bir şeye bağlı olup olmadığı ...
Ama gerçek şu ki, test imkansız. İlk aramalarda MT yanlış veri veriyor.
Soru kalır: bu bir hata mı yoksa bir özellik mi? :o) Bu bir özellik ise, bununla nasıl başa çıkılacağı. Belki birisi benzer karşılaştı?

 
derine inmeden, geçmişle ilgili (veya belki de fiyat modellemenin özellikleriyle ilgili) bir şeyiniz olduğunu, gösterdiğiniz zamana ve endekslere dikkat edin.
ilk baskıdan, indeks 1'li çubuğun indeks 3 olduğunu, çubuk 2'nin indeks 4 olduğunu, ayrıca görünüşe göre H4'te bir Expert Advisor'ı başlattığını ve saat 22:00 size hiçbir şey söylemiyor.
muhtemelen test cihazında modelleme ile ilgili makaleyi tekrar okurdum, büyük olasılıkla "ve" işaretini gösterecek
iyi şanslar, sonuçları burada bildirmeyi unutmayın ;)

PS alternatif olarak, başka bir simülasyon seçeneğini deneyebilir ve sonuçları görebilirsiniz ve zaten bazı sonuçlar çıkarılabilir.
 
Aslında, her şey o kadar basit değil. Her şey tarihle uyumludur, yani. Bu çubuklar mevcut ve onlarla her şey yolunda görünüyor. Yine yukarıda yazdığım gibi, test farklı geçmişlere sahip iki farklı brokerin (FIBO, MIG) iki farklı terminalinde yapıldı.
Ayrıca, böyle bir resim diğer TF'lerde de (1Н, 30М, 15М, vb.) görülmektedir ve farklı fiyat modelleme seçenekleri (üçü de) hala belirtilen hatalara yol açmaktadır.
Ve saat 22: 00'deki dört saatlik barda doğaüstü hiçbir şey yoktur - her zamanki "Pazar" barı. Aslında 22:00'de açılıyor. Örneğin Alpari gibi tüm brokerler tarihi kesmez. ;hakkında)
Ancak sorun daha da yerelleşti. Bu tür bir Expert Advisor'ın tüm brokerler için hata üretmediği ortaya çıktı. Yani, "Pazar" verisi olanlar. Spesifik olarak, Alpari iyi çalışıyor, FIBO ve MIG'de hatalar var. Üstelik sadece "Pazar" çubuklarına baktığımızda hatalar oluşuyor.
Bunun bir "özellik" olduğunu düşünmüyorum. Daha çok bir böcek gibi. Sadece hatalar aynı çiftlerde görünmüyorsa. Bir anda bir çiftte, başka bir anda - başka bir anda ve üçüncü anda - aynı anda ikide olabilirler.
Geliştiricilerin dikkatini bu soruna çekmek ve onlardan bir cevap almak için hala umudumu yitirmiyorum: bu ne tür bir talihsizlik ve bununla nasıl başa çıkılacağı; o) (sadece "Alpari ile çalış" demeyin: Ö))

Not Her durumda, katılımınız için Profi_R'ye teşekkürler, ancak gördüğünüz gibi basit çözümler yardımcı olmuyor, görünüşe göre derinlemesine araştırmanız gerekecek. :hakkında)
 
Şu anda tam olarak aynı şeyi anlamaya çalışıyorum. Gösterge:

#property copyright "Copyright Quark"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color2 Red
#property indicator_minimum -1
#property indicator_maximum 1

// indicator parameters
extern int nPeriod = 9;
extern int nPeriod_1 = 6;

// indicator buffers
double dUsdChf, dUsdChfPrev;

double arrGroupBuffer[];
double arrGroupMaBuffer[];

int nExtCountedBars = 0;

////////////////////////
int init()
{
	string strIndicatorShortName = "Group(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_NONE);
	SetIndexShift(0, 0);
		
	SetIndexStyle(1, DRAW_LINE);
	SetIndexShift(1, 0);

	IndicatorDigits(4);
		
	// indicator buffers mapping
	SetIndexBuffer(0, arrGroupBuffer);
	SetIndexBuffer(1, arrGroupMaBuffer);

	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	// last counted bar will be recounted
//	if(nExtCountedBars > 0) 
//		nExtCountedBars--;
		
	int nPos = Bars - nExtCountedBars - 1;

	double dPr = 2.0 / (nPeriod + 1);
	
	while(nPos > 0)
	{
		if(!IsTesting())
		{
			dUsdChf = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos - 1);
			dUsdChfPrev = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos);
		}

		arrGroupBuffer[nPos - 1] = 0;
			
		if(dUsdChfPrev - dUsdChf > 0)
			arrGroupBuffer[nPos - 1] += 1;
		else if(dUsdChfPrev - dUsdChf < 0)
			arrGroupBuffer[nPos - 1] -= 1;

		if(nPeriod_1 == 1)
			arrGroupMaBuffer[nPos - 1] = arrGroupBuffer[nPos - 1];
		else 
		{
			dPr = 2.0 / (nPeriod_1 + 1);

			arrGroupMaBuffer[nPos - 1] = arrGroupBuffer[nPos - 1] * dPr + 
				arrGroupMaBuffer[nPos] * (1 - dPr);
		}
		
		nPos--;
	}

	return(0);
}



Geriye dönük test edilemediği için pratikte çok az faydası vardır (ikinci para birimi, iki tarihin çubukları senkronize değilse fantastik karlar yaratır, bunun hakkında zaten yazmıştım). Ama bu değil.

Koddan da görebileceğiniz gibi, gösterge, grafiğe eklendiği para birimine bağlı değildir. Her zaman USDCHF'de çalışır. Göstergeyi benim durumumda AUDUSD ve EURUSD olmak üzere iki grafiğe ekliyoruz, ancak bence herhangi birini kullanabilirsiniz. Birkaç günlüğüne ayrılıyoruz. Ve grafiklerin FARKLI olduğunu görüyoruz. aynı gösterge. Gerçek zamanlı. aynı MT. Zorla yeniden çiziyoruz (çıkarıyoruz - takıyoruz) - aynı oluyorlar. Belli bir süre için.

Şimdi bu davanın izini sürüyorum, bir şey bulursam sana haber veririm. Belki sadece benim :)

 
İyi. "Benim" göstergesi küçümsenebileceğinden, mantıkta bir sorun olduğunu söylüyorlar, "yardımcı para birimini" test etmek için basitleştirilmiş bir gösterge yazdım.

Kod (aşağıya bakın) USDCHF, H1'den (göstergenin hangi pencereye bağlı olduğuna bakılmaksızın) verileri alır ve bir grafik çizer a) Açık, MA(Açık, 6) ve MA(Açık, 6, manüel olarak hesaplanan, standart gösterge).

Gösterge EURUSD H1 ve AUDUSD H1'e eklendi. 12 saatlik çalışmanın ardından grafiklerde farklılıklar görülüyor (verilerin USDCHF'den alındığını ve herhangi bir farklılık olmaması gerektiğini hatırlatırım). Üstelik, farklılıklar MA'da değil, Açık satırlardadır (elbette MA'da da, ancak bu, Açık nedeniyle ikincildir).

Bu nedenle, başka bir para biriminden veri kullanımıyla ilgili bir hata var. SW. geliştiriciler?

#property copyright "Copyright Quark"
#property link      ""

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

////////////////////////
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, arrMa);
	SetIndexBuffer(2, arrMyMa);
		
	return(0);
}
///////////////////////////
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);
	
	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--;
	}

	return(0);
}
 
Ormana ne kadar uzak olursa, partizanlar o kadar kalın olur.
İlk olarak, daha fazla geçmiş, daha fazla hata.
İkincisi, işte kod (beceriksiz kod için hemen özür dilerim):
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int       BarsCount=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";
string Para;
int TF;
int handle,handle2;
int init()
  {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexLabel(0,Currency1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexLabel(1,Currency2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

   string Para=Symbol();
   int TF=Period();
   handle= FileOpen("testfile.csv",FILE_CSV|FILE_WRITE,';');
   handle2= FileOpen("testfile2.csv",FILE_CSV|FILE_WRITE,';');
  if(handle<1 || handle2<1 )
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   return(0);
  }
int deinit()
  {
   FileClose(handle);
   return(0);
  }
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       ExtMapBuffer1[i]=iTime(Currency1,Period(),i);
       Sleep(1000);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),i);
       ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
       tt1=Time[i]-ExtMapBuffer1[i];
       tt2=Time[i]-ExtMapBuffer2[i];
       if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) 
        {
      if (FileWrite (handle,
      i,TimeToStr(Time[i]),TimeToStr(ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer2[i])
       )<=0) Print("нифига не пишет!!");
        }
        FileFlush(handle);
      if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }
   return(0);
  }


EURUSD ve GBPUSD döviz çiftlerinde EURGBP'de 4H için piyasaya sürülmesi 2000'den fazla hata veriyor
15M'de - 26500'den fazla.
Ayrıca, 15M için vardiya bir çubuk değil, çok, çok daha fazladır (100'den (!) çubuktan fazla)
işte günlüğün bir parçası:
06/15/2006 1:45 06/16/2006 0:45 06/16/2006 0:00
06/15/2006 1:30 06/16/2006 0:30 06/15/2006 23:45
06/15/2006 1:15 06/16/2006 0:15 06/15/2006 23:30
06/15/2006 1:00 06/16/2006 0:00 06/15/2006 23:15
06/15/2006 0:45 06/15/2006 23:45 06/15/2006 23:00
06/15/2006 0:30 06/15/2006 23:30 06/15/2006 22:45
06/15/2006 0:15 06/15/2006 23:15 06/15/2006 22:30
06/15/2006 0:00 06/15/2006 23:00 06/15/2006 22:15
14.06.2006 23:45 06/15/2006 22:45 06/15/2006 22:00
14.06.2006 23:30 06/15/2006 22:30 06/15/2006 21:45
14.06.2006 23:15 06/15/2006 22:15 06/15/2006 21:30
14.06.2006 23:00 06/15/2006 22:00 06/15/2006 21:15
14.06.2006 22:45 06/15/2006 21:45 06/15/2006 21:00
14.06.2006 22:30 06/15/2006 21:30 06/15/2006 20:45
Bu günlük, Alpari sunucusundan yeni indirilmiş bir terminalde ve yeni geçmişte alınmıştır (üç döviz çiftinin tümü için 10/3/2005'e kadar 15M'de).
Tüm bu çalışmaların anlamı, geliştiricilerden bu fenomenin anlaşılır bir açıklamasını almaktır.
Ayrıca, bir haftadır sevgili beyler, sizden haber alamamış olmamızdan dolayı utanıyorum.
Artık sana sorunun ciddiyetini nasıl kanıtlayacağımı bilmiyorum, böylece dikkatini ona çevirebilirsin.
Durumun ve kodun şeffaf basitliği, banal bir hata hakkında düşünmeme izin vermiyor. Bu nedenle, GELİŞTİRİCİLER İÇİN BİR KEZ DAHA BAŞVURU YAPIYORUM:
Bayanlar ve Baylar! Sizden bu konuya dikkat etmenizi ve EN AZ HERHANGİ BİR yorum yapmanızı rica ediyorum. Bu benim hatamsa, işe almayın - en azından nerede arayacağımı söyleyin. Ve bu durumda onun adına özür dilerim. MT4'te bu bir hataysa, bu değerli kaynağı keşfetmek ve dikkatinizi çekmek için harcayan insanların (sadece kendimi kastetmiyorum) zamanına saygı duymaya değer olduğunu düşünüyorum. görev.
Yapıcı bir diyalog için saygı ve umutla... :o)

 
bak kafa karıştırdın :)
Neredeyse yirmi yıl önce, bir pansiyonda otururken ve bir daire içinde bir kaşıkla çayı karıştırırken, hunideki görüntünün bozulduğunu keşfettim. Basit bir açıklamayı hemen unuttum, ancak bu onayda bir daire içinde hareket eden su kütlelerinin yerçekimi kuvvetinde yerel bir değişikliğe neden olduğunu (ve bu, Bermuda Şeytan Üçgeni'ndeki gemilerin kaybolmasını açıklar) ve buna bağlı olarak dalgaların kırılmasını gördüm ( ışık). Bu tutulma, dönen sudan elde edilen sıradan bir lens olduğunu anlamadan önce birkaç dakika sürdü :)

Kodunuzu biraz değiştirdim:
//+------------------------------------------------------------------+
//|                                             RedrawIndicators.mq4 |
//|                                                           Satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int       BarsCount=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";

int handle,handle2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexLabel(0,Currency1);

   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexLabel(1,Currency2);

   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

   handle= FileOpen("TestFile.csv",FILE_CSV|FILE_WRITE,';');
   handle2= FileOpen("TestFile2.csv",FILE_CSV|FILE_WRITE,';');
  if(handle<1 || handle2<1 )
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   else
   {
   FileWrite (handle,"index",Symbol(),Currency1,Currency2);
   FileWrite (handle2,"index",Symbol(),"  ",Currency1,"  ",Currency2);
   }

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2,TimeMain;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       TimeMain=Time[i];
       ExtMapBuffer1[i]=iTime(Currency1,Period(),iBarShift(Currency1,Period(),TimeMain));
       //Sleep(1000);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),iBarShift(Currency2,Period(),TimeMain));
       ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
       tt1=Time[i]-ExtMapBuffer1[i];
       tt2=Time[i]-ExtMapBuffer2[i];
       if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) 
         {
         if (FileWrite (handle,
         i,TimeToStr(Time[i]),TimeToStr(ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer2[i])
          )<=0) Print("нифига не пишет!!");
         }
        FileFlush(handle);
        if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,i,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Kodunuz, farklı enstrümanlarda aynı endekse sahip çubukların her zaman aynı zaman aralığını yansıtmadığı gerçeğini ortaya çıkardı.
Yani, soru aslında şuna benziyor - neden aynı değiller, tarihte neden delikler var? Bu göstergeyi GBPJPY H4'te çalıştırdım ve ortaya çıkan iki dosyayı açtım.
İki yerde zamanın kesildiği ve ikinci dosyanın bir grup "hata" gösterdiği hemen açıktır.




PS Alıntıları Alpari.
Neden: