Indicador multidivisa de Trade101

 

Aquí está el pavo multidivisa. Su tarea es ordenar los pares por el número de pips, en relación con el inicio del día.

Se muestra perfectamente bien cuando sólo se muestra el valor de los pips. Pero cuando intento mostrar el número de secuencia en el array, me sale un problema.

He resaltado el lugar del código donde se puede observar esto.

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

Además de las palabras, una imagen explicativa





La primera variante de la sangría (de arriba a abajo, cuando la línea está comentada

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

Segunda variante, cuando seguía funcionando

La tercera variante cuando se deja la línea funcionando

// Buf[bar1]=i; // ВОТ ТАК будет строится НОРМАЛЬНО наклонная линия 
La variante cuando la línea de trabajo es 
Buf[bar1]=15; // ESTO NO ES NADA parecido a esto

lo mismo que el segundo.

Por cierto, me di cuenta de que el nombre del indicador no está escrito para la segunda variante - Tengo la sensación de que hay errores como la división por 0.
 

Y en cuanto a la dependencia del indicador de la barra 0, aparece en algunos marcos temporales. A veces aparece el gráfico - sólo una línea horizontal. ¡¡¡¡Pero cuando se desplaza el gráfico para que la barra cero no sea visible en la pantalla, desaparece!!!!

No lo entiendo. Agradecería que alguien me indicara el problema.

 
sergeev писал(а) >>

Y en cuanto a la dependencia del indicador de la barra 0, aparece en algunos marcos temporales. A veces aparece el gráfico, sólo una línea horizontal. Pero al desplazar el gráfico para que la barra cero no sea visible en la pantalla, ¡¡¡desaparece!!!

No lo entiendo. Agradeceré a los que puedan mostrarme el problema.

Es necesario poner un indicador para controlar el número de barras en el segundo instrumento. Y cuando cambia por más de uno, lo redibuja completamente. Significa que hubo un cambio de historia.

 
No. Comprobando el historial ya descargado sin conexión a Internet.
 
¿Puede alguien intentar ejecutarlo en su lugar?
 

Ponlo en un archivo. No quiero copiarlo.

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

Buf[bar1]=15; // ESTO NO ES NADA parecido a esto

1. Si el rango se fija en 14:16, se dibujará una línea horizontal. (El rango se convierte automáticamente en 15:15 y ... todo el mundo se vuelve loco :), supongo).

Para la versión "original", el rango es 0:2 y también habrá una línea. (Esto es también lo que dice la impresión de depuración).

2. No diré nada sobre el algoritmo de clasificación ;). Yo, en la misma situación, prefería 2 matrices y ArraySort

 
SergNF >> :

1. Si se fija el rango en 14:16, se dibuja una línea horizontal. (El rango se convierte automáticamente en 15:15 y ... todo el mundo se vuelve loco :), supongo).

Para la variante "original", el rango es 0:2 y también habrá una línea. (Esto también lo indica la impresión de depuración)

Exactamente. Me lo perdí.

2. No diré nada sobre el algoritmo de clasificación ;). Yo, en la misma situación, preferí 2 arrays y ArraySort.

ArraySort no es adecuado. Es necesario ordenar dos dimensiones simultáneamente. ordenar los dígitos y mover los índices a la vez.

 
sergeev писал(а) >>

Aun así, tenía razón cuando di el enlace al sistema T101.

Razón de la queja: