Алгоритмическая торговля на Форекс: практическая история для инженеров

Опубликовано: 2022-03-11

Как вы, возможно, знаете, рынок иностранной валюты (Forex или FX) используется для торговли валютными парами. Но вы можете не знать, что это самый ликвидный рынок в мире.

Несколько лет назад, движимый моим любопытством, я сделал свои первые шаги в мире алгоритмической торговли на рынке Форекс, создав демо-счет и проведя симуляции (с фальшивыми деньгами) на торговой платформе Meta Trader 4.

Иллюстрация обложки форекс

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

Мой первый клиент

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

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

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

Роль торговой платформы (в данном случае Meta Trader 4) заключается в обеспечении связи с форекс-брокером. Затем брокер предоставляет платформу с информацией о рынке в режиме реального времени и выполняет ваши заказы на покупку/продажу. Для читателей, незнакомых с торговлей на рынке Форекс, вот информация, предоставленная потоком данных:

На этой диаграмме показаны данные, используемые в алгоритмической торговле на рынке Форекс.

Через Meta Trader 4 вы можете получить доступ ко всем этим данным с помощью внутренних функций, доступных на различных таймфреймах: каждую минуту (M1), каждые пять минут (M5), M15, M30, каждый час (H1), H4, D1, W1, MN. .

Движение Текущей Цены называется тиком . Другими словами, тик — это изменение цены Bid или Ask для валютной пары. Во время активных рынков может быть много тиков в секунду. На медленных рынках могут быть минуты без тика. Тик — это сердцебиение робота валютного рынка.

Когда вы размещаете заказ через такую ​​платформу, вы покупаете или продаете определенный объем определенной валюты. Вы также устанавливаете лимиты стоп-лосс и тейк-профит. Лимит стоп-лосса — это максимальное количество пипсов (колебаний цены), которое вы можете позволить себе потерять, прежде чем отказаться от сделки. Лимит тейк-профита — это количество пунктов, которое вы накопите в свою пользу, прежде чем обналичить деньги.

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

Алгоритмическая торговая спецификация клиента была проста: он хотел форекс-робота на основе двух индикаторов. Для фона индикаторы очень полезны при попытке определить состояние рынка и принять торговые решения, поскольку они основаны на прошлых данных (например, на самом высоком значении цены за последние n дней). Многие из них встроены в Meta Trader 4. Однако индикаторы, которые интересовали моего клиента, были взяты из пользовательской торговой системы.

Они хотели торговать каждый раз, когда два из этих пользовательских индикаторов пересекались, и только под определенным углом.

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

Руки вверх

Запачкав руки, я узнал, что программы MQL4 имеют следующую структуру:

  • [Директивы препроцессора]
  • [Внешние параметры]
  • [Глобальные переменные]
  • [Функция инициализации]
  • [Функция определения]
  • [Начать функцию]
  • [Пользовательские функции]

Функция запуска является сердцем каждой программы MQL4, поскольку она выполняется каждый раз, когда рынок движется (следовательно, эта функция будет выполняться один раз за тик). Это происходит независимо от того, какой таймфрейм вы используете. Например, вы можете работать на таймфрейме H1 (один час), но функция запуска будет выполняться много тысяч раз за таймфрейм.

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

 int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...

Получение значений показателей:

 // Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }

Логика решения, включая пересечение индикаторов и их углов:

 int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }

Отправка заказов:

 void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }

Если вам интересно, вы можете найти полный исполняемый код на GitHub.

Тестирование на истории

После того, как я построил свою алгоритмическую торговую систему, я хотел знать: 1) правильно ли она себя ведет и 2) хороша ли используемая торговая стратегия Forex.

Бэктестинг (иногда пишется как «бэктестинг») — это процесс тестирования конкретной (автоматизированной или нет) системы на событиях прошлого. Другими словами, вы тестируете свою систему, используя прошлое как заменитель настоящего.

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

Сравнив действия программы с историческими ценами, вы поймете, правильно ли она работает.

Индикаторы, которые он выбрал, вместе с логикой принятия решений не были прибыльными.

При тестировании на исторических данных я проверил коэффициент доходности робота FX для некоторых случайных интервалов времени; Само собой разумеется, я знал, что мой клиент на этом не разбогатеет — выбранные им индикаторы вместе с логикой принятия решений не приносили прибыли . В качестве примера приведем результаты запуска программы над окном M15 для 164 операций:

Это результаты работы разработанной мной программы торгового алгоритма.

Обратите внимание, что наш баланс (синяя линия) заканчивается ниже начальной точки.

Одно предостережение: говорить о том, что система «прибыльна» или «убыточна», не всегда правильно. Часто системы являются (не) прибыльными в течение определенного периода времени в зависимости от «настроения» рынка, которое может следовать ряду графических паттернов:

Несколько тенденций в нашем примере с алгоритмической торговлей.

Оптимизация параметров и ее ложь

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

Я провел грубое тестирование, чтобы попытаться сделать вывод о значимости внешних параметров для коэффициента доходности, и получил что-то вроде этого:

Одним из аспектов алгоритма Forex является коэффициент доходности.

Или почистить:

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

Вы можете подумать (как и я), что вам следует использовать параметр А. Но решение не так просто, как может показаться. В частности, обратите внимание на непредсказуемость параметра А: при небольших значениях ошибки его возвращаемая величина резко меняется. Другими словами, параметр А, скорее всего, будет преувеличивать будущие результаты, поскольку любая неопределенность, любое изменение вообще приведет к ухудшению результатов.

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

Единственное, в чем вы можете быть уверены, так это в том, что вы не знаете будущего рынка, и думать, что вы знаете, как рынок будет работать на основе прошлых данных, — ошибка. В свою очередь, вы должны признать эту непредсказуемость в своих прогнозах Forex.

Думать, что вы знаете, как рынок будет работать на основе прошлых данных, — ошибка.

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

Общие соображения по алгоритмической торговле на рынке Форекс

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

Создание собственной системы моделирования валютных курсов — отличный способ узнать больше о торговле на рынке Форекс, а возможности безграничны. Например, вы можете попытаться расшифровать вероятностное распределение колебаний цен как функцию волатильности на одном рынке (например, евро/доллар США) и, возможно, создать имитационную модель Монте-Карло, используя распределение по состоянию волатильности, используя любую степень волатильности. точность, которую вы хотите. Я оставлю это как упражнение для нетерпеливого читателя.

Временами мир Forex может быть ошеломляющим, но я надеюсь, что эта статья дала вам некоторые советы о том, как начать свою собственную торговую стратегию Forex.

Дальнейшее чтение

В настоящее время существует обширный набор инструментов для создания, тестирования и улучшения автоматизации торговой системы: Trading Blox для тестирования, NinjaTrader для торговли, OCaml для программирования и многие другие.

Я много читал о таинственном мире валютного рынка. Вот несколько статей, которые я рекомендую программистам и увлеченным читателям:

  • BabyPips: Это отправная точка, если вы ничего не знаете о торговле на рынке Форекс.
  • «Путь черепахи» Кертиса Фейта. На мой взгляд, это Библия Форекс . Прочтите ее, если у вас есть некоторый опыт торговли и вы знаете некоторые стратегии Форекс.
  • Технический анализ для профессиональных трейдеров — стратегии и методы для сегодняшних турбулентных мировых финансовых рынков, Констанс М. Браун
  • Программирование советников — создание автоматизированных торговых систем на MQL для Meta Trader 4, Эндрю Р. Янг
  • Торговые системы — новый подход к разработке систем и оптимизации портфеля, Урбан Джекл и Эмилио Томасини: Очень технично, очень сосредоточено на тестировании FX.
  • Пошаговая реализация мультиагентной системы торговли валютой, Руи Педро Барбоса и Орландо Бело: очень профессионально описывает, как вы могли бы создать торговую систему и тестовую платформу.