Реиницизация советника

 

Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.

‌Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?

 
Эдуард Климуш:

Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.

‌Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?


Можно установить сторонюу програму которая будет перегружать МТ в целом через определённое время. Уверен такие программы есть.
 
Эдуард Климуш:

Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.

‌Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?

можно добавить функцию в советник - раз в 5 часов перенакатить шаблон (через ChartApplyTemplate)

 
Эдуард Климуш:

Здравствуйте, скажите, пожалуйста, есть ли какой-то способ реинициализировать советник при наступлении каких либо условий? У меня через несколько часов работы выбивает вебреквест ошибку 5203, тело и хедер в респонзе абсолютно аналогичные тому, что без ошибки.

‌Однако, если удалить график вместе с советником, открыть новый график и кинуть на него советник - опять все работает. Несколько часов (возможно, даже полноценный рабочий день - тут все рандомно происходит). Но потом все равно скатывается на ошибку. В связи с чем у меня родилась идея дописать какую-то функцию в советнике/создать какой-то скрипт, который каждые часов 5 будет перезапускать советника. Каким образом это можно сделать?

Попробуйте это как то использовать

ChartSetSymbolPeriod

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

bool  ChartSetSymbolPeriod(
   long             chart_id,     // идентификатор графика
   string           symbol,       // имя символа
   ENUM_TIMEFRAMES  period        // период
   );

Параметры

chart_id

[in]  Идентификатор графика. 0 означает текущий график.

symbol

[in]  Символ графика.NULLoзначает символ текущего графика (к которому прикреплен эксперт)

period

[in]  Период графика (таймфрейм). Может принимать одно из значений значений перечисленияENUM_TIMEFRAMES. 0 означает период текущего графика.

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию обошибке, необходимо вызвать функциюGetLastError().

Примечание

Смена символа/периода влечет за собой переинициализацию эксперта, прикрепленного к соответствующему графику.

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


Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Maxim Kuznetsov:

можно добавить функцию в советник - раз в 5 часов перенакатить шаблон (через ChartApplyTemplate)


это можно реализовать через такую штуку?

с‌оздаем при инициализации советника переменную StartTime, которая равна TimeLocal()

д‌алее по таймеру другую переменную DeltaTime = StartTime - TimeLocal()

Е‌сли DeltaTime > D'05:00:00', то запускаем смену графика

В‌ерно? Возможно, я неправильно сравниваю дельтатайм и 5 часов. Поправьте, пожалуйста

 
Эдуард Климуш:


это можно реализовать через такую штуку?

с‌оздаем при инициализации советника переменную StartTime, которая равна TimeLocal()

д‌алее по таймеру другую переменную DeltaTime = StartTime - TimeLocal()

Е‌сли DeltaTime > D'05:00:00', то запускаем смену графика

В‌ерно? Возможно, я неправильно сравниваю дельтатайм и 5 часов. Поправьте, пожалуйста

Да, примерно так можно. Хотя решение костыльное, но пока будете искать причину ошибки , вполне годится. ‌

 
Yuriy Zaytsev:

Да, примерно так можно. Хотя решение костыльное, но пока будете искать причину ошибки , вполне годится. ‌


придумал решение еще проще

О‌шибку же выдает 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 по нужному условию
 
Renat Akhtyamov:
просто запустить функцию 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


‌...

 
Sergey Gritsay:


Точно, вот набросал проверочный код

Вставьте распринтовку в самом начале OnInit, получите по итогу только один раз нулевой test.

Вызов OnInit - это не перезапуск советника. До OnInit при запуске советника идет присвоение глобальных переменных/объектов. Например, в Вашем примере ДО OnInit выполняется конструктор объекта newbar.

С‌оветникам совершенно не нужны OnInit и OnDeinit (скриптам - OnStart). Перекочевали из старого MQL4.