Trade101 indicatore multi-valuta

 

Ecco il tacchino multi-valuta. Il suo compito è quello di ordinare le coppie in base al numero di pip, rispetto all'inizio della giornata.

Si visualizza perfettamente bene quando mostra solo il valore dei pip. Ma quando provo a visualizzare il numero di sequenza nell'array, ottengo un problema.

Ho evidenziato il punto del codice in cui si può osservare questo.

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

Oltre alle parole, un'immagine esplicativa





La prima variante del rientro (dall'alto in basso, quando la linea è commentata

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

Seconda variante, quando è rimasto funzionante

La terza variante quando la linea è lasciata in funzione

// Buf[bar1]=i; // ВОТ ТАК будет строится НОРМАЛЬНО наклонная линия 
La variante quando la linea di lavoro è 
Buf[bar1]=15; // QUESTO NON È COME QUESTO

lo stesso del secondo.

A proposito, ho notato che il nome dell'indicatore non è scritto per la seconda variante - ho la sensazione che ci siano errori come la divisione per 0.
 

E per quanto riguarda la dipendenza dell'indicatore dalla barra 0, si manifesta su alcuni timeframe. A volte il grafico appare - solo una linea orizzontale. Ma quando si sposta il grafico in modo che la barra dello zero non sia visibile sullo schermo, scompare!!!

Non capisco. Sarei grato se qualcuno potesse indicare il problema.

 
sergeev писал(а) >>

E per quanto riguarda la dipendenza dell'indicatore dalla barra 0, si manifesta su alcuni timeframe. A volte il grafico appare - solo una linea orizzontale. Ma quando si sposta il grafico in modo che la barra dello zero non sia visibile sullo schermo, scompare!!!

Non capisco. Sarei grato a coloro che possono mostrarmi il problema.

È necessario inserire un indicatore per controllare il numero di barre sul secondo strumento. E quando cambia di più di uno, lo ridisegna completamente. Significa che c'è stato uno scambio di storia.

 
No. Controllo sulla cronologia già scaricata senza connessione internet.
 
Qualcuno può provare ad eseguirlo al loro posto?
 

Mettetelo in un file. Non voglio copiarlo.

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

Buf[bar1]=15; // QUESTO NON È NULLA di simile

1. Se l'intervallo è fissato a 14:16, verrà disegnata una linea orizzontale. (L'intervallo diventa automaticamente 15:15 e ... tutti impazziscono :), credo).

Per la versione "originale", l'intervallo è 0:2 e ci sarà anche una linea. (Questo è anche ciò che dice la stampa di debug).

2. Non dirò nulla sull'algoritmo di ordinamento ;). Io, nella stessa situazione, ho preferito 2 array e ArraySort

 
SergNF >> :

1. Se si fissa l'intervallo a 14:16, viene disegnata una linea orizzontale. (L'intervallo diventa automaticamente 15:15 e ... tutti impazziscono :), credo).

Per la variante "originale", l'intervallo è 0:2 e ci sarà anche una linea. (Questo è anche indicato dalla stampa di debug)

Esattamente giusto. Mi è mancato.

2. Non dirò nulla sull'algoritmo di ordinamento ;). Io, nella stessa situazione, ho preferito 2 array e ArraySort.

ArraySort non è adatto. È necessario ordinare due dimensioni simultaneamente. ordinare le cifre e spostare gli indici in una volta sola.

 
sergeev писал(а) >>

Comunque, avevo ragione quando ho dato il link al sistema T101.