Indicateur multi-devises Trade101

 

Voici la dinde multi-devises. Sa tâche est d'ordonner les paires par le nombre de pips, par rapport au début de la journée.

Il s'affiche parfaitement bien lorsqu'il ne s'agit que de la valeur des pips. Mais lorsque j'essaie d'afficher le numéro de séquence dans le tableau, je rencontre un problème.

J'ai mis en évidence l'endroit du code où vous pouvez l'observer.

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

En plus des mots, une image explicative





La première variante de l'indentation (de haut en bas, lorsque la ligne est commentée)

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

Deuxième variante, lorsqu'il est resté en fonction

La troisième variante lorsque la ligne est laissée en fonctionnement

// Buf[bar1]=i; // ВОТ ТАК будет строится НОРМАЛЬНО наклонная линия 
La variante lorsque la chaîne de travail 
Buf[bar1]=15 ; // CECI N'EST RIEN comme ceci

le même que le second.

A propos, j'ai remarqué que le nom de l'indicateur n'est pas écrit pour la deuxième variante - j'ai l'impression qu'il y a des erreurs telles que la division par 0.
 

Quant à la dépendance de l'indicateur à la barre 0, elle se manifeste sur certains horizons temporels. Parfois, le graphique apparaît - juste une ligne horizontale. Mais lorsque vous déplacez le graphique de manière à ce que la barre de zéro ne soit pas visible à l'écran, elle disparaît ! !!

Je ne comprends pas. Je serais reconnaissant si quelqu'un pouvait m'indiquer le problème.

 
sergeev писал(а) >>

Quant à la dépendance de l'indicateur à la barre 0, elle se manifeste sur certains horizons temporels. Parfois, le graphique apparaît - juste une ligne horizontale. Mais lorsque vous déplacez le graphique de façon à ce que la barre de zéro ne soit pas visible à l'écran, elle disparaît ! !!

Je ne comprends pas. Je serais reconnaissant à ceux qui peuvent me montrer le problème.

Il est nécessaire de mettre en place un indicateur pour contrôler le nombre de barres sur le second instrument. Et lorsqu'il change de plus d'une unité, il le redessine complètement. Cela signifie qu'il y a eu un échange d'histoire.

 
Non. Vérification de l'historique déjà téléchargé sans connexion Internet.
 
Quelqu'un peut-il essayer de l'exécuter à sa place ?
 

Mettez-le dans un dossier. Je ne veux pas le copier.

 
Dossiers :
_trade101.mq4  4 kb
 
sergeev писал(а) >>

Buf[bar1]=15 ; // CECI N'EST RIEN comme ceci

1. Si la plage est fixée à 14:16, une ligne horizontale sera tracée. (L'intervalle devient automatiquement 15:15 et ... tout le monde devient fou :), je suppose).

Pour la version "originale", la fourchette est de 0:2 et il y aura également une ligne. (C'est également ce que dit l'impression de débogage).

2. je ne dirai rien sur l'algorithme de tri ;). Moi, dans la même situation, j'ai préféré 2 tableaux et ArraySort

 
SergNF >> :

1. Si vous fixez la plage à 14:16, une ligne horizontale est tracée. (L'intervalle devient automatiquement 15:15 et ... tout le monde devient fou :), je suppose).

Pour la variante "originale", la fourchette est de 0:2 et il y aura également une ligne. (Ceci est également indiqué par l'impression de débogage)

Exactement. Je l'ai raté.

2. je ne dirai rien sur l'algorithme de tri ;). Dans la même situation, j'ai préféré 2 tableaux et ArraySort.

ArraySort ne convient pas. Vous devez trier deux dimensions en même temps. Triez les chiffres et déplacez les index en même temps.

 
sergeev писал(а) >>

Pourtant, j'avais raison lorsque j'ai donné le lien vers le système T101.