in

Нейронные сети форекс

Искусственные нейронные сети и их применение на рынке Форекс

В то время, как большинство трейдеров бьется в поисках Грааля, совершенствуя механические торговые системы и графические методы анализа, небольшая, но прогрессивная часть занимается разработкой нейронных сетей в трейдинге и их продвижением. Что же такое нейронная сеть, и каковы перспективы ее использования на рынках ценных бумаг?

Что такое искусственная нейронная сеть?

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

Интересно! Нейроны искусственной нейронной сети иногда называют сумматорами. Нейрон получает информацию, обрабатывает ее с помощью простых арифметических действий и передает ее дальше.

Простая нейросеть состоит из трех нейронов:

Эта последовательность называется перцептроном. Если нейросеть сложная, то нейроны в ней могут образовывать слои (обычно не более трех). Ключевой способностью нейронной сети является способность к обучению.

Основные задачи, решаемые с помощью нейросетей:

  • классификация – распределение данных по параметрам;
  • прогнозирование – например, курса валют исходя из имеющихся данных;
  • распознавание образов;

Наиболее успешно нейронные технологии применяются для распознавания образов.

Для справки! Голосовые команды и фраза «окей, Гугл» — тоже нейросети.

Классификация нейросетей

Нейросети классифицируются по количеству слоев нейронов:

  • однослойные — с одним слоем;
  • многослойные — с несколькими скрытыми слоями.

Также по направлению движения информации они могут быть следующих видов:

  • прямого распространения – информация двигается только в одном направлении;
  • рекуррентные – с обратными связями;

Возможности рекуррентных сетей пока слабо изучены, так как анализировать их сложно. Потенциал у них очень велик.

Нейронные сети в трейдинге

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

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

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

Программное обеспечение для создания нейросетей в трейдинге

Уже довольно давно на рынке присутствуют достаточно мощные пакеты и программные комплексы, позволяющие как проектировать нейронные сети для Форекс самостоятельно, так и включающие в себя готовые решения для торговли.

Для Форекс-трейдеров существует возможность писать роботов и советников на языках MQL4 и MQL5. Для работы в этом направлении есть соответствующие библиотеки. Также можно использовать пакет NeuroSolutions который позволяет не только создавать нейронные сети, но и подключаться к MetaTrader.

Недостатки нейросетей, работающих на Форекс

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

  1. Нейросети являются разновидностью статистического анализа и поэтому им свойственны все проблемы и болезни статистических методов: успешный анализ исторических данных не гарантирует успеха в будущем – это утверждение в полной мере справедливо и для нейросетей.
  2. По мере усложнения сети, количество вычислений растет по экспоненте.
  3. Нейронные сети работают по принципу черного ящика: загружая в сеть данные и получая результат, трейдер не понимает принципов, на основании которых она принимает решение, значит он не склонен доверять ей свои деньги, тем более, на таком рынке, как Форекс.

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

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

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

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

Используем нейронные сети в MetaTrader

Введение

Вероятно, многие из вас рассматривали возможность использования нейронных сетей в советниках.

Особенно эта тема стала актуальной после впечатляющей победы Better с его системой на основе нейронных сетей на Automated Trading Championship 2007 г. Многие форумы Интернета были заполнены темами, связанных с нейронными сетями и их применением в торговле на Forex.

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

В этой статье я покажу вам, каким образом вы сможете использовать свободно распространяемую библиотеку Fast Artificial Neural Network Library (FANN) в ваших программах на MQL4, избегая при этом некоторых подводных камней и ограничений.

Далее я предполагаю, что читатель уже знаком с искусственными нейронными сетями и соответствующей терминологией, так что сосредоточимся на практических аспектах использования конкретной реализации нейронных сетей на языке MQL4.

Особенности библиотеки FANN

Для глубокого понимания возможностей применения библиотеки FANN нужно ознакомиться с документацией и часто используемыми функциями. Типичный пример использования FANN — это создание простой нейронной сети прямого распространения, ее обучение на некотором наборе данных и запуск. Для последующего использования созданная и обученная нейронная сеть может быть сохранена в файле и затем восстановлена. Чтобы создать сеть нужно использовать функцию fann_create_standard().

где num_layers — это общее число слоев в нейронной сети, включая входной и выходной слои. Переменная lNnum и переменные следующие далее — это количество нейронов в каждом слое, начиная с входного слоя и заканчивая выходным. Для создания сети с одним скрытым слоем с 5 нейронами, входным слоем с 10 входами и выходным слоем с одним нейроном, нужно вызвать ее следующим образом:

Теперь, когда сеть создана, следующая операция — это ее обучение на некоторых входных и выходных данных.

Самый простой метод обучения — это инкрементное обучение, которое может быть реализовано с использованием следующей функции:

Эта функция использует указатель на структуру struct fann (который был возвращен ранее функцией fann_create_standard()) а также входной и выходной векторы, которые имеют тип fann_type.

Тип данных определяется при компиляции библиотеки (может быть double or float). В данной реализации входные и выходные вектора являются массивами типа double.

После того, как нейросеть обучена, мы хотим проверить ее в работе. Функция, реализующая это, определяется следующим образом:

Эта функция использует указатель на структуру типа struct fann, представляющую собой уже созданную нейронную сеть и входной вектор input (массив типа double). Возвращаемое значение — выходной вектор в виде массива. Даже если выходной параметр один, мы всегда на выходе получаем массив (если он один, то одномерный), а не само значение.

Большинство функций библиотеки FANN используют указатель на структуру struct fan, а поскольку MQL4 не поддерживает структуры как типы данных, невозможно работать с ними напрямую. Для того, чтобы снять это ограничение, мы должны каким-то способом построить «обертку» (wrapper).

Самый простой метод — это создать массив из указателей на структуры типа struct fann, который содержит соответствующие значения и ссылаться на них при помощи целочисленного индекса типа int. Таким способом мы можем заменить неподдерживаемые типы переменных поддерживаемыми и создать «библиотеку-обертку», которая может быть легко интегрирована с MQL.

Строение обертки FANN (wrapping)

Насколько мне известно, MQL4 не поддерживает функции с переменным числом аргументов и мы должны решить эту проблему. С другой стороны, если C-функция (у которой переменное число аргументов) вызывается с большим числом аргументов, это нормально, так что эту задачу мы можем решить, если укажем соответствующим образом описание импортируемой функции.

Финальная функция для «обертки» выглядит следующим образом.

Мы изменили fann_ на f2M_ (для FANN в MQL), здесь использовано фиксированное число аргументов (4 слоя) и возвращаемое значение — индекс внутреннего массива нейросети типа struct fann, который используется библиотекой FANN.

То же самое и для функции обучения:

И наконец, для уничтожения уже созданной нейросети нужно вызвать функцию:

Для освобождения хендлов нейросетей нужно произвести удаление всех нейросетей в порядке, обратном тому, что был при их создании.

Также можно использовать альтернативный способ — следующую функцию:

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

Сохраненная нейросеть затем может быть загружена (или вернее воссоздана) при помощи функции:

Теперь когда мы знаем основные функции, мы можем попытаться использовать их в наших советниках, но сначала нужно установить библиотеку Fann2MQL.

Установка библиотеки Fann2MQL

Для удобства использования библиотеки я создал программу установки , которая содержит все исходные и скомпилированные библиотеки и файл Fann2MQL.mqh с описанием всех функций библиотеки. Процедура установки довольно проста. Сначала Вы увидите информацию об условиях использования библиотеки Fann2MQL в рамках GPL лицензии:

Установка библиотеки Fann2MQL, шаг 1

Затем выберите папку для установки библиотеки. Вы можете использовать по умолчанию путь Program Files\Fann2MQL\ или установить ее непосредственно в каталог MetaTrader\experts\ . Все файлы будут скопированы в указанную папку, в случае необходимости, вы можете скопировать их вручную куда потребуется.

Установка библиотеки Fann2MQL, шаг 2

Программа установки разместит файлы в следующих папках:

Каталог include\ folder

Каталог libraries\ folder

Каталог src\ folder

Если вы выбрали для установки папку «Fann2MQL», то скопируйте ее содержимое (каталоги include and libraries) в каталог, где размещен MetaTrader. Программа установки также скопирует файлы библиотеки в каталог системных библиотек Windows (как правило, это Windows\system32).

Исходные коды библиотеки Fann2MQL находятся в папке srс. Если вы захотите разобраться в деталях реализации библиотеки, посмотрите исходный код. Также вы можете улучшить код и добавить дополнительные функции, если хотите. Если вы модифицировали исходные коды и реализовали что-нибудь интересное, пожалуйста пришлите мне.

Используем нейронные сети в советнике

Reinforcement learning ), например Q-Learning или нечто подобное.

Вы можете попробовать использовать нейросети как фильтр сигнало в вашего эксперта или комбинировать эти способы вместе, плюс все что хотите. Вы ограничены только вашей фантазией.

Здесь на примере я покажу как можно использовать нейросеть в качестве простейшего фильтра сигналов, создаваемых MACD. Не стоит воспринимать этот эксперт как законченное решение, это всего лишь простейший пример использования библиотеки Fann2MQL. На примере рассмотрения работы эксперта NeuroMACD.mq4 я покажу, как библиотека Fann2MQL может быть эффективно использована в MQL.

Для любого советника сначала объявляются глобальные переменные, определения и секция include. Начало эксперта NeuroMACD.mq4 выглядит следующим образом:

Директива «include» говорит о необходимости загрузки заголовочного файла Fann2MQL.mqh, содержащего описания всех функций библиотки Fann2MQL. После этого все функции библиотеки станут доступными для использования в MQL программе.

Константа ANN_PATH задает путь, в котором хранятся файлы с обученными нейросетями. В данном случае мы должны создать эту папку в корневом каталоге на диске C, т.е C:\ANN.

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

Точка входа любого советника — это его функция init():

Сначала проверяется правильность таймфрейма, на котором работает эксперт (PERIOD_M5).

Переменная AnnInputs содержит число входов нейросети. Поскольку мы будем использовать 3 набора с различными аргументами, оно должно делиться на 3 без остатка. AnnPath задается таким образом, чтобы в ней содержалась информация об имени советника NAME и MagicNumber, который вычисляются как функция входных параметров SlowMA, FastMA и SignalMA, которые в дальнейшем используются при вычислении индикатора MACD.

Поскольку путь AnnPath задан, эксперт пытается загрузить нейронные сети при помощи функции ann_load(), которая будет описана ниже. Половина загруженных нейросетей предназначена для фильтрации длинных позиций, а другая половина для коротких.

Переменная AnnsLoaded используется для учета факта корректной инициализации всех нейросетей. Как вы наверное уже догадались, рассматриваемый нами советник пытается загрузить несколько нейросетей.

Я не уверен в том, что это крайне необходимо, но на всякий случай, для полного использования потенциала библиотеки Fann2MQL, которая параллельно обрабатывает несколько нейросетей, добавлена возможность использования нескольких ядер процессора. Эта возможность реализована с использованием технологии Intel® Threading Building Blocks. Для инициализации данного интерфейса используется функция f2M_parallel_init().

Вот способ, который я использую для инициализации нейросетей:

Как видно, в случае, если вызов f2M_create_from_file() закончился неудачно, о чем свидетельствует отрицательное значение функции, при помощи функции f2M_create_standard() создается нейросеть с аргументами, такими что созданная нейросеть должна иметь 4 слоя (включая входной и выходной слои). AnnInput — это число нейронов во входном слое, AnnInput — это число нейронов в первом скрытом слое, AnnInput/2+1 — число нейронов во втором скрытом слое и 1 нейрон в выходном слое.

Функция f2M_set_act_function_hidden() используется для установки активационной функции нейронов скрытого слоя как SIGMOID_SYMMETRIC_STEPWISE (см. типы активационных функций в документации библиотеки FANN), та же самая активационная функция задается и для нейронов выходного слоя.

Далее идет вызов функции f2m_randomize_weights(), которая используется для инициализации весов связей нейронов внутри сети. Здесь использован диапазон , но вы можете использовать любой другой, в зависимости от вашей задачи.

Как вы уже заметили, я несколько раз использовал функцию debug(). Это один из простейших методов для дополнительной проверки текущего состояния эксперта. Используя это и входной параметр DebugLevel, вы можете настроить вывод отладочных сообщений.

Если первый аргумент level (уровень отладки) в функции debug() выше чем DebugLevel, то функция ничего не выводит. Если же он меньше или равен DebugLevel, то выводится строка text. Если DebugLevel=0, то к выводимой строке добавляется строка «ОШИБКА: «. Таким образом вы можете разделить отладочные сообщения на различные уровни.

Самые важные и вероятные сообщения связаны с ошибками, поэтому им присвоен уровень 0. Они будут выводится пока DebugLevel неотрицательный, мы не рекомендуем устанавливать его отрицательным. При уровне 1 выводится некоторая важная информация, например подтверждения об успешной загрузке нейросети или ее создании. На уровне 2 и выше значимость выводимой информации постепенно уменьшается.

Перед подробным объяснением содержимого функции start() , которая является довольно длинной, я должен показать вам некоторые функции, которые нужны для того, чтобы подготовить входы нейросети и произвести ее запуск :

Функция ann_prepare_input() используется для подготовки входных значений сетей. Хотя ее цель простая, следует отметить, что входные данные должны быть нормализованы надлежащим образом. В данном случае ничего изощренного нет, я просто использовал MACD и значения сигналов, которые никогда не выходят за требуемый диапазон данных. Этот аспект следует принимать во внимание при программировании реальных задач. В реальном примере следует уделять больше внимания этому вопросу.

Как вы уже поняли, самыми важными факторами при работе с нейросетями является выбор надлежащих входных аргументов в качестве входов нейросети, их подготовка и нормализация.

Библиотека Fann2MQL имеет возможность расширения обычной функциональности MetaTrader’а при помощи параллельной обработки нейронных сетей. За это отвечает глобальная переменная Parallel. Функция run_anns() запускает все инициализированные нейросети, снимает с них выходные параметры и помещает их в массив n AnnOutput[]. Функция anns_run_parallel способна выполнять эту работу в многопотоковом режиме. Она вызвает f2m_run_parallel(), в которой первый аргумент — это число нейросетей для обработки, второй аргумент — это массив, содержащий хендлы всех нейросетей которые вы хотите запустить и третий аргумент — это вектор входных данных.

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

Теперь рассмотрим функцию start():

Поскольку код содержит понятные комментарии, я вкратце объясню его работу.

Функция trade_allowed() проверяет, может ли советник торговать. Значение переменной AnnsLoaded указывает, все ли нейросети были инициализованы правильно, затем проверяется таймфрейм и минимальный баланс, а в самом конце проверка условия, заключаещегося в том, что торговля производится только на первом тике нового бара.

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

Значения SellSignal и BuySignal вычисляются в соответствии с сигналами MACD — пересечениями сигнальной и главной линий. Оба сигнала используются для обработки длинных и коротких позиций. Поскольку они симметричны, далее я опишу лишь случай для длинных позиций.

Переменная LongTicket содержит номер тикета текущей открытой длинной позиции. Если он равен -1, то длинных позиций нет, поэтому если устанавлен BuySignal, то это может означать хорошую возможность открытия длинной позиции. Если переменная NeuroFilter не установлена, то просто посылается ордер для покупки и открывается длинная позиция без фильтрации сделок с использованием нейронной сети.

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

Если переменная LongTicket содержит правильный номер тикета, то эксперт проверяет открыта ли в данный момент позиция или она была закрыта при достижении уровней Stop Loss или Take Profit.

Если ордер не закрыт, то ничего не происходит, тем не менее если ордер закрыт, вектор train_output[], имеющий только одно выходное значение, устанавливается в -1 если ордер был закрыт по Stop Loss или 1, если ордер был закрыт с прибылью по Take Profit.

Это значение затем передается функции ann_train(), и все нейросети способны обрабатывать длинные позиции и обучаться на результатах. Поскольку в качестве входного вектора используется массив LongInput, в момент открытия позиции, он содержит значения массива InputVector. Таким образом нейросетью берется сигнал, приводящий к прибыли или убыткам. Когда нейросеть обучена, устанавка NeuroFilter в true приводит к фильтрациям сделок при помощи нейросети. Функция ann_wise_long(), используется нейросетью для вычисления средних значений от результатов всех нейросетей, обрабатывающих длинные позиции. Параметр Delta используется в качестве порогового значения для принятия решения о правильности фильтрованного сигнала. Как и многие другие значения, оно было получено путем оптимизации.

Теперь когда мы знаем как все это работает, я покажу как это может быть использовано. Тестовая пара EURUSD. Я брал исторические данные с одного из брокеров, сконвертированные в таймфрейм M5.

Для обучения и оптимизации использовался период 2007.12.31-2009.01.01(обучаемый набор), тестирование проводилось на периоде 2009.01.01-2009.03.22(тестовый набор). В самом первом запуске я попытался найти наиболее прибыльные значения для аргументов StopLoss, TakeProfit, SlowMA, FastMA и SignalMA, которые я затем реализовал в файле NeuroMACD.mq4.

Переменная NeuroFIlter устанавливалась в false, также как и SaveAnn, переменная AnnsNumber была равна 0 для блокировки работы нейросети.

В процессе оптимизации я использовал генетический алгоритм. С полученными значениями финальный отчет выглядит следующим образом:

Отчет по данным обучения после оптимизации параметров

Как видно, этот советник был запущен на мини-счете с размером лота 0.01 и начальным балансом в 200. Тем не менее вы можете изменить эти параметры в соответствии с настройками счета или собственными предпочтениями.

Теперь у нас есть прибыльные и убыточные сделки, так что можно установить SaveAnn в true, а AnnsNumber задать равным 30. После этого я запустил тестер еще раз. Результаты получились точно такими же, за исключением того, что весь процесс был гораздо более медленный (теперь использовались нейросети), а каталог C:\ANN наполнился обученными нейросетями как показано на рисунке ниже:

Однако перед запуском сначала нужно убедиться в том, что каталог C:\ANN существует.

Содержимое папки C:\\ANN\\.

Мы обучили нейрости и теперь самое время их проверить. Сначала проверим их работу на обучаемом наборе. Изменим NeuroFilter в true и SaveAnn в false и запустим тестер стартегий.

Результаты, которые я получил, приведены ниже. Отметим, что они могут несколько отличаться от тех, которые получите вы, из-за того, что связи между нейронами при инициализации нейросети заполняются случайными значениями (в данном примере я использовал вызов функции f2M_randomize_weights() в функции ann_load()).

Отчет полученный на обучаемом наборе с использованием фильтра сделок на основе нейросети.

Теперь полная прибыль (net profit) стала немного больше (20.03 вместо 16.92), однако profit factor значительно выше (1.25 вместо 1.1). Число сделок гораздо меньше () и среднее число последовательных убыточных сделок сократилось с 7 до 2.

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

Результат, полученный теперь уже на тестовой выборке (период 2009.01.01 — 2009.30.28) приведен ниже:

Результат, полученный на тестовом наборе с использованием нейросетевой фильтрации сделок.

Число заключенных сделок довольно небольшое и сложно сказать о качестве данной стратегии. В данной работе ставилась цель показать применение нейросетей в программах на MQL, а не написание самого лучшего прибыльного советника.

Реальный эффект применения нейросетей в данном случае виден только по сравнению с результатами работы советника на тестовых данных, с использованием (NeuroFilter=true) и без использования (NeuroFilter=false) нейросетевого фильтра.

Результат на тестовом наборе без нейросетевой фильтрации сделок.

Различия очевидны. Как видите, нейросетевая фильтрация превратила убыточного советника в прибыльного!

Выводы

Я надеюсь что эта статья научила вас как можно использовать нейронные сети в терминале MetaTrader.

При помощи простой, бесплатной библиотеки Fann2MQL (доступной в виде исходных кодов) вы можете легко добавлять модуль нейросетей в любой советник и начать писать свой собственные программы, полностью или частично основанные на использовании нейронных сетей.

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

Бывало, процесс оптимизации обучения c подкреплением (Reinforcement Learning) сокращался с примерно 4 дней «всего лишь» до 28 часов на 4-х ядерном процессоре Intel.

В процессе написания данной статьи я решил выложить Fann2MQL на сайте http://fann2mql.wordpress.com/. Там вы можете найти последнюю версию библиотеки Fann2MQL, а также возможно и все ее будущие версии, а также документацию ко всем функциям.

Я обещаю сохранить условия использования библиотеки (GPL лицензия) для всех релизов, так что присылайте мне свои комментарии, предложения по доработке и улучшению и те, которые покажутся интересными, будут в реализованы в следующих релизах.

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

Есть очень много информации про FANN на странице Fast Artificial Neural Network Library: http://leenissen.dk/fann/!

Post Scriptum

После написания этой статьи я обнаружил существенную ошибку в NeuroMACD.mq4. При использовании функции OrderClose () для короткой позиции указывался тикет длинной позиции.

Это привело к перекосу стратегии, заключающемуся в том, что преимущественно удерживались короткие позиции и заключались длинные.

В скорректированной версии скрипта эта ошибка была исправлена и была убрана OrderClose(). Это не привело к существенному изменению общей картины результатов нейросетевой фильтрации, однако форма кривой баланса стала другой. Обе версии прилагаются.

What do you think?

0 points
Upvote Downvote

Total votes: 0

Upvotes: 0

Upvotes percentage: 0.000000%

Downvotes: 0

Downvotes percentage: 0.000000%

Добавить комментарий

Курсы валют на форексе смотреть онлайн

Самый лучший индикатор форекс