В отличие от MT4, где обращение к Open[], High[], Low[], Close[] гарантированно возвращают значения, в МТ5 функции типа CopyClose() могут возвращать -1, т.е. возвращаемое значение нужно проверять. Т.е. прямого пути перевода кода из МТ4 в МТ5 не существует.
voidOnTick()
{
MqlParam params[];
int h_MA[1000],h_MACD[1000];
for(int i=0; i<1000; i++)
{
//--- create iMA("EURUSD",PERIOD_M15,8,0,MODE_EMA,PRICE_CLOSE); ArrayResize(params,4);
//--- set ma_period
params[0].type =TYPE_INT;
params[0].integer_value=8;
//--- set ma_shift
params[1].type =TYPE_INT;
params[1].integer_value=0;
//--- set ma_method
params[2].type =TYPE_INT;
params[2].integer_value=MODE_EMA;
//--- set applied_price
params[3].type =TYPE_INT;
params[3].integer_value=PRICE_CLOSE;
//--- create MA
h_MA[i]=IndicatorCreate("EURUSD",PERIOD_M15,IND_MA,4,params);
//--- create iMACD("EURUSD",PERIOD_M15,12,26,9,h_MA); ArrayResize(params,4);
//--- set fast ma_period
params[0].type =TYPE_INT;
params[0].integer_value=12+i;
//--- set slow ma_period
params[1].type =TYPE_INT;
params[1].integer_value=26+i;
//--- set smooth period for difference
params[2].type =TYPE_INT;
params[2].integer_value=9+i;
//--- set indicator handle as applied_price
params[3].type =TYPE_INT;
params[3].integer_value=h_MA[i];
//--- create MACD based on moving average
h_MACD[i]=IndicatorCreate("EURUSD",PERIOD_M15,IND_MACD,4,params);
}
for(int i=0; i<1000; i++)
//--- release indicators (first h_MACD) if(!IndicatorRelease(h_MACD[i]) || !IndicatorRelease(h_MA[i]))
{
// make comment ExpertRemove() - make funnyExpertRemove();
}
}
//+------------------------------------------------------------------+
Запускаем этот код (осторожно! закройте все работающие программы если не хотите потерять данные - возможен ресет системы!) и видим - как не работало, так и не работает.
По крайней мере система теперь не крашится (осторожно! это у меня не крашится, а у вас может произойти всё что угодно!) как раньше.
Запрос с чужого символа/ТФ. При отсутствии истории, при загрузке терминала.
С индикаторами принципиальная разница есть?
С индикаторами - есть.
Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.
И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)
Запускаем этот код (осторожно! закройте все работающие программы если не хотите потерять данные - возможен ресет системы!) и видим - как не работало, так и не работает.
По крайней мере система теперь не крашится (осторожно! это у меня не крашится, а у вас может произойти всё что угодно!) как раньше.
Никто не обещал. И никто не отвечал никогда на этот вопрос - будет он когда либо решаться вообще или нет.
Понятно, что придется многое переделывать в работе тестера с индикаторами, понятно так же что можно при особой нужде перенести расчетную часть индикаторов в советник и рассчитывать индикатор как душе угодно...
Не понятно одно - как использовать при самооптимизации советников (валк-форвард тестирование при одиночном прогоне в тестере) индикаторы скомпилированные и/или из маркета, ведь перенести расчетную часть в советник не получится.
Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.
И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)
Поэтому надо рассматривать конкретный случай.
Ага. Еще кто-то на 4806 напоролся. В созданной мной ветке и в заявке в СД#1897969 до сих пор нет ответов по этой ошибке.
Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.
И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)
Поэтому надо рассматривать конкретный случай.
Понял. Тогда буду мониторить на предмет возникновения ошибки.
я считаю, что было бы удобно прерывать выполнение MQL-программы в любом месте, некий HLT - команду останова
Присоединяюсь. Считаю, что такая возможность будет очень кстати в будущем.
Пример, - пользовательские диалоговые окна. В отличии от штатных диалоговых окон могут иметь набор элементов управления, таких как поля ввода, чекбоксы и т.д...
В сложных программах нельзя обойтись без диалога с пользователем. Программы ожидают его действий на разных этапах своего выполнения - заполнения полей, нажатия на диал.кнопки.
Для реализации программного диалога с пользователем требуется возможность остановки выполнения функций в любом месте.
При наличии такой возможности, разработчик сможет создать интересное и сложное приложение, тесно взаимодействующее с пользователем.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: CPrice
Dmitry Fedoseev, 2016.08.28 11:25
В отличие от MT4, где обращение к Open[], High[], Low[], Close[] гарантированно возвращают значения, в МТ5 функции типа CopyClose() могут возвращать -1, т.е. возвращаемое значение нужно проверять. Т.е. прямого пути перевода кода из МТ4 в МТ5 не существует.Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: CPrice
fxsaber, 2016.08.31 12:05
Как воспроизвести ситуацию, в которой MT5 не сможет повторить поведение MT4?Приведите пример, когда Вы получаете такую ошибку
Воспроизвести не готов.
Запрос с чужого символа/ТФ. При отсутствии истории, при загрузке терминала.
С индикаторами принципиальная разница есть?
раньше не работало уничтожение индикаторов в тестере по IndicatorRelease(). теперь работает?
Запускаем этот код (осторожно! закройте все работающие программы если не хотите потерять данные - возможен ресет системы!) и видим - как не работало, так и не работает.
По крайней мере система теперь не крашится (осторожно! это у меня не крашится, а у вас может произойти всё что угодно!) как раньше.
Победите уже это наконец, пожалуйста.
Воспроизвести не готов.
Запрос с чужого символа/ТФ. При отсутствии истории, при загрузке терминала.
С индикаторами принципиальная разница есть?
С индикаторами - есть.
Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.
И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)
Поэтому надо рассматривать конкретный случай.
Запускаем этот код (осторожно! закройте все работающие программы если не хотите потерять данные - возможен ресет системы!) и видим - как не работало, так и не работает.
По крайней мере система теперь не крашится (осторожно! это у меня не крашится, а у вас может произойти всё что угодно!) как раньше.
Победите уже это наконец, пожалуйста.
Кто и когда обещал?
Никто не обещал. И никто не отвечал никогда на этот вопрос - будет он когда либо решаться вообще или нет.
Понятно, что придется многое переделывать в работе тестера с индикаторами, понятно так же что можно при особой нужде перенести расчетную часть индикаторов в советник и рассчитывать индикатор как душе угодно...
Не понятно одно - как использовать при самооптимизации советников (валк-форвард тестирование при одиночном прогоне в тестере) индикаторы скомпилированные и/или из маркета, ведь перенести расчетную часть в советник не получится.
Да. Спасибо за напоминание.
Исправили и iLowest, и Bars
Да, спасибо! В билде 1847 теперь все Ок.
С индикаторами - есть.
Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.
И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)
Поэтому надо рассматривать конкретный случай.
Ага. Еще кто-то на 4806 напоролся. В созданной мной ветке и в заявке в СД #1897969 до сих пор нет ответов по этой ошибке.
С индикаторами - есть.
Если на кеше символа-периода есть индикатор, то там всё проще. История поддерживается в актуальном состоянии без участия человека.
И если был ответ 4806, то индикатор действительно ещё не пересчитался. И вот здесь совершенно непонятно, когда индикатор пересчитается (в отличие от перестроения кешей символа-периода)
Поэтому надо рассматривать конкретный случай.
Понял. Тогда буду мониторить на предмет возникновения ошибки.
я считаю, что было бы удобно прерывать выполнение MQL-программы в любом месте, некий HLT - команду останова
Присоединяюсь. Считаю, что такая возможность будет очень кстати в будущем.
Пример, - пользовательские диалоговые окна. В отличии от штатных диалоговых окон могут иметь набор элементов управления, таких как поля ввода, чекбоксы и т.д...
В сложных программах нельзя обойтись без диалога с пользователем. Программы ожидают его действий на разных этапах своего выполнения - заполнения полей, нажатия на диал.кнопки.
Для реализации программного диалога с пользователем требуется возможность остановки выполнения функций в любом месте.
При наличии такой возможности, разработчик сможет создать интересное и сложное приложение, тесно взаимодействующее с пользователем.