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

 
Vitalie Postolache:

Это время на часах, а не дельта. Дельта=5*3600 задаётся в секундах.

И‌ не забывайте переинициализировать StartTime новым временем, когда условие будет выполнено.

Что за ChangeChart()?

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


void ChangeChart (int x, int y)
{    
         ChartSetSymbolPeriod (0,aSymbol (x), tf(y));
         Print ("График изменен на " + aSymbol(x) + " " + tfs(y));
}
 
Эдуард Климуш:

void ChangeChart (int x, int y)
{    
         ChartSetSymbolPeriod (0,aSymbol (x), tf(y));
         Print ("График изменен на " + aSymbol(x) + " " + tfs(y));
}
Достаточно просто задать период, потом обратно поменять на прежний. Или не менять, если в советнике привязка к периоду жестко задана. Но чаще всего период везде в коде пишут как PERIOD_CURRENT, а значит, надо обратно менять.
 
Vitalie Postolache:
Достаточно просто задать период, потом обратно поменять на прежний. Или не менять, если в советнике привязка к периоду жестко задана. Но чаще всего период везде в коде пишут как PERIOD_CURRENT, а значит, надо обратно менять.

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

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

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

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

эт кому видимо как повезет

у меня в МТ4 и в МТ5 всё гудд

ну вставьте в самом низу OnInit() еще и OnTick() или OnStart() тогда, и будет Вам полный перезапуск советника, какие проблемы?

Насчет необходимости в OnInit() я бы сильно поспорил, т.к.. к примеру, у меня инициализация в 20 раз больше OnStart()........... и что? //не буду же я пересчитывать одни и те же параметры на каждом тике, а можно только при сбое...

Мало написать АТС, гораздо сложнее добиться надежной работы советника без вмешательства человека...‌

 
Renat Akhtyamov:

какие проблемы?

Чтобы ответить, нужно будет начать с азов. Поэтому оставлю без ответа.
 
// Перезапуск себя
bool ExpertReopen()
{
  return(ChartSaveTemplate(0, __FILE__) && ChartApplyTemplate(0, __FILE__));
}
 
Renat Akhtyamov:

эт кому видимо как повезет

у меня в МТ4 и в МТ5 всё гудд

ну вставьте в самом низу OnInit() еще и OnTick() или OnStart() тогда, и будет Вам полный перезапуск советника, какие проблемы?

Насчет необходимости в OnInit() я бы сильно поспорил, т.к.. к примеру, у меня инициализация в 20 раз больше OnStart()........... и что? //не буду же я пересчитывать одни и те же параметры на каждом тике, а можно только при сбое...

Мало написать АТС, гораздо сложнее добиться надежной работы советника без вмешательства человека...‌

Вызывая DeInit и затем OnInit - вы фактически перезапускаете советник.  не обязательно это делать каждый тик. Запустите  по таймеру эти две функции. Второй вариант Сохраните текущее время и сравинвайте с настоящим , через нужное время вызовите DeInit() и затем OnInit().
 
Dmitiry Ananiev:
Вызывая DeInit и затем OnInit - вы фактически перезапускаете советник.
Это не так.
 

Это при условии что в DeInit записаны все необходимые функции. Типа обнулить и убрать все глобальные переменные, удалить все объекты на чартах ну прочее.

 
Dmitiry Ananiev:

Это при условии что в DeInit записаны все необходимые функции. Типа обнулить и убрать все глобальные переменные, удалить все объекты на чартах ну прочее.

Если есть объекта класса, определенный на глобальном уровне, то никакая функция не сможет его уничтожить. Тоже самое касается всех static-объектов и некоторых static-переменных. В общем, нужно выгружать полностью советник и запускать его с нуля.