Создаем кроссплатформенный советник-сеточник (Часть II): Сетка в рейндже в направлении тренда

11 июня 2019, 16:00
Roman Klymenko
4
2 533

Введение

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

Как показали тесты, наш сеточник работал в прибыль с 2018 года. Но вот беда, с 2014 по 2018 год это был стабильный слив депозита. Поэтому выставлять его на реальный счет весьма опасно. В этой статье мы попробуем реализовать советник-сеточник по другому принципу, на новой торговой идее.

Вырабатываем торговую систему

Основной идеей советника из первой части данной статьи была надежда на то, что цена чаще всего движется в каком-то определенном направлении. А значит, даже если мы откроем несколько ордеров не в том направлении, то новые ордера, открываемые в нужном направлении, смогут компенсировать убыток по ним. И таким образом, рано или поздно мы достигнем нужной нам прибыли по всем открытым ордерам в целом. Чтобы добиться реализации данной идеи, мы выставляли сетку из N ордеров в Long над текущей ценой, и сетку из такого же количества ордеров под текущей ценой в Sell.

Дальнейшее тестирование показало, что ситуации, когда цена сначала цепляет ордер сверху, потом идет вниз и цепляет ордер снизу, потом опять идет вверх, и цепляет второй, третий ордер сверху, после чего снова идет вниз, цепляя ордера там, и таким образом активирует все или почти все ордера как в Long, так и в Short… В общем, оказалось, что такие ситуации бывают, и бывают достаточно часто, чтобы свести возможную прибыль на нет. Поэтому строить на этом торговую систему — не самый лучший способ заработать деньги.

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

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

А во-вторых, выставленную ранее сетку мы будем постоянно дополнять новыми лимитными ордерами в случае, если текущая цена отошла от той, что была ранее. При этом лимитные ордера, от которых цена отошла слишком далеко, будут удаляться. То есть, если цена отошла на 1 шаг сетки вверх, то мы добавим новый лимитный ордер в Long в конец текущей сетки над ценой, еще один лимитный ордер мы добавим в Short первым под текущую цену, и при этом удалим последний из лимитных ордеров в Short под текущей ценой. Таким образом, наша сетка будет следовать за ценой актива.

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

Звучит вроде хорошо. Давайте попробуем проверить, что у нас получится на практике.

Создаем базовую версию советника

В отличие от первой статьи, в этой статье мы не будем рассматривать исходный код советника. Как исходный код советника, так и скомпилированный советник для MetaTrader 4 и MetaTrader 5, будут прикреплены к статье. При желании вы сможете посмотреть как все реализовано. Ну а в данной статье мы займемся построением алгоритма, рассуждениями и, конечно, тестами.

Расстояние между ордерами сетки.

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

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

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

При положительном значении данный параметр указывает разряд после запятой, в котором будут выставляться ордера сетки. Например, значение 2 означает, что сетка будет выставляться на каждом 1/100 шага цены. Например, если текущая цена 1.1234, то сетка в Long будет ставиться на ценах 1.13, 1.14, 1.15, …, а сетка в Short на ценах 1.11, 1.10, 1.09, …. То есть, на 4 и 5-значных инструментах, к которым относятся большинство валютных пар рынка Forex, расстояние между ордерами сетки будет равно 100 пунктов.

При той же цене, но разряде 3, сетка будет в 3 знаке после запятой:

  • в Long: 1.124, 1.125, 1.126, 1.127, …;
  • в Short: 1.122, 1.121, 1.12, 1.119, ….

Получается расстояние между ордерами в 10 пунктов. Если значение параметра равно 0, то сетка будет выставляться с шагом 1. Например, на ценах 111, 112, 113, 114.

Отрицательные значения также поддерживаются данным параметром. Они сдвигают разряд влево от точки. То есть, при значении -1 сетка будет выставляться с шагом 10, а при значении -2: с шагом 100.

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

Среди параметров советника есть еще один параметр, который влияет на шаг сетки — "Смещение, пунктов". Он позволяет сместить шаг сетки с круглой цены на указанное количество пунктов. Например, при разряде 2 и смещении 1 сетка будет выставляться не на ценах 1.12, 1.13, 1.14, а на ценах 1.121, 1.131, 1.141, если это ордера в Long над текущей ценой, и ценах 1.119, 1.129, 1.139, если это ордера в Short под текущей ценой. Таким образом мы можем еще сильнее прикрыться круглыми ценами, надеясь, что при неблагоприятном для нас исходе цена не зацепит лимитный ордер перед тем, как пойдет в обратную сторону.

Что касается пункта "Смещение, пунктов", тестирование показало, что его использование не всегда приводит к положительному результату.

Основные параметры советника.

Помимо двух рассмотренных выше параметров советник имеет множество других:

Параметры советника

Среди этих параметров наиболее важные для работы советника следующие:

  • "Размер лота". Куда же без данного параметра. Он определяет объем лота, используемый при выставлении каждого лимитного ордера.
  • "Макс. кол-во лимитных ордеров в одну сторону". Данный параметр определяет количество лимитных ордеров в сетке с одной стороны от цены. То есть, всего сетка будет состоять из удвоенного значения данного параметра. Как только цена будет продвигаться в одно из направлений сетки, переводя лимитные ордера в открытые позиции, советник будет открывать новые лимитные ордера (и закрывать те, которые теперь находятся слишком далеко от цены), чтобы общее их количество с каждой стороны от цены соответствовало данному параметру. Точнее, новые лимитные ордера будут выставляться при наступлении нового бара таймфрейма, на котором запущен советник.
  • "Тейк для ордеров". Определяет тейк для каждого отдельного лимитного ордера, и указывается в шагах сетки советника. То есть, например, значение 2 данного параметра говорит о том, что позиция будет закрыта, когда цена пройдет в ее сторону два следующих лимитных ордера сетки. Если параметр Разряд для лимитных ордеров равен 3, то фактически тейк будет установлен на расстоянии в 0.002 от текущей цены (20 пунктов прибыли).
  • "Стоп для ордеров". Определяет стоп лосс для каждого отдельного лимитного ордера, также в шагах сетки советника. Как показали тесты, выставление стоп лоссов любого размера в данном типе советника сеточника неэффективно, поэтому мы их использовать не будем.

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

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

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

Большой размер тейка также дает преимущество:

  • при больших трендовых движениях цены, общая прибыль будет больше, если использовать большие тейки.

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

Закрытие всех позиций. Помимо тейка для отдельных ордеров сетки, вы можете использовать ряд других параметров, которые позволяют закрыть все открытые позиции при наступлении определенных событий. Все эти параметры объединены в отдельную группу "Закрытие всех позиций":

  • "При прибыли, $". Закрыть все открытые позиции, если общая прибыль по ним достигла указанной суммы в долларах.
  • "При увеличении equity на, $". Закрыть все открытые позиции, если equity сейчас больше на указанное количество долларов, чем оно было при открытии начальной сетки. Если вообще использовать закрытие всех позиций, то этот вариант более предпочтителен.
  • "Закрыть все при цене более". Данный параметр является защитным, и позволяет закрыть все открытые позиции, если цена вышла из торгуемого вами диапазона вверх. В нем нужно указать цену, выше которой все открытые позиции должны быть закрыты.
  • "Закрыть все при цене менее". Данный параметр является защитным, и позволяет закрыть все открытые позиции, если цена вышла из торгуемого вами диапазона вниз.

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

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

Инструменты для тестирования

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

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

Для этого мы будем выставлять лимитные ордера над текущей ценой и под текущей ценой. Ордера будут расположены на одинаковом расстоянии друг от друга. Над ценой мы будем выставлять ордера в Long, предполагая, что если цена идет вверх, то и далее она будет идти вверх. Соответственно, под ценой будут располагаться ордера в Short.

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

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

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

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

Например, посмотрите на график инструмента AUDCAD:

Месячный график AUDCAD

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

Итак, тестировать советник мы будем на следующих символах: EURUSD, AUDUSD, AUDCAD. При этом, для всех инструментов мы будем тестировать шаг сетки в 10 пунктов (разряд 3). Можно конечно попробовать торговать и на большем шаге в 100 пунктов (разряд 2), но это уже будет долгосрочная торговля с небольшим количество сделок за год.

Период тестирования.

В данной статье нас не интересуют периоды менее 1 года. Для тестов мы будем ориентироваться на период в 4 лет: с 2015 по 2019 год. И, соответственно, искать наиболее прибыльные настройки именно для данного периода. Скажу сразу, что советник не проходит тестирования на периодах более 10 лет, либо проходит с небольшой прибыльностью на небольших уровнях тейка. Поэтому использовать его в виде "поставил и забыл на десяток лет" не получится.

Тестируем EURUSD, шаг 10 пунктов (разряд 3)

Итак, начнем тестирование с проверки базовой идеи торговой стратегии. Все параметры установлены по умолчанию. В том числе, уже рассмотренные нами параметры:

  • стоп лосс не ставится;
  • закрытие всех позиций по условию не выполняется.

Оптимизация будет проводиться по тейку для отдельного ордера, а также по параметру "Смещение, пунктов". Метод оптимизации — OHLC на M1. После чего финальный результат будет протестирован по методу "Все тики". Отчеты по всем тестам приаттачены к статье.

В общем, по результатам тестов лучше всего показал себя тейк 2, и смещение в 1 пункт:

Первый тест на EURUSD

Наиболее важные для нас результаты тестирования:

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 EURUSD
 23 522
 20 641
 0.88
 1.39
 40 536

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

Фактически, фактор восстановления показывает отношение прибыли к максимальной просадке (прибыль разделить на максимальную просадку). Если его значение меньше 1, значит мы заработали меньше, чем была просадка, которую советник допустил.

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

Не размещать самые ближние ордера.

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

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

Второй тест по инструменту EURUSD, разряд 3

На глаз различия не особо заметны. Может в результатах теста мы увидим изменения:

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 EURUSD
 12 987
 15 302
 1.18
 1.64
 21 350

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

Таким же образом данный параметр действует и на других инструментах при разряде 3 (расстоянии между ордерами сетки в 10 пунктов). Он позволяет снизить количество трейдов за счет того, что небольшие коррекции в движении цены не доходят до нашей сетки. Если в данный момент цена находится в тренде, то это очень хорошо. Но если мы находимся в боковом движении, и в будущем цена бы все равно вернулась к открытом ранее ордеру, то использование данного параметра приводит к снижении возможной прибыли.

Вход в сторону движения бара.

Продолжаем улучшать наш советник. Практически все гуру трейдинга нам советуют торговать только в сторону локального тренда. Как определить данный тренд? Все просто, если на предыдущем баре цена шла вверх, то и торговать нужно только в Long. И наоборот.

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

Итак, для настройки торговли в сторону движения бара мы будем использовать параметры советника из группы "В направлении бара":

  • "Использовать вход по бару". Установите в true, чтобы включить данную возможность.
  • "Тип учета бара". Я пробовал либо вообще не входить против бара, либо входить с минимальным тейком. Вариант с минимальным тейком всегда был хуже, поэтому по умолчанию значение данного параметра равно Не входить, и менять его не рекомендуется.
  • "Номер бара". В некоторых торговых системах локальный тренд советуют определять не только по предыдущему бару, но и по сегодняшнему. То есть, если цена вчера шла вверх и сегодняшний бар бычий, то входим только в Long. Проверим и такой вариант. Данный параметр имеет следующие значения: бар 1 (проверять только предыдущий бар), бар 0 (проверять только текущий бар), бары 0 и 1 (и предыдущий и текущий бары должны идти в одну сторону). В результате тестов выяснилось, что результаты при варианте бар 1 всегда лучше. Так что значение данного параметра также не рекомендуется менять.
  • "Таймфрейм". Позволяет выбрать таймфрейм, бары на котором будут проверяться.

После тестирования входа по бару на различных таймфреймах, выяснилось, что для EURUSD лучше всего подходит месячный таймфрейм:

Тестирование входа по бару на EURUSD

Результаты тестирования в виде таблицы:

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 EURUSD
 13 044
 19 227
 1.48
 1.8
 23 445

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

Торговля в диапазоне. Как указано в названии статьи, данный советник предназначен для торговли в диапазоне. А следовательно, если цена на недельном или месячном графике находится в каком-то диапазоне, то и результаты его торговли должны быть лучше. Проверим эту гипотезу, выставив диапазон для торговли. Для этого нам пригодятся параметры "Не открывать Long при цене менее", "Не открывать Long при цене более", "Не открывать Short при цене менее" и "Не открывать Short при цене более".

На глаз выставим для параметров "Не открывать Long при цене более" и "Не открывать Short при цене более" значение 1.17849. А для двух оставшихся параметров значение 1.09314:

Торговля в диапазоне по EURUSD

Невооруженным глазом можно заметить, что наши результаты улучшились:

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 EURUSD
 2 412
 10 964
 4.55
 6.16
 6 974

Закрывать все позиции при увеличении equity.

В начале статьи была описана группа параметров "Закрытие всех позиций". Среди них был параметр "При увеличении equity на, $". Если рассуждать логически, то данный параметр должен улучшить наши результаты. Ведь с его помощью можно закрыть все убыточные позиции, открытые в данный момент. И, так сказать, начать торговлю с чистого листа. Для этого достаточно лишь дождаться, когда цена войдет в рейндж, и equity нашего счета увеличится на указанную величину. А как уверяют гуру трейдинга, 70% своего времени цена движется в рейндже.

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

Тем не менее, в нашем случае параметр "При увеличении equity на, $" действительно позволяет улучшить результаты. Лучше всего показало себя значение в 2 000$:

Тестирование закрытия всех позиции при увеличении equity на EURUSD

И сами результаты тестирования:
Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 EURUSD
 3 200
 18 532
 5.79
 3.8
 6 954

Это последний тест по EURUSD, поэтому давайте подведем итоги. Нам все-таки удалось добиться прибыльности даже не 100% в год, а почти 150%. При этом мы использовали фиксированный лот. То есть, если увеличивать лот при увеличении баланса по счету, то можно получить в разы больше прибыли.

Тем не менее, результаты не впечатляющие. Все, чего мы добились, это 150% в год при практически 100% просадке. Большинство инвесторов требуют, чтобы просадка была не более 20% от депозита. С моей точки зрения это странное требование. Получается, что 80% баланса будет просто простаивать? Если уж они просто простаивают, то положите их на депозит, а торгуйте по полной на оставшиеся 20%. Но тем не менее, такое требование есть, а значит нам придется снизить наши объемы торговли в 5 раз, чтобы держаться в пределах просадки 20%. Следовательно и прибыль будет не 150%, а 30% в год. Совсем не впечатляющие результаты.

Но от лирики давайте перейдем к тестированию других инструментов.

Результаты тестирования. Как уже говорилось, все отчеты каждого промежуточного тестирования прикреплены к статье. Также к статье прикреплены SET-файлы финального тестирования как по символу EURUSD, так и по другим рассмотренным символам.

Тестируем AUDUSD, шаг 10 пунктов (разряд 3)

Начнем тестирования AUDUSD также с базовых настроек:

  • стоп лосс не ставится;
  • закрытие всех позиций по условию не выполняется.

Оптимизация проводилась по тейку для отдельного ордера, а также по параметру "Смещение, пунктов". В результате лучше всего показал себя тейк 3 и смещение 0:

Базовое тестирование на AUDUSD
Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDUSD
 21 468
 -546
 -0.03
 0.99
 18 104

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

Не размещать ближайшие ордера, AUDUSD

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDUSD
 14 701
 14 415
 0.98
 1.54
 15 049

Вход в сторону движения бара.

Уже немножко лучше. Попробуем протестировать вход по предыдущему бару на различных таймфреймах:

В сторону дневного бара, AUDUSD

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDUSD
 9 186
 8 364
 0.91
 1.56
 8 573

Торговля в диапазоне

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

В рамках диапазона, AUDUSD

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDUSD
 6 769  11 937
 1.76
 2.35
 7 591

Закрывать все позиции при увеличении equity.

Ожидаемо результаты улучшились. Фактор восстановления увеличился практически в 2 раза. И, наконец, протестируем закрытие всех позиций при увеличении equity:

Закрывать позиции при увеличении equity, AUDUSD

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDUSD
 4 270
 8 552
 2
 1.74
 7 593

Если закрывать позиции при увеличении equity на 1 000, то можно увеличить фактор восстановления до 2. Для финального результата это совсем небольшая прибыль. Но может AUDCAD нас сможет чем-то порадовать...

Тестируем AUDCAD, шаг 10 пунктов (разряд 3)

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

Базовое тестирование показало лучшие результаты при тейке 4 и смещении 0:

Базовое тестирование AUDCAD
Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDCAD
 8 216
 16 149
 1.97
 1.53
 17 852

Макс. ордеров по одной цене.

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

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

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

В предыдущих случаях мы не рассматривали параметр "Макс. ордеров по одной цене", так как открытие неограниченного количества позиций по одной и той же цене позволяло увеличить прибыльность советника. Но с AUDCAD все по-другому. Возможно, это связано с характером движения цены данного инструмента, но если не разрешать выставление лимитных ордеров на тех ценах, по которым уже открыты позиции, то результат получается лучше. То есть, установим параметру "Макс. ордеров по одной цене" значение 1: 

Не выставлять ордера если на уровне уже есть позиции, AUDCAD

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDCAD
 5 896
 18 087
 3.07
 2.63  10 821

Не размещать самые ближние ордера.

Мы смогли увеличить фактор восстановления более чем в 1.5 раза. Теперь вернемся на протоптанную дорожку и протестируем включение параметра "Не размещать самые ближние ордера":

Не размещать самые ближние ордера, AUDCAD
Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDCAD
 5 656
 13 692
 2.42
 2.61
 8 306

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

Вход в сторону движения бара.

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

Вход по дневному бару, AUDCAD

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDCAD
 3 857
 8 848
 2.29
 2.58
 5 487

Однако даже на нем наши результаты ухудшились еще сильнее.

Торговля в диапазоне.

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

Торговля в диапазоне, AUDCAD

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDCAD
 2 684
 9 692
 3.61
 3.33
 5 224

Диапазон в который раз нас не подвел и немного улучшил результаты.

Закрывать все позиции при увеличении equity.

И последний вариант оптимизации из стандартного набора:

Закрывать все позиции при увеличении equity, AUDCAD

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Прибыльность  Трейдов
 AUDCAD
 2 818
 6 022
 2.14
 1.74
 5 479
Даже при лучшем результате (закрывать при equity 1 000 долларов) мы скатились к фактору восстановления, близкому к результатам начального теста.

Альтернативное тестирование. Давайте попробуем отбросить параметры, использование которых приводило к ухудшению фактора восстановления, и провести тестирование без них. То есть, отключим "Не размещать самые ближние ордера", вход в сторону движения бара и не будем закрывать все позиции при увеличении equity:

Альтернативное тестирование AUDCAD

Символ 
 Макс. просадка
Прибыль 
 Фактор восстановления
 Прибыльность  Трейдов
 AUDCAD
 5 124
 19 121
 3.73
 3.17
 10 301

Результат стал лучше, но не намного. Итого примерно 100% прибыли в год.

Что делать при выходе из диапазона

После всех тестов мы добились каких-то результатов. Нельзя сказать, что это хорошие результаты. Но это прибыль. Тем не менее, эта прибыль весьма обманчива.

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

Один из вариантов — это закрытие всех позиций. В теории хороший вариант. Но на практике это будет означать либо потерю всей прибыли, либо потерю большей её части. И, как назло, обязательно на следующий день цена начнет разворачиваться.

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

При этом могут пройти годы. Но тем не менее рано или поздно цена вернется.

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

Другие параметры советника

Ранее в статье были рассмотрены только те параметры советника, использование которых может повысить его прибыльность. За каждым таким параметром стоит какая-то идея. И идей, которые были протестированы при разработке советника, было гораздо больше. К сожалению, большинство из них только ухудшали показатели советника. Поэтому код, реализующий их, был либо вообще удален, либо параметры, которые управляют идеей, были помечены дефисом в начале своего названия.

Сейчас мы в вкратце рассмотрим такие параметры, однако как показали тесты, изменение их значений ни к чему хорошему не приведет.

Тип лимитных ордеров. По умолчанию советник выставляет ордера в Long над текущей ценой и ордера в Short под текущей ценой. Называются такие ордера Buy Stop и Sell Stop. Исходя из этого, по умолчанию значение данного параметра равно STOP.

Если присвоить данному параметру значение LIMIT, то советник будет использовать Buy Limit и Sell Limit ордера. То есть, его поведение кардинально изменится: над ценой он будет выставлять Sell ордера, а под ценой - Buy ордера.

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

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

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

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

Заключение

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

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

В следующей статье мы рассмотрим последний вариант советников-сеточников. Как обычно, это будет кроссплатформенный советник. И он способен показать следующие результаты на периоде с 2010 по 2019 годы на фиксированном лоте:

Символ
 Макс. просадка
Прибыль
 Фактор восстановления
 Трейдов
 USDCAD
 953
 7 328
 7.69
 3 388
 NZDUSD  1 404
 11 288
 8.04  2 795
 SBUX (c 2013 по 2019 год)
 140  1 890
 13.5  442

Прикрепленные файлы |
trendmeEA.ex5 (156.87 KB)
trendmeEA.mq5 (141.25 KB)
trendmeEA.ex4 (66.98 KB)
trendmeEA.mq4 (141.25 KB)
SET_files.zip (25.38 KB)
fxsaber
fxsaber | 11 июн 2019 в 16:29

Сделал замену

и прописал в начало

#include <MT4Orders.mqh>


По итогу все заработало в MT5. Стоит ли тогда трудов написание половины кроссплатформенного кода, которую можно не использовать?

Aleksandr Klapatyuk
Aleksandr Klapatyuk | 11 июн 2019 в 16:36

Большое Спасибо ! Автор: Roman Klymenko

За его труд.

Всё отлично работает Спасибо! Здоровья и Всех благ!

Andrey Lutsik
Andrey Lutsik | 20 июн 2019 в 18:11

Спасибо большое, Роман!

Давно искал советник по данной стратегии!

Не могли бы Вы ещё такой баг кнопки подправить: 

Всего наилучшего!
liojel
liojel | 13 авг 2019 в 05:59
Отличный друг, я надеюсь увидеть следующую часть в ближайшее время. Поздравляю.
Библиотека для простого и быстрого создания программ для MetaTrader (Часть XII): Класс объекта "аккаунт", коллекция объектов-аккаунтов Библиотека для простого и быстрого создания программ для MetaTrader (Часть XII): Класс объекта "аккаунт", коллекция объектов-аккаунтов

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

Методы измерения скорости движения цены Методы измерения скорости движения цены

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

Библиотека для простого и быстрого создания программ для MetaTrader (Часть XIII): События объекта "аккаунт" Библиотека для простого и быстрого создания программ для MetaTrader (Часть XIII): События объекта "аккаунт"

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

Грокаем "память" рынка через дифференцирование и энтропийный анализ Грокаем "память" рынка через дифференцирование и энтропийный анализ

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