А кто-нибудь использует рекурсию в MQL4 ? - страница 2

 
Valmars писал(а) >>
Попробовал факториал - вычисляет, переписал функцию по закрытию всех ордеров с цикла на рекурсивный вызов - работает!

ИМХО закрытие ордеров при помощи рекурсии - не очень хорошее решение. Гораздо интереснее подход, когда советник представляет собой автомат, изменяющий состояния... :)

P.S. Сам я рекурсию на mql4 не использую.

Vinin писал(а) >>

Иногда без реккурсии невозможно обойтись, так как это самый простой способ решения задачи. Например нахождение определителя.

Вычисление определителя с помощью рекурсии - плохой пример (не практично, т.к. сложность O(N!)). Определитель можно гораздо эффективнее считать с помощью метода Гаусса с небольшими изменениями - получается алгоритм со сложностью O(N^3). Рекурсию лучше всего применять когда алгоритм трудно сформулировать иначе.

 
lea писал(а) >>

Вычисление определителя с помощью рекурсии - плохой пример (не практично, т.к. сложность O(N!)). Определитель можно гораздо эффективнее считать с помощью метода Гаусса с небольшими изменениями - получается алгоритм со сложностью O(N^3). Рекурсию лучше всего применять когда алгоритм трудно сформулировать иначе.

Просто интересно было. Захотелось. Хотя делал и по Гауссу. И с выбором максимального элемента, и без оного. И решение ручками, а потом только формулы забивал. Не столь суть важно.

 

"The first use of recursion by a developer gets a verbal warning, second use a written reprimand, and we fire on the third use..."


http://c2.com/cgi/wiki?RecursionVsLoop

 
lea >>:

ИМХО закрытие ордеров при помощи рекурсии - не очень хорошее решение.

в чем по вашему нехорошесть использования рекурсии при удалении ордеров ?
 
keekkenen писал(а) >>
в чем по вашему нехорошесть использования рекурсии при удалении ордеров ?

На мой взгляд, это не самый наглядный способ, сопряженный с дополнительными трудностями (нужно заранее продумать, насколько большой может быть вложенность рекурсивных вызовов).

Я считаю, что лучше применить другой подход. Например:

цикл (пока закрытие ордеров не завершено успешно) {

пытаемся закрыть

в случае неудачи делаем паузу

обновляем котировки

...

}

Кроме того, можно представить советник в виде автомата (о чем я уже говорил) примерно следующей структуры:

внутренние переменные:

время последнего обращения к серверу

номер текущего состояния

...

состояние ожидания:

производится обработка информации, поиск точек входа (возможен переход в состояние открытия позиции вверх или вниз)

если позиции уже есть и они были открыты советником (см. magic) - переходим в состояние сопровождения позиций

состояние открытия позиции вверх/вниз:

если с момента последнего обращения к серверу прошло более N секунд пытаемся открыть позицию

в случае успеха переходим в состояние сопровождения позиций

в случае неудачи анализируем ошибки и обновляем время последнего обращения к серверу

если с момента последнего обращения к серверу прошло менее N секунд

если стратегия чувствительна к скорости открытия позиций - возможно стоит вернуться в состояние ожидания

если стратегия не очень чувствительна к скорости открытия позиций - состояние не изменяем

состояние сопровождения позиций:

производится обработка информации, поиск точек входа (возможен переход в состояние переворота открытых позиций)

здесь может выполняться трейлинг стоп

...

ну и так далее :) Решайте сами, может быть у вас получится красивое решение при помощи рекурсии.

P.S. Я не противник рекурсии в общем, лишь в данном конкретном случае

 

у меня такая система закрытия ордеров

1. по условиям закрытия создается массив с параметрами ордеров для закрытия

2. цикл по массиву - закрытиеОрдера (параметры ордера на закрытие, слипаж, число попыток закрывать, пауза между попытками,вывод ошибок)

если ордер закрылся, то обнуляются параметры ордера в массиве

3. проверка по параметрам в массиве - все ли ордера закрыты, если нет, то рекурсивный вызов и все повторяется с пункта 1.


и меня такая система пока не подводила..

 
Vinin писал(а) >>

Иногда без реккурсии невозможно обойтись, так как это самый простой способ решения задачи. Например нахождение определителя.

Поддерживаю.

На мой взгляд, рекурсию следует применять лишь тогда, когда без неё не обойтись. Как-то мне пришлось решать задачу - метод программирования общего решения системы заранее не заданного количества и вида уравнений и с зарнее не заданным количеством переменных. Там без рекурсии я не смог обойтись.

По-моему, рекурсия, как никакой другой алгоритм, отнимает у программиста неоправданно много энергии.

Зачем может понадобиться рекурсия в задаче учёта ордеров не могу даже представить.

 

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

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

 
falkov писал(а) >>

Т.е. заранее неизвестна структура каталогов. Без рекурсии эту задачу, наверное, как-то можно решить, не знаю. А с рекурсией достаточно просто.

Решается без рекурсии (мы не знаем, какова максимальная вложенность папок и сколько места осталось в стеке потока; явное создание стека для поиска выглядит логичнее).

 
максимальная вложенность вроде как ограничена особенностями файловой системы
Причина обращения: