Скрипты: sChartsSynchroScroll

 

sChartsSynchroScroll:

Скрипт обеспечивает синхронную прокрутку всех графиков открытых в терминале.

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

Автор: Дмитрий

 

Правильно ли я понимаю, что данный скрипт работает одновременно и с графиками разных таймфрэймов (как это сделано здесь)?

Стиль кода напоминает MQL4. И это ни есть плохо. Спасибо!

 

Присутствует проблема рассинхронизации графиков слева и справа от линии общего времени. Хотелось бы, чтобы на всю ширину графика бары были синхронизирваны по времени.

Предлагаю еще раз разработчикам подумать (возможно, вынести на обсуждение) о возможности визуализации графика с "дырами"-барами и без них. При этом это было бы только визуализация, т.е. "дыры"-бары не были бы доступны в MQL5.

 

Дмитрий, проще наверно было бы сделать через CHARTEVENT_CLICK вместо зацикливания... 

вот пример синхронизации графиков одной валюты

//------------------------------------------------------------------ OnChartEvent
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
 if (id==CHARTEVENT_CLICK)
 {
   long cid=ChartFirst();
   long fbar=ChartGetInteger(ChartID(), CHART_FIRST_VISIBLE_BAR);
   datetime tm[], tm1[];
   int rez=CopyTime(Symbol(), Period(), 0, fbar, tm); if (rez<fbar) return;
   while (cid!=-1)
   {
    ChartSetInteger(cid, CHART_AUTOSCROLL, false); ChartSetInteger(cid, CHART_SHIFT, false);
    if (cid!=ChartID() && ChartSymbol(cid)==Symbol()) 
    {
     rez=CopyTime(ChartSymbol(cid), ChartPeriod(cid), TimeCurrent(), tm[0], tm1); if (rez<0) break;
     ChartNavigate(cid, CHART_END, rez-ChartGetInteger(cid, CHART_WIDTH_IN_BARS)+2);
     ChartRedraw(cid);
    }
    cid=ChartNext(cid);
   }
 }
}

и всё!

 
getch:

Правильно ли я понимаю, что данный скрипт работает одновременно и с графиками разных таймфрэймов (как это сделано здесь)?

Стиль кода напоминает MQL4. И это ни есть плохо. Спасибо!


Будет работать с разными таймфреймами.
 
sergeev:

Дмитрий, проще наверно было бы сделать через CHARTEVENT_CLICK вместо зацикливания... 

вот пример синхронизации графиков одной валюты

и всё!

 

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

 

----------------------------------------------------------------------------------------------------------------

OnChartEvent

OnChartEvent() является обработчиком группы событий ChartEvent:

...

... 

Функция может вызываться только в экспертах и должна иметь тип void и 4 параметра:

----------------------------------------------------------------------------------------------------------------

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

 
Integer:

OnChartEvent

OnChartEvent() является обработчиком группы событий ChartEvent:

...

... 

Функция может вызываться только в экспертах и должна иметь тип void и 4 параметра:

----------------------------------------------------------------------------------------------------------------

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

 

Это уже не так, следите за объявлениями - https://www.mql5.com/ru/forum/23/page4:

MetaTrader 5 Client Terminal build 245

  1. Terminal: Исправлена ошибка учета свободных маржевых средств в активах (во вкладке Exposure).
  2. Terminal: Исправлена работа свойства чарта "График сверху" ("Chart on foreground").
  3. Terminal: Исправлено и переделано окно предпросмотра печати для чарта.
  4. Terminal: Исправлена ошибка в работе с временными глобальными переменными.
  5. Terminal: Объединены панели инструментов "Стандартная" и "Чарты".
  6. MQL5: Исправления по крешам и сообщениям на форуме
  7. MQL5: Изменен принцип работы функций Copy* для экспертов и скриптов - теперь функции будут ожидать закачки и построения запрашиваемых данных. Время ожидания запрошенных данных не более 30 секунд. Более подробное описание будет доступно в справке MQL5 в ближайшее время.
  8. MQL5: Добавлена возможность обработки событий кастомными индикаторами, аналогично экспертам. Более подробное описание будет доступно в справке MQL5 в ближайшее время.

.

 
Integer писал(а)  :

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

но ведь можно по любому краю. и дать кнопульки выбора для трейдера - по ценрту, по правому, по левому...

Еще должно быть отключено смещение графика, тоже не очень удобно (хотя, дело вкуса).

Добавили бы разработчики возможность получения и установки отступа от правого края или вообще навигацию по времени, многие функции сделаны в таком универсальном стиле, что можно передавать номер бара или время.

эта возможность кстати есть. CHART_SHIFT_SIZE 

посмотрите пример ObjChartSample.mq5 

 

Похоже, что-то не так с CHART_FIRST_VISIBLE_BAR.

Если сделать ChartNavigate() на  число число заведомо болшее, чем то, на которе можно прокуртить график, то

ChartGetInteger(ChartID(),CHART_FIRST_VISIBLE_BAR) становится больше, чем Bars(ChartSymbol(ChartID()),ChartPeriod(ChartID())).

Пример в скрипте 2.mq5. Запустить скрипт, подождать немного. 

 

Файлы:
2.mq5  2 kb
 

что то мне подсказывает, что терминал не успевает...

 

так как если запускать скрипт сразу же повторно, то прокатывает все с первого раза.

наверно надо как то контролировать время

   может  SeriesInfoInteger поможет?

 
Integer, sergeev, по сообщениям складывается крайне неприятное впечатление, что MQL5 с MT5 совсем сырые.