Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.
Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?
Можно установить сторонюу програму которая будет перегружать МТ в целом через определённое время. Уверен такие программы есть.
Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.
Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?
можно добавить функцию в советник - раз в 5 часов перенакатить шаблон (через ChartApplyTemplate)
Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.
Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?
ChartSetSymbolPeriod
Меняет значения символа и периода указанного графика. Функция работает асинхронно, то есть отдает команду и не ждет окончания ее выполнения. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.
bool ChartSetSymbolPeriod( |
Параметры
chart_id
[in] Идентификатор графика. 0 означает текущий график.
symbol
[in] Символ графика.NULLoзначает символ текущего графика (к которому прикреплен эксперт)
period
[in] Период графика (таймфрейм). Может принимать одно из значений значений перечисленияENUM_TIMEFRAMES. 0 означает период текущего графика.
Возвращаемое значение
Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию обошибке, необходимо вызвать функциюGetLastError().
Примечание
Смена символа/периода влечет за собой переинициализацию эксперта, прикрепленного к соответствующему графику.
Вызов ChartSetSymbolPerid с тем же символом и таймфреймом можно использовать для обновления графика (аналогично команде Refresh в терминале). Обновление графика в свою очередь запускает перерасчет индикаторов, прикрепленных к нему. Таким образом, вы можете рассчитать индикатор на графике даже при отсутствии тиков (например, в выходные дни).
- www.mql5.com
можно добавить функцию в советник - раз в 5 часов перенакатить шаблон (через ChartApplyTemplate)
это можно реализовать через такую штуку?
создаем при инициализации советника переменную StartTime, которая равна TimeLocal()
далее по таймеру другую переменную DeltaTime = StartTime - TimeLocal()
Если DeltaTime > D'05:00:00', то запускаем смену графика
Верно? Возможно, я неправильно сравниваю дельтатайм и 5 часов. Поправьте, пожалуйста
это можно реализовать через такую штуку?
создаем при инициализации советника переменную StartTime, которая равна TimeLocal()
далее по таймеру другую переменную DeltaTime = StartTime - TimeLocal()
Если DeltaTime > D'05:00:00', то запускаем смену графика
Верно? Возможно, я неправильно сравниваю дельтатайм и 5 часов. Поправьте, пожалуйста
Да, примерно так можно. Хотя решение костыльное, но пока будете искать причину ошибки , вполне годится.
Да, примерно так можно. Хотя решение костыльное, но пока будете искать причину ошибки , вполне годится.
придумал решение еще проще
Ошибку же выдает 5203
if (GetLastError() ==5203)
{
ChangeChart (x,y);
}
Такое условие годится?
Только почему-то у меня не проходит изменение графика
Если DeltaTime > D'05:00:00', то запускаем смену графика
Верно? Возможно, я неправильно сравниваю дельтатайм и 5 часов. Поправьте, пожалуйста
Это время на часах, а не дельта. Дельта=5*3600 задаётся в секундах.
И не забывайте переинициализировать StartTime новым временем, когда условие будет выполнено.
придумал решение еще проще
Ошибку же выдает 5203
if (GetLastError() ==5203)
{
ChangeChart (x,y);
}
Такое условие годится?
Только почему-то у меня не проходит изменение графика
Что за ChangeChart()?
Вам выше самое простое решение посоветовали, смену периода графика, которая автоматически запускает полную инициализацию всех программ на графике, почему бы не попробовать это, прежде чем выдумывать себе новые "непреодолимые" задачи?
Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.
Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?
просто запустить функцию init() для МТ4 или OnInit() для МТ5 по нужному условию
Точно, вот набросал проверочный код
//+------------------------------------------------------------------+ //| test10.mq5 | //| Sergey Gritsay | //| https://www.mql5.com/ru/users/sergey1294 | //+------------------------------------------------------------------+ #property copyright "Sergey Gritsay" #property link "https://www.mql5.com/ru/users/sergey1294" #property version "1.00" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CNevBar { private: datetime curbar; datetime lastbar; public: CNevBar(); ~CNevBar(); bool bar(string symbol,ENUM_TIMEFRAMES period); }; //+------------------------------------------------------------------+ void CNevBar::CNevBar() { } //+------------------------------------------------------------------+ void CNevBar::~CNevBar(void) { } //+------------------------------------------------------------------+ bool CNevBar:: bar(string symbol,ENUM_TIMEFRAMES period) { curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE); if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE); if(lastbar!=curbar) { lastbar=curbar; return(true); } return(false); } int test=0; CNevBar newbar; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- test=5; Print(__FUNCTION__,": test = ",test); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(newbar.bar(_Symbol,PERIOD_CURRENT)) { test=10; Print(__FUNCTION__,": test = ",test); OnInit(); } } //+------------------------------------------------------------------+
результат МТ5
2017.03.10 19:17:40.302 test10 (EURUSD,M1) OnInit: test = 5 2017.03.10 19:18:02.980 test10 (EURUSD,M1) OnTick: test = 10 2017.03.10 19:18:02.980 test10 (EURUSD,M1) OnInit: test = 5 2017.03.10 19:19:02.989 test10 (EURUSD,M1) OnTick: test = 10 2017.03.10 19:19:02.989 test10 (EURUSD,M1) OnInit: test = 5 2017.03.10 19:20:03.004 test10 (EURUSD,M1) OnTick: test = 10 2017.03.10 19:20:03.004 test10 (EURUSD,M1) OnInit: test = 5
результат МТ4
2017.03.10 19:18:13.706 Expert test11 EURUSD,M1: loaded successfully 2017.03.10 19:18:13.786 test11 EURUSD,M1: OnInit: test = 5 2017.03.10 19:18:13.786 test11 EURUSD,M1: initialized 2017.03.10 19:19:04.135 test11 EURUSD,M1: OnTick: test = 10 2017.03.10 19:19:04.135 test11 EURUSD,M1: OnInit: test = 5 2017.03.10 19:20:05.961 test11 EURUSD,M1: OnTick: test = 10 2017.03.10 19:20:05.961 test11 EURUSD,M1: OnInit: test = 5 2017.03.10 19:21:03.702 test11 EURUSD,M1: OnTick: test = 10 2017.03.10 19:21:03.702 test11 EURUSD,M1: OnInit: test = 5
...
Точно, вот набросал проверочный код
Вставьте распринтовку в самом начале OnInit, получите по итогу только один раз нулевой test.
Вызов OnInit - это не перезапуск советника. До OnInit при запуске советника идет присвоение глобальных переменных/объектов. Например, в Вашем примере ДО OnInit выполняется конструктор объекта newbar.
Советникам совершенно не нужны OnInit и OnDeinit (скриптам - OnStart). Перекочевали из старого MQL4.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.
Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?