мультивалютный индикатор по методу Trade101

 

Вот мультивалютный индюк. Его задача - упорядочивание пар по числу пунктов, относительно начала дня.

Отображает он отлично, когда на график просто выводить значение числа пунктов. Но вот когда я пытаюсь вывести порядковый номер в массиве, то происходит какая то трабла.

Место в коде, где можно это понаблюдать я выделил.

//+------------------------------------------------------------------+
//|                                                        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; // заменили пункты на порядковый номер |

Второй вариант, когда она осталась рабочей

Третий вариант, когда оставили рабочей строчку

// Buf[bar1]=i; // ВОТ ТАК будет строится НОРМАЛЬНО наклонная линия 
Вариант, когда рабочая строчка 
Buf[bar1]=15; // ВОТ ТАК график строиться ВООБЩЕ НЕ БУДЕТ

такой же как и второй.

Кстати заметил, что название индикатора не пишется для второго варианта - такой чувство, что ошибки есть типа деление на 0.
 

А что касается зависимости индикатора от 0 бара, то оно проявляется на некоторых таймфреймах. Иногда появляется график - просто горизонтальная линия. Но когда смещаеш график так, что на экране не виден нулевой бар, то она пропадает!!!

Непонимаю. Буду благодарен, кто укажет на траблу.

 
sergeev писал(а) >>

А что касается зависимости индикатора от 0 бара, то оно проявляется на некоторых таймфреймах. Иногда появляется график - просто горизонтальная линия. Но когда смещаеш график так, что на экране не виден нулевой бар, то она пропадает!!!

Непонимаю. Буду благодарен, кто укажет на траблу.

Надо вставить в индикатор контроль количества баров на втором инструменте. И при изменении больше чем на один полностью перерисовывать. Значит произошла подкачка истории.

 
Не-а. Проверяю на уже закачаной истории без соединения с инетом.
 
Может кто попробует у себя его прогонять?
 

Файликом положь. А то копировать неохота.

 
Файлы:
_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 не подходит. Нужно сортировать две размерности одновременно. сортировать цифры и сразу двигать индексы.

 
sergeev писал(а) >>

И все таки я был прав, когда давал ссылку на систему T101.

Причина обращения: