Обсуждение статьи "Построение мультивалютного индикатора с применением множества промежуточных индикаторных буферов"

 

Опубликована статья Построение мультивалютного индикатора с применением множества промежуточных индикаторных буферов:

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

Автор: Alexey

 

было бы полезно в таких индикаторах еще  и сортировать вот это

в зависимости от их значений. Если есть такая функция, поделитесь,что бы не изобретать велосипед.

 

 
Prival:

было бы полезно в таких индикаторах еще  и сортировать вот это

в зависимости от их значений. Если есть такая функция, поделитесь,что бы не изобретать велосипед.

 

Функции готовой нет, но думаю набросать не составит особого труда.

19.05.2010

Вот реализовал

Файлы:
 

Спасибо.

Единственное хочу обратить ваше внимание, что способ синхронизации не всегда работает. Вот картинка. Дыра в котировках сутки, но все синхронизировано (((.

Это очень плохо. Почему так не могу понять, и самое главное, что с этим делать?

 


 
Prival:

Спасибо.

Единственное хочу обратить ваше внимание, что способ синхронизации не всегда работает. Вот картинка. Дыра в котировках сутки, но все синхронизировано (((.

Это очень плохо. Почему так не могу понять, и самое главное, что с этим делать?

 


В индикаторе используется 2 вида синхронизации

1 по количеству баров (на графике баров должно быть больше чем требуемая история по умолчанию 500 баров) это условие видимо у вас выполнено.

2 по времени открытия нулевого бара на каждой валютной паре- это условие видимо тоже выполнено.

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

Как буду чуть по свободнее - сделаю и этот вид.

 
olyakish:

....

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

По вашему образу и подобию сделал функцию bool init_tf(…) 

//+------------------------------------------------------------------+
//| инициализация графиков задействованных валютных пар              |
//| и проверка синхронности данных                                   |
//+------------------------------------------------------------------+
//| вход                                                             |
//| mas[]  - массив имен необходимых символов                        |
//| time_0 - текущее время бара time[0]                              |
//| count_Bars - необходимое количество баров                        |
//+------------------------------------------------------------------+
bool init_tf(string &mas[], datetime time_0, int count_Bars) { 
   bool     rez=false;              // флаг успешного завершения
   int      copied=0,               // количество скопированных данных
            counter=0,              // счетчик ошибок
            tmp_bars=0;             // для проверки количества доступных баров
   datetime tmp_time[1];            // массив для проверки времени бара
   
   f_comment("Идет сихронизация");
     
   for(int i=0; i<count_symbol; i++)  {
      //Print("i=",i," ",count_symbol," ",mas[i]);
      tmp_bars=Bars(mas[i],PERIOD_CURRENT);
      if(tmp_bars<count_Bars) { // проверка количества баров
         Print("i=",i," Недостаточно баров (", mas[i],"-",fTimeFrameName(_Period),") MaxBars=",MaxBars," > Bars=",tmp_bars);
         counter++;
      }
      ResetLastError();
      copied = CopyTime(mas[i],PERIOD_CURRENT,0,1,tmp_time);
      if(copied < 1) { // ошибка копирования
         Print("i=",i," Ошибка копирования (", mas[i],"-",fTimeFrameName(_Period),") №",_LastError," (",ErrorDescription(_LastError),")");
         counter++;
      }
      if(tmp_time[0]!=time_0) { // не совпало время
         Print("i=",i," Нет синхронизации времени (", mas[i],"-",fTimeFrameName(_Period),") дельта =",(long)(time_0-tmp_time[0])/60," мин");
         counter++;
      }
   }// end for(int i=0; i<k; i++)
   
   if(counter==0) {  // все ок. нет ни одной ошибки
      rez=true;
      f_comment("Все. ок ");
   } 
   else f_comment("Нет сихронизации "+(string)counter);

   ChartRedraw( );
   return(rez);
}

 Выбрал 12 пар, что будут на чемпионате. Сделал индикатор RVI_ALL только в целях изучения синхронизации. Запустил. Результат.

2010.05.30 16:55:26   RVI_ALL (EURUSD,M1)      i= 10  Нет синхронизации времени ( GBPJPY - M1 ) дельта = 1  мин

2010.05.30 16:55:26   RVI_ALL (EURUSD,M1)      i= 5  Нет синхронизации времени ( AUDUSD - M1 ) дельта = 1  мин

2010.05.30 16:55:26   RVI_ALL (EURUSD,M1)      i= 1  Нет синхронизации времени ( GBPUSD - M1 ) дельта = 1  мин

 

Сейчас воскресенье, по этим символам нет баров (последнего бара). Следующий тик, только в понедельник. Потом вспомнилось вот эта статья график без дыр https://www.mql5.com/ru/articles/1407.  

А дыры будут. Обязательно будут. С ними нужно как то бороться. В принципе можно также как и рассказано в статье. Но у меня возникает один вопрос.

Индикатор висит на каком то одном графике. И если произошла подкачка истории по этому символу, я могу об этом узнать, prev_calculated будет сброшен в ноль.

А вот как узнать что по другим символам произошла подкачка истории или данные просто пришли с большой задержкой ?

 
Prival:

А дыры будут. Обязательно будут. С ними нужно как то бороться. В принципе можно также как и рассказано в статье. Но у меня возникает один вопрос.

Индикатор висит на каком то одном графике. И если произошла подкачка истории по этому символу, я могу об этом узнать, prev_calculated будет сброшен в ноль.

А вот как узнать что по другим символам произошла подкачка истории или данные просто пришли с большой задержкой ?


1 Либо не давать индикатору отрисовываться если есть дыра в истории и периодически опрашивать историю на момент "залатывания" дыры. (Новый тик на текущем графике либо таймером)

2.Либо отрисовывать индикатор только до дыры, при условии что дыра в истории достаточно далеко. 

и немного изменить функцию эту

bool init_tf(string &mas[], datetime time_0, int count_Bars, int shift) 
и далее по тексту 
copied = CopyTime(mas[i],PERIOD_CURRENT,shift,1,tmp_time);


После чего вызывать эту функцию в цикле (от 0 до shiftbars)

В данном случае

shift

это будет позиция бара на текущем инструменте и ТФ, который проверяем на синхронизацию с другими инструментами

 

что то у меня никак не получается определить что есть дыра в истории

https://www.mql5.com/ru/forum/1111/8747#comment_8747

единственный выход получается. копировать время и в цикле проходиться по всему массиву, но тут опять могут быть грабли, замкнутый круг какойто получается ((  

если разработчики не поменяют концепцию https://www.mql5.com/ru/articles/1407 делать графики без дыр, то может получиться так что синхронизировать всё невозможно

 
Prival:

что то у меня никак не получается определить что есть дыра в истории

https://www.mql5.com/ru/forum/1111/8747#comment_8747

единственный выход получается. копировать время и в цикле проходиться по всему массиву, но тут опять могут быть грабли, замкнутый круг какойто получается ((  

если разработчики не поменяют концепцию https://www.mql5.com/ru/articles/1407 делать графики без дыр, то может получиться так что синхронизировать всё невозможно

 

Используйте синхронизацию по буферам time[], и путаницы не будет.

Просто вызов котировки должен быть сопровождён предпроверкой по тайму, и тогда всё сростается.

Хотя согласен что путь не лёгкий и ошибок может быть куча.

 

Здравствуйте!

У меня возникают сомнения по правильности формулы индекса доллара, может они и ложны

 

Может, кто-нибудь поподробнее объяснит эту формулу, и как она появилась? 

 


"Индекс доллара - значение типа double рассчитанное по формуле, любезно предоставленной мне Neutron"

Зачем приводить формулы и ссылаться на чье то имя? У него что семь пядей во лбу? Получается, что сначало нужно статью прочитать, потом к авторам формул пораспрашивать? Если он автор, то дайти сылку, где он ее получает.

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