標準のインジケーターが上書きされるのか!?

 
こんにちは。
以下の問題についてアドバイスをお願いします。
Expert Advisorのコードはこちらです。
int handle; string filename="test_expert_log.csv"; int init() { handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';'); if(handle<1) { Print("File not found, last error ", GetLastError()); return(false); } return(0); } int start() { double test1,test2,test3.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
int i; for (i=1;i<10;i++) { test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,i); //test2=iStochastic(""ポンド")EURUSD",Period(),5,3,3,0,0,i); if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Write Error!"); } return(0); }.


Expert AdvisorはEURUSDで 動作し、形成されたバー上で簡単なシミュレーションを行います。別の通貨ペアのストキャスティクスの数値を読み取り、最終的にこのような形のレポートを生成します。

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 と 78.13504823 (以上)
2006.10.20 16:00;4;78.13504823 と 78.65853659 (上記参照); etc.
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

は、新規実行時に同じバーでインジケータの値が異なることを簡単に確認することができます。
このEAの実用性は疑問ですが:o)、問題を示すことが目的でした。ターミナルでは正しく表示されるが、Expert Advisorから呼び出すと間違ったデータが表示される、というものです。指標に影響を与えないものをすべて切り捨てた結果、次のような結果が得られました。私はひどく頭が悪いのでしょうが、自分のエラーを見つけることができません。
ちなみに、通貨ペアを現在のものに変更すれば、すべてOKです。
よろしくお願いします。

 
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);
  }
//+------------------------------------------------------------------+



私の場合はうまくいきました(ただし、ファイル全体をチェックしたわけではありません)。

 
シャイターン...:о)
もちろん、問題はファイルを閉じる ことではなく、先に述べたように、ターミナルとExpert Advisorから呼び出されたときのインジケータの異なる値に直面したことがあるからです。そして、この「現象」を研究するために、出力したものをファイルに描画しました。
実は、もう一台のパソコンでもすべてうまくいったのです。しかし、その間はうまくいかなかった。
もう一つ通貨ペアを追加すれば十分だと思ったのですが・・・。
   test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,i); test2=iStochastic("EURGBP",Period(),5,3,3,0,0,i) としました。


二転三転
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
与えられた条件(!)で最初のペアは正常に動作することがわかりますが、2番目のペアは...。
不思議なのは、この問題がシステム化されていないことです。一見同じように見える条件でも、同じコードで異なる結果が得られる。端末はどこでも1982つのブローカーでテストしました。そのひとつがMIGです。
もしかしたら、尊敬する開発者のみなさんが、この厄介なものと戦う方法を教えてくれるかもしれませんね。

 
この問題はストキャスティクスやインジケータにあるのではありません。問題は、MT4が何らかの理由で、現在のバーではなく、前のバーに「適合」することです。
次のようなサンプリングを行うと
string time1,time2,time3; for (i=1;i<10;i++) { 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("書き込みエラー!"); }


次のように表示されます。

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
ここからは通常通りです。
クラッシュは1つの通貨で起こることもあれば、2つの通貨で起こることもあります。システムを把握できていない。コンピュータのパワーに依存するのか(私はかなり高速なもので動かしたが)、それとも何か他のものに依存するのか。
しかし、実際のところ、テストは不可能です。MTは最初のアクセスで、誤ったデータを与えてしまう。
問題は、それがバグなのか機能なのか、ということです。:о)バグだとしたら、どう戦えばいいのでしょうか?もしかしたら、そのような問題に直面した人がいるかもしれない。

 
あまり深く考えずに、履歴に何か問題があると仮定して(あるいは価格モデリングと関係があるかもしれません)、表示されている時間やインデックスに注意を払いましょう
最初の印刷では、インデックス1のバーがインデックス3に、インデックス2がインデックス4になっていることが示されています。
テスターでのシミュレーションについての記事をもう一度読んでみたいです。
がんばってください!結果はここで報告するのを忘れないでください;)

P.S. あるいは、別のバージョンのシミュレーションを試してみて、その結果を見ると、すでにいくつかの結論が得られるかもしれません。
 
そんな単純な話じゃないんです。履歴はOK、つまり指定したバーが存在し、問題ないようです。繰り返しますが、上に書いたように、テストは履歴の異なる2つのブローカー(FIBO、MIG)の2つの異なる端末で実施されました。
また、この図は他のTF(1H,30M,15Mなど)でも観察され、価格シミュレーションの異なるバリエーション(3つとも)でもやはり前述のエラーが発生することがあります。
そして、22:00の4時のバーは、何も超自然的なことではなく、普通の「日曜日」のバーなのです。22:00にはオープンしていますよ。例えばアルパリのように、すべての証券会社がストーリーをカットしているわけではありません。;о)
しかし、問題はさらに局地的なものだった。このEAは、すべてのブローカーでエラーが発生しないことが判明しました。すなわち、「日曜日」のデータを持つ、それらのブローカーにである。具体的には、Alpariは正常に動作するが、FIBOとMIGはエラーが発生する。そして、誤差は「日曜日」のバーを見たときだけ現れる。
これは「機能」ではないと思うのです。どちらかというと、バグに近い印象です。少なくとも、同じペアでエラーが発生することはないためです。ある瞬間に1つのペアで発生し、別の瞬間に別のペアで発生し、3番目の瞬間に両方のペアで発生することがあります。
この問題は何なのか、どうすればいいのか、開発者の方々の関心を集め、その答えを得ることができればと思います;o) (「アルパリで働け」とは言わないでください :o))

P.S. いずれにせよ、Profi_Rの参加には感謝しますが、ご覧の通り、単純な解決策ではどうにもならないので、もしかしたら、もっと深入りしなければならないかもしれませんね。:о)
 
今、だいたい同じようなことを考えようとしているところです。指標となる。

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



ヒストリーテストに向かないので、実用性はほとんどありません(2つのヒストリーのバーが同期していないと、2番目の通貨は素晴らしい利益を生みます。これについては以前書きました)。でも、そんなことはどうでもいいんです。

コードからわかるように、このインジケータはチャートに貼り付けられる通貨に依存しません。USDCHFでは常に動作しています。今回はAUDUSDとEURUSDの2つのチャートにインジケータを 貼り付けていますが、どのチャートに貼り付けても良いと思います。数日間放置しておくのです。そして、チャートがDIFFERENTになっていることがわかります。同じ指標です。リアルタイムで同じくMT。強制的に再描画(リンク解除-リンク)-同一になる。しばらくの間

今、トレースしているので、何かわかったらお知らせします。もちろん、私のおかげかもしれませんが :)

 
さあ、どうぞ。私の」インジケータには、ロジックに何か問題があるという建前があるかもしれないので、「ヘルパー通貨」をテストするための簡易的なインジケータを書きました。

コード(下記参照)は、USDCHF, H1のデータを取り込み(どのウィンドウにアタッチされていても)、グラフを描きます a) Open, MA(Open, 6, 標準指標を呼び出さず、手動で計算したもの)。

EURUSD H1 と AUDUSD H1 にインジケーターが装着されています。12時間の作業の後、チャート上でその違いを見ることができます(注意:データはUSDCHFから取得されたもので、違いはないはずです)。しかも、その差はMAではなく、まさにOpenのラインにあります(もちろん、MAにもありますが、Openのため、二次的なものです)。

つまり、他の通貨のデータを使用することに関連したバグがあるのです。開発者の皆様へ

#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);
}
 
森に入れば入るほど、パルチザンは濃くなる。
まず、話が大きくなればなるほど、誤差も大きくなる。
次に、そのコードです(さっそく不器用で申し訳ありません)。
#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とGBPUSDの通貨ペアにおいて、EURGBPの4Hで実行すると、2000以上のエラーが発生します。
15Mで-26500円以上。
そして15Mでは、シフトは1小節ではなく、もっともっと多くの小節(100小節以上(!))です。
これが丸太の一部です。
15.06.2006 1:45 16.06.2006 0:45 16.06.2006 0:00
15.06.2006 1:30 16.06.2006 0:30 15.06.2006 23:45
15.06.2006 1:15 16.06.2006 0:15 15.06.2006 23:30
15.06.2006 1:00 16.06.2006 0:00 15.06.2006 23:15
15.06.2006 0:45 15.06.2006 23:45 15.06.2006 23:00
15.06.2006 0:30 15.06.2006 23:30 15.06.2006 22:45
15.06.2006 0:15 15.06.2006 23:15 15.06.2006 22:30
15.06.2006 0:00 15.06.2006 23:00 15.06.2006 22:15
14.06.2006 23:45 15.06.2006 22:45 15.06.2006 22:00
14.06.2006 23:30 15.06.2006 22:30 15.06.2006 21:45
14.06.2006 23:15 15.06.2006 22:15 15.06.2006 21:30
14.06.2006 23:00 15.06.2006 22:00 15.06.2006 21:15
14.06.2006 22:45 15.06.2006 21:45 15.06.2006 21:00
14.06.2006 22:30 15.06.2006 21:30 15.06.2006 20:45
このログは、アルパリのサーバーから、新しい端末と新しい履歴(3つの通貨ペアで15Mの2005年3月10日以前)を取得したものです。
これらの調査のポイントは、この現象について開発者から分かりやすい説明を受けることです。
そして戸惑うのは、ここ1週間ほど、親愛なるあなたからの言葉がないことです。
どうすれば、この問題の深刻さを証明し、注目してもらえるかわからない。
状況とコードの透明な単純さが、些細なエラーについて考えることを妨げているのです。だから、私は HEREBYPLEASE MAKE SURE PLEASE TO THE DESIGNERSにお願い します。
親愛なる皆様へこのスレッドに注目し、少なくともあなたのほうからコメントを出すことを切にお願いします。もし私のミスなら、私のせいだと思わないでください。せめて、どこを見ればいいのか教えてください。その場合は謝罪します。もしMT4のエラーなら、この状況を発見して注意を喚起するために貴重なリソースを費やす人々(私だけでなく、つまり)の時間を尊重すべきだと思うのですが、実際には彼らの直接的な仕事ではありません。
敬意と建設的な対話への希望を込めて ...:о)

 
ほら、自分でも混乱しているでしょ :)
20年近く前、寮でお茶をスプーンでぐるぐるかき混ぜていたら、漏斗を通した像が歪んでしまうことを発見したんです。私はすぐにその単純な説明を忘れ、円形に動く水塊が重力の局所的な変化を引き起こし(バミューダトライアングル周辺の船の消失もそれで説明できる)、その結果波(光)が屈折することを確認したと見なしたのである。この日食は、水の渦巻きから得られるありふれたレンズだと気づくまで、数分間続きました :)

あなたのコードを少し変更しました。
//+------------------------------------------------------------------+
//|                                             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);
  }
//+------------------------------------------------------------------+



 
あなたのコードによって、異なる商品で同じ インデックスのバーが常に 同じタイムフレームを反映していない事実が判明しました。
つまり、なぜ同じではないのか、なぜ歴史に穴があいているのか、本当にこのような疑問が湧いてくるのです。GBPJPY H4でこのインジケータを実行し、結果の2つのファイルを開いてみました。
2箇所でタイミングが崩れていることがすぐにわかり、2つ目のファイルには "エラー "が大量に表示されます




PS アルパリの名言
理由: