Добрый вечер! А можно ли зациклить скрипт? Чтоб после окончания отрытых графиков он начинал всё сначала, а не заканчивал работу.
В принципе можно. А сколько нужно делать циклов? Или как калейдоскоп - целыми сутками?
Ну, было бы лучше целыми сутками...
В таком случае нужен советник в котором в 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-й график, т.е. карусель не работает.
Терминал ведёт свой внутренний учет очередности открытия графиков. И если Вы в процессе работы перетасовывали графики - это не поменяет внутренний учёт. Проведите эксперимент: закройте все графики, откройте штук пять новых и прикрепите советник к графику, скажем номер 3.
Проверил, всё также. С 3-го сразу на последний и стопор потом. С последнего на 1-й не переключается, карусели нет.
Ну и не знаю, влияет ли это - у меня mt4. Я переименовал файл в mt4 и сделал компиляцию. Ранний скрипт у меня корректно переключается...
Версия советника 1.01. Исправлена ошибка и произведена замена названия переменной. Вместо
Seconds
теперь переменная имеет название
Seconds_так как в MQL4 слово Seconds нельзя использовать в качестве имени переменной. (Справка по Seconds).
Советник можете использовать как в MetaTrader 5, так и MetaTrader 4 (для MT4 нужно просто переименовать файл).
Видео работы советника - калейдоскопа, который переключает все доступные графики в бесконечном режиме:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Переключение графиков:
Автор: Karputov Vladimir