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

 

Опубликована статья Синхронизация нескольких графиков по одному инструменту на разных таймфреймах:

Часто, чтобы принимать решения о совершении сделок, в процессе торговли приходится одновременно анализировать графики на нескольких таймфреймах. При этом на графиках есть объекты графического анализа. Наносить одни и те же объекты на все графики неудобно. В этой статье я предлагаю автоматизировать клонирование объектов по графикам.

Работу нашего индикатора можно разделить на два блока.

  1. При запуске индикатора открытые графики фильтруются по символу. Проверяется наличие индикатора на открытых графиках соответствующего инструмента. Все объекты текущего графика клонируются на  отобранные графики.
  2. Блок-схема процесса инициализации.

  3. Обработка событий графика. Когда появляется событие создания или изменения графического объекта, программа считывает с графика информацию об измененном объекте и передает эти данные на все графики из ранее созданного списка.

Автор: Dmitriy Gizlyk

 
Хорошая статья, особенно для тех, кто использует технический анализ и создает много объектов на разных графиках. Графические объекты синхронизировать удалось, за это спасибо автору, в качестве дальнейшего развития данной темы можно синхронизировать индикаторы, созданные на различных графиках. Только вот вопрос, актуальна ли такая задача? Возможно не требуется переносить индикатор с одинаковыми параметрами на другой таймфрейм, а нужно изменить их. Еще думаю пригодилась бы функция "отвязки" от клонирования, т. е. "отвязанный" объект не переносился на другие графики. 
 
Я хочу синхронизировать уровни поддержки и сопротивления на разных таймфреймах, т.е. поддержка, добавленная на одном таймфрейме, появляется на всех других графиках таймфрейма
 
Tapani:
Я хочу синхронизировать уровни поддержки и сопротивления на разных таймфреймах, т.е. поддержка, добавленная на одном таймфрейме, появляется на графиках всех остальных таймфреймов

Здравствуйте,
Как вы добавили уровни сопротивления на график? Например, горизонтальной линией или прямоугольником?

 

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

Большое спасибо

 
yousurfer:

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

Большое спасибо

Здравствуйте, yousurfer.
Если вы хотите выбирать объекты по какому-либо свойству, вы можете добавить его в эту функцию.

string CCopyObject::CreateMessage(long chart)
  {
   string result = NULL;
   int total = ObjectsTotal(chart, 0);
   for(int i=0;i<total;i++)
     {
      string name = ObjectName(chart, i, 0);
//
// if(!( проверьте свойство объекта для копирования) ) // если вы не хотите копировать этот объект
// продолжить;// перейдите к следующему объекту
//
      switch((ENUM_OBJECT)ObjectGetInteger(chart,name,OBJPROP_TYPE))
        {
         case OBJ_HLINE:
           result+="{NAME="+name+"|TYPE="+IntegerToString(OBJ_HLINE)+"|"+HLineToString(chart, name)+"}";
           break;
         case OBJ_VLINE:
           result+="{NAME="+name+"|TYPE="+IntegerToString(OBJ_VLINE)+"|"+VLineToString(chart, name)+"}";
           break;
         case OBJ_TREND:
           result+="{NAME="+name+"|TYPE="+IntegerToString(OBJ_TREND)+"|"+TrendToString(chart, name)+"}";
           break;
         case OBJ_RECTANGLE:
           result+="{NAME="+name+"|TYPE="+IntegerToString(OBJ_RECTANGLE)+"|"+RectangleToString(chart, name)+"}";
           break;
        }
     }
   return result;
  }

С уважением,
Дмитрий.

 
Не могли бы Вы сделать такой для МТ4? Желательно с фильтром по объектам (клонировать только горизонтальные или трендовые...) Для мт4 есть подобный, но код закрыт, фильтр не приделать.
 

При 8ми открытых графиках одно иструмента с разными ТФ индикатор заметно тормозит и подвешивает МТ, например свеже-нарисованный квадрат приходит на другие чарты с 5-10 секундной задержкой. В чем может быть причина?

Спасибо!

 
Kofa:
Не могли бы Вы сделать такой для МТ4? Желательно с фильтром по объектам (клонировать только горизонтальные или трендовые...) Для мт4 есть подобный, но код закрыт, фильтр не приделать.

Для использования на МТ4 достаточно заменить расширение файла индикатора с mq5 на mq4 и перекомпилировать индикатор.
Для добавление фильтрации объектов нужно добавить параметры

sinput bool    CloneHLine     =  true;
sinput bool    CloneVLine     =  true;
sinput bool    CloneTrend     =  true;
sinput bool    CloneRectangle =  true;

и скорректировать OnChartEvent с добавлением функции CheckToClone

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   string message1=NULL;
   string message2=NULL;
   int total=0;
//---
   switch(id)
     {
      case CHARTEVENT_OBJECT_CHANGE:
      case CHARTEVENT_OBJECT_CREATE:
      case CHARTEVENT_OBJECT_DRAG:
        if(!CheckToClone(sparam))
           return;
        message1=CloneObjects.CreateMessage(l_Chart,sparam,0);
        message2=CloneObjects.CreateMessage(l_Chart,sparam,1);
        total=ArraySize(ar_Charts);
        for(int i=0;i<total;i++)
          {
           EventChartCustom(ar_Charts[i],(ushort)id,0,0,message1);
           EventChartCustom(ar_Charts[i],(ushort)id,0,0,message2);
          }
        break;
//---
      case CHARTEVENT_OBJECT_DELETE:
        if(!CheckToClone(sparam))
           return;
        total=ArraySize(ar_Charts);
        for(int i=0;i<total;i++)
           EventChartCustom(ar_Charts[i],(ushort)id,0,0,sparam);
        break;
//---
      case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_CHANGE:
      case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_CREATE:
      case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_DRAG:
        CloneObjects.DrawObjects(l_Chart,sparam);
        ChartRedraw(l_Chart);
        break;
//---
      case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_DELETE:
        if(!CheckToClone(sparam))
           return;
        ObjectDelete(l_Chart,sparam);
        ChartRedraw(l_Chart);
        break;
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CheckToClone(string name)
  {
  bool result = false;
   
   if(l_Chart>=0 && ObjectFind(l_Chart,name)==0)
     {
      switch((ENUM_OBJECT)ObjectGetInteger(l_Chart,name,OBJPROP_TYPE))
        {
         case OBJ_HLINE:
           result=CloneHLine;
           break;
         case OBJ_VLINE:
           result=CloneVLine;
           break;
         case OBJ_TREND:
           result=CloneTrend;
           break;
         case OBJ_RECTANGLE:
           result=CloneRectangle;
           break;
        }
     }
   return result;
   }
 
XDiavel:

При 8ми открытых графиках одно иструмента с разными ТФ индикатор заметно тормозит и подвешивает МТ, например свеже-нарисованный квадрат приходит на другие чарты с 5-10 секундной задержкой. В чем может быть причина?

Спасибо!

Добрый день.

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

 
Dmitriy Gizlyk:

Для использования на МТ4 достаточно заменить расширение файла индикатора с mq5 на mq4 и перекомпилировать индикатор.


Спасибо за быстрый ответ и помощь. В mq4 не все функции поддерживает. ChartIndicatorGet, CloneAllObjects и другие. В общем 9 ошибок при компилировании. В программировании я ноль. Помогите пожалуйста.