![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В принципе да. Но все равно не больше О(n).
Ну это не оптимизационная проблема.
Поиск экстремума - всегда проблема порядка О(n), где n - число данных. Как можно сделать эту асимптотику хуже - даже не представляю.
Простейший алгоритм - сортировка ArraySort(), встроенная достаточно быстра. Но она, вероятно, избыточна для этой задачи.
Можно придумать что-нибудь рекурсивное, которое будет быстрее.
Сколько времени у тебя ищется минимум и для какого кoличества барoв?
Я привел статистику в первом посте. Рассчет на 1 000 000 баров арифметически растет с увеличением периода. Так для периода 3, расчет занимает 0.54 секунды, для периода 51 0.94 секунды, а для периода 99 уже 1,59 секунды.
Хуже получается потому, что используется цикл в цикле, а это ошибка. Так для периода 3 количество итераций будет 1 000 000 * (3-1/2) = 1 000 000, а вот для перида 99 уже 1 000 000 * (99-1)/2 = 49 000 000! Поэтому алгоритм нужно переписать таким образом, что бы количество итераций при неизменном количестве данных качественно не увеличивалось с увеличением периода, а это уже чисто оптимизационная задача. Сейчас этим и занимаюсь. Пока написал вот что:
Для поиска минимума будет сотвествующая функция Down(), запущенная в паралельном потоке. После завершения работы обоих функций, их результаты будут заноситься в общий список. Как-то так.
Ну вот, таки напутал. Это не сумма рихметической прогрессии, С-4. Сумма растет квадратично.
OCL однозначно.
Простейший алгоритм - сортировка ArraySort(), встроенная достаточно быстра, что-то в районе O(n * ln( n ) ). Но она, вероятно, избыточна для этой задачи.
Думал. Любая сортировка будет заведомо медленней перебора всего массива через for. For дает одну итерацию, а arraysort в лучшем случае будет сортировать значения в каждом подокне n, что само по себе будет означать десятки действий.
Нет, все-таки здесь нужно стремиться к тому, что бы общее количество итераций качественно не отличалось от количества баров.
Ну вот, таки напутал. Это не сумма рихметической прогрессии, С-4. Сумма растет квадратично.
OCL однозначно.
Условие такого поиска экстремумов мягко-говоря странное... Но даже несмотря на это, использовать лобовой способ поиска крайне неразумно.
Сразу в голову приходит однопроходный классический ЗигЗаг с ExtDepth = n с небольшой подгонкой под текущее условие. OCL здесь 100% не нужен.
Условие такого поиска экстремумов мягко-говоря странное... Но даже несмотря на это, использовать лобовой способ поиска крайне неразумно.
Сразу в голову приходит однопроходный классический ЗигЗаг с ExtDepth = n с небольшой подгонкой под текущее условие. OCL здесь 100% не нужен.
А чего? O(n) все равно будет, как ни крути.
Если ничего не помогает - попробуй OCL. Других способов без извращений типа dll в пятере нет.