Trade101マルチカレンシーインジケーター

 

ここで、多通貨のターキーです。そのタスクは、一日の始まりに相対するピップ数でペアを並べることです。

pipsの値だけを表示させる場合は、全く問題なく表示されます。しかし、配列の中の配列番号を表示しようとすると、問題が発生します。

コードの中で、これを観察できる場所をハイライトしておきました。

//+------------------------------------------------------------------+
//|                                                        Multi.mq4 |
//|                                Copyright © 2008, Сергеев Алексей |
//|                                         mailto: urgunt@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Сергеев Алексей"
#property link      "mailto: urgunt@gmail.com"

#define Max 2

#property indicator_separate_window
#property indicator_buffers 1

#property indicator_color1 Green
#property indicator_width1 1
#property indicator_level1 0.0

double Buf[];
//+------------------------------------------------------------------+
int init()
{
	SetIndexBuffer(0, Buf); SetIndexStyle(0, DRAW_LINE); return(0);
}
//+------------------------------------------------------------------+
int deinit() { return(0); }
//+------------------------------------------------------------------+
int start()
{
	string Pair[ Max]; // сохраняем имена валют для удобства в массив
	Pair[0]="EURUSD"; Pair[1]="GBPUSD"; 
   double Price[ Max][2];
   
	int bar0, bar1; string str; datetime time0, time;
	int i, j, k;
	double pc0, pc, a;
	bool b=true;
	
	// нашли минимальное число баров
	for ( i=0; i<Bars-1; i++) //составяем график
	{
		time=iTime(Symbol(), 0, i); // берем время бара текущего графика
		// синхронизируем текущую цену закрытия
		k=0; bar1=0; while ( k< Max && bar1!=-1)  { bar1=iBarShift( Pair[ k], 0, time, true);  k++; }
		if ( bar1==-1) continue; // если её нет на всех валютах, выходим

		str=TimeYear( time)+"."+TimeMonth( time)+"."+TimeDay( time);	time0=StrToTime( str);
		// синхронизируем полуночный бар
		k=0; bar0=0; while ( k< Max && bar0!=-1)  { bar0=iBarShift( Pair[ k], 0, time0, true);  k++; }
		if ( bar0==-1) continue; // если его нет на всех валютах, выходим

		// синхронизируем цену закрытия полуночного бара
		k=0; pc0=1;	while ( k< Max && pc0!=0)  { pc0=iClose( Pair[ k], 0, bar0+1);  k++; }
		if ( pc0==0) continue; // если её нет на всех валютах, выходим
		
		for ( j=0; j< Max; j++) // получили значеня цен всех пар текущего бара
		{
			bar0=iBarShift( Pair[ j], 0, time0, true); bar1=iBarShift( Pair[ j], 0, time, true);
			Price[ j][0]=iClose( Pair[ j], 0, bar1)-iClose( Pair[ j], 0, bar0+1); // сохраняем число пунктов
			Price[ j][1]= j; // сохраняем индекс сивола в массиве
		}
		while ( b) // сортируем массив по возрастанию
		{
			b=false;
			for ( j=1; j< Max; j++)
				if ( Price[ j][0]> Price[ j-1][0])	
				{ 
					a= Price[ j][0]; Price[ j][0]= Price[ j-1][0]; Price[ j-1][0]= a;
					k= Price[ j][1]; Price[ j][1]= Price[ j-1][1]; Price[ j-1][1]= k; b=true; 
				}
		}
		//----------- ВОТ В ЭТОЙ СТРОЧКЕ ОШИБКА ------------------------------------|
		for ( j=0; j< Max; j++) Price[ j][0]= j; // заменили пункты на порядковый номер |
		// Если ее закоментировать, то будет выводиться просто число пунктов				|
		//--------------------------------------------------------------------------|
		if (GetLastError()!=0) Print("hsfjshdk");
		// строим график для текущей валюты
		for ( j=0; j< Max; j++)
			if ( Pair[ j]==Symbol()) // берем график текущего символа
			{
				for ( k=0; k< Max; k++) // находим в массиве её цену и порядковый номер
					if ( Price[ k][1]== j) 
					{
						bar1=iBarShift( Pair[ j], 0, time, true); // взяли смещение бара
						
						//---- ВОТ ТУТ СТРОИТСЯ ГРАФИК --------------
						Buf[ bar1]= Price[ j][0];
						// Buf[bar1]=15; // ВОТ ТАК график строиться ВООБЩЕ НЕ БУДЕТ
						// Buf[bar1]=i; // ВОТ ТАК будет строится НОРМАЛЬНО наклонная линия 
					}
				break;
			}
	}
	return(0);
}
 

文字だけでなく、説明の絵も掲載





インデントの最初の変形(上から下へ、その行がコメントされている場合

for ( j=0; j< Max; j++) Price[ j][0]= j; // заменили пункты на порядковый номер |

第2バリアント、動作したままだった場合

回線を放置した場合の第3のバリエーション

// Buf[bar1]=i; // ВОТ ТАК будет строится НОРМАЛЬНО наклонная линия 
作業行が
場合の変形例Buf[bar1]=15; // THIS IS NOTHING like this

と同じです。

ところで、2つ目のバリエーションではインジケータの名前が書かれていないことに気がつきました。0による除算などのエラーがあるような気がしています。
 

また、インジケーターの0バーへの依存については、いくつかの時間枠で表示されます。時々、チャートが表示されますが、水平線だけ です。しかし、チャートをずらしてゼロバーが画面に表示されないようにすると、消えてしまうのです!!!!

理解できない。どなたかご指摘いただけると幸いです。

 
sergeev писал(а)>>

また、インジケーターの0バーへの依存については、いくつかの時間枠で表示されます。時々、チャートが表示されますが、水平線だけです。しかし、チャートをずらしてゼロバーが画面に表示されないようにすると、消えてしまうのです!!!!

理解できない。問題点を教えていただけるとありがたいです。

第二計器のバー数を制御するためのインジケータを入れる必要がある。そして、それが1以上変化すると、完全に再描画される。歴史の入れ替わりがあったということです。

 
インターネットに接続されていない状態で、すでにダウンロードした履歴を確認中です。
 
誰か自分の代わりに動かしてみてくれないかな?
 

ファイルに入れておく。真似をするつもりはない。

 
ファイル:
_trade101.mq4  4 kb
 
sergeev писал(а)>>

Buf[bar1]=15; // これは全く違うものです。

1.範囲を14:16に固定すると、水平線が描かれます。(範囲は自動的に15:15になり、...みんなおかしくなる :)、と思います)。

オリジナル」バージョンでは、範囲は0:2で、ラインも入ります。(デバッグプリントにもこのように記載されています)。

2.ソートアルゴリズムについては、何も言いません ;)。私は、同じ状況で、2つのアレイとArraySortを優先しました。

 
SergNF >> :

1.範囲を14:16に固定すると、水平線が描かれる。(範囲は自動的に15:15になり、...みんなおかしくなる :)、と思います)。

オリジナル」バリエーションでは、範囲は0:2で、線も入ります。(デバッグプリントでも表示されます)。

まさにその通りです。見逃した。

2.ソートアルゴリズムについては、何も言いません ;)。私は、同じ状況で、2つのアレイとArraySortを優先しました。

ArraySortは適さない。2次元を同時にソートする必要がある。桁のソートとインデックスの移動を一度に行う。

 
sergeev писал(а)>>

それにしても、T101システムのリンクを張ったのは正解でしたね。

理由: