Скрипты: Переключение графиков

 

Переключение графиков:

Скрипт переключает все открытые графики через определённый интервал.

Автор: Karputov Vladimir

 
Добрый вечер! А можно ли зациклить скрипт? Чтоб после окончания отрытых графиков он начинал всё сначала, а не заканчивал работу.
 
Skyline Real:
Добрый вечер! А можно ли зациклить скрипт? Чтоб после окончания отрытых графиков он начинал всё сначала, а не заканчивал работу.
В принципе можно. А сколько нужно делать циклов? Или как калейдоскоп - целыми сутками?
 
Karputov Vladimir:
В принципе можно. А сколько нужно делать циклов? Или как калейдоскоп - целыми сутками?
Ну, было бы лучше целыми сутками...
 
Skyline Real:
Ну, было бы лучше целыми сутками...

В таком случае нужен советник в котором в OnTimer() вызывать всю карусель. Подумаю.

Добавлено. Исправил текст. 

 

В общем вот эксперт. Главное - это помните, что выключить/выгрузить эксперта при бесконечном показе графиков немного проблематично :) . Поэтому напомню, что данный эксперт отображается в окне "Навигатор":

Окно "Навигатор" с работающим экспертом 

А, вот и сам эксперт:

//+------------------------------------------------------------------+
//|                                           Сhart_bring_to_top.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The indicator switches all open charts after a certain interval."
//--- входной параметр
//--- input parameter
input uchar Seconds=3;              // интервал // interval
//---
bool        IsCicle=false;          // true - в цикле // true - in cicle
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   if(Seconds<3)
     {
      MessageBox("Interval must be greater than 3 seconds");
      EventSetTimer(3);
     }
   else
      EventSetTimer(Seconds);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(IsCicle)
      return;
   IsCicle=true;
//---
   uchar temp_second;
   if(Seconds<3)
      temp_second=3;
// variables for chart ID
   long currChart,prevChart=ChartFirst();
//--- Показываем первый график
//--- Show the first chart
   ChartBringToTop(prevChart);
   Sleep((int)MathAbs(temp_second*1000));
   int i=0,limit=100;
//Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
// У нас наверняка не больше 100 открытых графиков
// We have certainly not more than 100 open charts
   while(i<limit)// 
     {
      // На основании предыдущего получим новый график
      // Get the new chart ID by using the previous chart ID
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  // достигли конца списка графиков // Have reached the end of the chart list
                              //Print(i," ",ChartSymbol(currChart)," ID =",currChart);
      ChartBringToTop(currChart);
      Sleep((int)MathAbs(temp_second*1000));
      // Запомним идентификатор текущего графика для ChartNext()
      // Let's save the current chart ID for the ChartNext()
      prevChart=currChart;
      // Не забудем увеличить счетчик
      // Do not forget to increase the counter
      i++;
     }
   IsCicle=false;
  }
//+------------------------------------------------------------------+
//| Отправка терминалу команды на показ графика поверх всех других.  |
//| Sends command to the terminal to display the chart above all others  |
//+------------------------------------------------------------------+
bool ChartBringToTop(const long chart_ID=0)
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- покажем график поверх всех других
   if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
   ChartRedraw(chart_ID);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
Файлы:
 
Спасибо за оперативность. Но советник работает некорректно. Если открыто более двух графиков, то советник перепрыгивает с 1-го графика сразу на последний, пропуская остальные между ними. И нет перехода с последнего на 1-й график, т.е. карусель не работает.
 
Skyline Real:
Спасибо за оперативность. Но советник работает некорректно. Если открыто более двух графиков, то советник перепрыгивает с 1-го графика сразу на последний, пропуская остальные между ними. И нет перехода с последнего на 1-й график, т.е. карусель не работает.
Терминал ведёт свой внутренний учет очередности открытия графиков. И если Вы в процессе работы перетасовывали графики - это не поменяет внутренний учёт. Проведите эксперимент: закройте все графики, откройте штук пять новых и прикрепите советник к графику, скажем номер 3.
 
Karputov Vladimir:
Терминал ведёт свой внутренний учет очередности открытия графиков. И если Вы в процессе работы перетасовывали графики - это не поменяет внутренний учёт. Проведите эксперимент: закройте все графики, откройте штук пять новых и прикрепите советник к графику, скажем номер 3.

Проверил, всё также. С 3-го сразу на последний и стопор потом. С последнего на 1-й не переключается, карусели нет.

Ну и не знаю, влияет ли это - у меня mt4. Я переименовал файл в mt4 и сделал компиляцию. Ранний скрипт у меня корректно переключается...

 

Версия советника 1.01. Исправлена ошибка и произведена замена названия переменной. Вместо

Seconds

теперь переменная имеет название

Seconds_
так как в MQL4 слово Seconds нельзя использовать в качестве имени переменной. (Справка по Seconds).


Советник можете использовать как в MetaTrader 5, так и MetaTrader 4 (для MT4 нужно просто переименовать файл).

Seconds - Документация на MQL4
  • docs.mql4.com
Seconds - Документация на MQL4
Файлы:
 

Видео работы советника - калейдоскопа, который переключает все доступные графики в бесконечном режиме: