в тройке у нас было односекундное ограничение на работу эксперта или пользовательского индикатора. и в "особенностях написания пользовательских индикаторов" у нас был специальный топик о том, как преодолевать это ограничение и продолжать расчёт с прерванного места. попытайтесь самостоятельно, в тексте индикатора, поставить аналогичное ограничение с аналогичным продолжением расчёта. либо предотвращайте расчёт индикатора на подкачках.
to Slawa and Renat
Сразу бы и отвечали, код который требует много вычислений на MQL4 лучше не писать!
Уважаемый Dmitrii,
К сожалению, должен Вам заметить, рациональность расходования ресурсов никто не отменял.
Если не укладываетесь в рамки времени, то нужно переделывать _свой_ код, а не обвинять других.
Попробуйте переписать так, чтобы заработало в 10-20-50-100 раз быстрее.
И Вы сможете это сделать легко, как только озаботитесь этой мыслью.
Проверено.
Уважаемый Dmitrii,
К сожалению, должен Вам заметить, рациональность расходования ресурсов никто не отменял.
Если не укладываетесь в рамки времени, то нужно переделывать _свой_ код, а не обвинять других.
Попробуйте переписать так, чтобы заработало в 10-20-50-100 раз быстрее.
И Вы сможете это сделать легко, как только озаботитесь этой мыслью.
Я говорю про ситуацию когда год и так написан оптимально но всё равно требует много вычислений. Почему вы не оптимизируете MT4 чтобы он работал в 10, 100 … раз быстрей или почему не сделать чтобы MT4 использовал трафик раз в 100 меньше? Да потому что это не возможно.
Но можно сделать так что время затраченное на вычисление не мешало пользователю работать.
...............
// Цикл по необсчитанным барам
for ( int i = limit; i >= 0; i -- )
{
.............. // здесь код обсчитывающий бар
Idle(); // Эта функция отдает управление интерфейсу
}
}
// Функция поддержки многозадачности в стиле Win3.11
// Посылает в очередь сообщений текущего окна пустое сообщение
// и временно отдает управление интерфейсу.
// Интерфейс обработав сообщения от мыши и клавиатуры (если они есть)
// возвращает управление в эту функцию для продолжения
// работы индикатора.
//
int hwnd = 0;
int Idle()
{
if (hwnd == 0) hwnd = WindowHandle(Symbol(),Period());
if (hwnd != 0) SendMessageA(hwnd,0,0,0);
}
После того, как я вставил этот код в индикаторы,
я перестал замечать подвисание терминала.
Подвисает только изредка при подкачке данных на таймфрейм где давно небыл.
Сейчас индикатор подключен на 16 чартах.
Раньше терминал вис на на несколько минут при запуске и не реагировал на мыш.
Теперь этого нет.
Не знаю как сделан терминал,
в принципе с этой конструкцией могут быть проблемы (типа переполнений стека и пр.)
если при запуске начать быстро нажимать на разные кнопки.
Но у меня пока ни разу такое не наблюдалось.
Значит они все-таки написаны "неправильно". Попробуйте переписать так, чтобы заработало в 10-20-50-100 раз быстрее.
Или хотя бы какие фичи в нем предвидятся.
С уважением.
Сразу бы и отвечали, код который требует много вычислений на MQL4 лучше не писать!
Dmitrii 15.04.05 07:47 to Slawa and Renat Сразу бы и отвечали, код который требует много вычислений на MQL4 лучше не писать!Оказалось что проблема решается и в MQL в несколько строчек.
Но об этом каждый юзер должен сам позаботиться.
(см. гдето в форуме про функцию Idle)
Сразу бы и отвечали, код который требует много вычислений на MQL4 лучше не писать!
Уважаемый Dmitrii,
К сожалению, должен Вам заметить, рациональность расходования ресурсов никто не отменял.
Если не укладываетесь в рамки времени, то нужно переделывать _свой_ код, а не обвинять других.
Попробуйте переписать так, чтобы заработало в 10-20-50-100 раз быстрее.
И Вы сможете это сделать легко, как только озаботитесь этой мыслью.
Проверено.
Уважаемый Dmitrii,
К сожалению, должен Вам заметить, рациональность расходования ресурсов никто не отменял.
Если не укладываетесь в рамки времени, то нужно переделывать _свой_ код, а не обвинять других.
Попробуйте переписать так, чтобы заработало в 10-20-50-100 раз быстрее.
И Вы сможете это сделать легко, как только озаботитесь этой мыслью.
Я говорю про ситуацию когда год и так написан оптимально но всё равно требует много вычислений. Почему вы не оптимизируете MT4 чтобы он работал в 10, 100 … раз быстрей или почему не сделать чтобы MT4 использовал трафик раз в 100 меньше? Да потому что это не возможно.
Но можно сделать так что время затраченное на вычисление не мешало пользователю работать.
Оказалось что проблема решается и в MQL в несколько строчек.
Но об этом каждый юзер должен сам позаботиться.
(см. гдето в форуме про функцию Idle)
Что та не нашел, может вы покажете?
И Вы сможете это сделать легко, как только озаботитесь этой мыслью.
Проверено.
............... // Цикл по необсчитанным барам for ( int i = limit; i >= 0; i -- ) { .............. // здесь код обсчитывающий бар Idle(); // Эта функция отдает управление интерфейсу } } // Функция поддержки многозадачности в стиле Win3.11 // Посылает в очередь сообщений текущего окна пустое сообщение // и временно отдает управление интерфейсу. // Интерфейс обработав сообщения от мыши и клавиатуры (если они есть) // возвращает управление в эту функцию для продолжения // работы индикатора. // int hwnd = 0; int Idle() { if (hwnd == 0) hwnd = WindowHandle(Symbol(),Period()); if (hwnd != 0) SendMessageA(hwnd,0,0,0); }После того, как я вставил этот код в индикаторы,
я перестал замечать подвисание терминала.
Подвисает только изредка при подкачке данных на таймфрейм где давно небыл.
Сейчас индикатор подключен на 16 чартах.
Раньше терминал вис на на несколько минут при запуске и не реагировал на мыш.
Теперь этого нет.
Не знаю как сделан терминал,
в принципе с этой конструкцией могут быть проблемы (типа переполнений стека и пр.)
если при запуске начать быстро нажимать на разные кнопки.
Но у меня пока ни разу такое не наблюдалось.