preview
Опыт разработки торговой стратегии

Опыт разработки торговой стратегии

MetaTrader 5Трейдинг | 16 марта 2024, 15:21
1 347 0
Aleksej Poljakov
Aleksej Poljakov

Введение

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

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

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

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

Главное требование к параметрам торговой стратегии — их логичность и отсутствие внутренних противоречий. Допустим, что трейдер решил использовать какой-либо способ управления капиталом. После чего, решил добавить в состав своей стратегии трейлинг-стоп. Эти два элемента будут противоречить друг другу. Управление капиталом предусматривает установку заранее определенных стоп-лосса и тейк-профита. А трейлинг-стоп может закрыть позицию до того, как цена достигнет тейк-профита и полученная прибыль будет меньше предполагаемой. Чтобы разрешить это противоречие трейдеру придется либо использовать фиксированный объем позиций, либо отказаться от трейлинг-стопа.

Любая торговая стратегия должна быть построена на основе какого-то статистического преимущества. Причем, это преимущество должно существовать в течение долгого времени.

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


Простая стратегия

Самой простой торговой стратегией является стратегия, основанная на одной простой скользящей средней. Ее суть очень проста — цена пересекает линию индикатора, и в этот момент открывается позиция. Тип позиции зависит от того в какую сторону произошло пересечение: если цена двигалась снизу вверх – Buy, сверху вниз – Sell. 

Давайте посмотрим на эту стратегию внимательнее. Сначала попробуем ответить на вопрос, что такое пересечение с точки зрения математики. По сути, это отслеживание знака разности:

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

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

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

Но просто разности нам не интересны. Нам интересно, как часто встречается эта разность на данном символе и таймфрейме. Я взял валютную пару EURUSD, таймфрейм H1. Вот так выглядит статистика при N=24.

Вам нравится эта картинка? Если вы ответили на этот вопрос – «фу, я и красивше видел», то вы не трейдер. Настоящий трейдер будет восхищен этой картинкой. Первое, что понравится трейдеру – асимметрия. Второе – распределение разностей не похоже на равномерное.

Давайте немного передохнем. Какие кошмары снятся по вашему мнению обычным людям? Я предполагаю, что это какие-нибудь вампиры, оборотни, ходячие мертвецы в конце концов. А знаете, что является самым ужасным для трейдера? – Равномерное распределение.

Представьте, что я предлагаю вам игру – выпадает решка, я плачу вам какую-то сумму; выпадает орел – вы платите мне. И вот, мы с азартом подбрасываем монету, и… толка в этой игре нет никакого. Монета честная – орел и решка в среднем выпадают одинаково часто (равномерно). И поэтому на этой игре ни вы, ни я не разбогатеем. Выход из этой ситуации один – нужно сломать монету так, чтобы какая-то сторона выпадала чаще.  Эта поломка позволит нам уйти от равномерного распределения и добиться изменения в прибыли, кто-то из нас начнет выигрывать чаще.

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

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

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

Как это можно реализовать на практике. Вначале мы собираем значения разностей на истории. Устанавливаем какой-то порог срабатывания – например, я возьму по 15% самых больших и самых маленьких значений. Если текущая разность меньше нижнего порога, то я открываю позицию Buy. Если текущая разность выше верхнего порога, то я открываю позицию Sell.

Закрытие позиций будет происходить по такому же принципу, но пороги срабатывания я установил в 45% (немного не доходя до медианы, уровень медианы равен 50%). Если разность выше нижнего порога, то закрываем позиции Buy. Если разность ниже верхнего порога, то закрываются позиции Sell.

Правила торговой стратегии нам ясны. Давайте посмотрим, как она поведет себя в тестере. Я выбрал символ EURUSD, таймфрейм H1, интервал тестирования с 01.01.2023 по 31.12.2023. Параметры советника по умолчанию.

Вот так выглядит кривая баланса.

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

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


Стратегия чуть сложнее

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

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

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

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

Filter Tot. Net Prof. Gross Profit Gross Loss Profit Factor Expected Payoff Recovery Factor Sharpe Ratio Z-Score
false 1 670.84 2 039.73 -368.89 5.53 4.49 1.78 2.91 -17.52
true 379.20 607.75 -228.55 2.66 2.92 0.92 1.95 -10.26

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


Сложность растет

Использование двух SMA мы с вами рассмотрели. А можно ли использовать три средних? Да, можно. Я скажу больше – в одной стратегии можно использовать сколько угодно средних. Давайте посмотрим, как это можно реализовать на практике.

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

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

Например, разность 1-го порядка равна k1-k2.

Из нее мы можем получить разность 2-го порядка: (k1-k2)-(k2-k3)=k1-2*k2+k3.

Действуя аналогично, мы получим разность 3-го порядка: (k1-2*k2+k3)-(k2-2*k3+k4)=k1-3*k2+3*k3-k4. И т.д.

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

Для примера я взял три SMA. К ним применяются коэффициенты разности 2-го порядка. Т.е. все расчеты будут выполняться по формуле:

Результат трейдинга такой стратегии зависит уже от трех параметров. Изменение периода даже одной SMA может существенно повлиять на результат. Пример работы такой стратегии выглядит так.

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


Новый уровень сложности

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

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

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

А вот с индикатором EMA могут возникнуть небольшие трудности. Во-первых, при экспоненциальном сглаживании для расчета коэффициентов используется геометрическая прогрессия с начальным коэффициентом, лежащим в пределах 0…1. Во-вторых, период EMA, вообще говоря, бесконечен. Для перфекционистов - период EMA равен количеству отсчетов цены, которые успел обработать индикатор.

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

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

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

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

Коэффициенты LWMA получаются из арифметической прогрессии с шагом равным 1. По сути, EMA и LWMA представляют собой разные модели «забывания» прошлых данных. При этом, EMA забывает быстрее, чем LWMA.

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

А вот тут нам нужно продумать суть нашей торговой стратегии. Каждый из четырех осцилляторов может выдать только один из четырех возможных сигналов:

  • Открыть позицию Buy;

  • Открыть позицию Sell;

  • Закрыть позицию Buy;

  • Закрыть позицию Sell.

Есть еще пятый сигнал – ничего не делать, но он включен по умолчанию, поэтому мы его не считаем.

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

  • SMA дает сигнал на открытие позиций Buy;

  • EMA – закрытие позиций Sell;

  • SMMA – открытие позиций Sell;

  • LWMA – закрытие позиций Buy.

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

Пусть, N – общее число индикаторов. Тогда минимальное количество индикаторов, которые должны дать один и тот же сигнал, можно рассчитать по формуле:

У нас всего имеется четыре индикатора. Значит, трейдер может предпринимать какие-либо действия только в том случае, если один и тот же сигнал поступит минимум от трех индикаторов.

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

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

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

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

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

Пусть, N – общий объем выборки, а f[i] – частоты каждого i-го значения индикатора. Тогда эмпирическую функцию распределения можно найти по формуле:

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

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

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

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

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

  • открытие позиций Buy разрешено только тогда, когда итоговая вероятность начинает расти;

  • открытие позиций Sell допускается только тогда, когда вероятность начинает снижаться.

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

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

Мы рассмотрели возможность создания торговой стратегии на нескольких несвязанных индикаторах. Главная особенность такого подхода – все индикаторы должны быть максимально непохожи друг на друга. Например, если мы возьмем SMA и SMMA с периодами равными 2, то их коэффициенты будут равны. По сути, мы получим две копии одного и того же индикатора. Этого допускать нельзя, т.к. произойдет смещение сигналов, и стратегия будет работать неправильно.


Повышаем уровень сложности

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

Классический CCI рассчитывается просто – разность между ценой и скользящей средней нормализуется по стандартному отклонению.

При таком подходе получить целые числа для сбора статистики несколько затруднительно. Поэтому мы внесем небольшие изменения в этот индикатор. Вместо SMA и StDev мы будем использовать медианы цены и абсолютных отклонений.

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

Алгоритм наших действий будет таким. Сначала мы возьмем необходимое количество цен и найдем их медиану. Из-за особенностей нашего подхода количество цен должно быть нечетным – только в этом случае мы сможем получить целое число. Далее мы найдем разность между текущей ценой и медианой – это будет первая статистика. Я обрезал самое часто встречающееся значение, чтобы особенности графика были видны лучше.

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

Распределения получились очень красивыми – асимметрия и никакого намека на равномерность. Давайте посмотрим, помогут ли они нам в трейдинге.

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

Статистика по стандартному отклонению будет использоваться в качестве фильтра. Большое отклонение может указывать на какие-то сильные движения на рынке. И в эти моменты мы запретим открытие позиций.

Давайте посмотрим является ли такая стратегия работоспособной.

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

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

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


Заключение

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


При написании статьи использовались следующие программы.

название тип особенности
scr SMA1 скрипт рассчитывает и выводит распределение разностей между ценой и SMA
  • iPeriod - период SMA
EA SMA1 эксперт осуществляет торговлю по стратегии цена - SMA
  • iPeriod - период SMA
  • LvlOpen - уровень при достижении которого происходит открытие позиций
  • LvlClose - уровень закрытия позиций
EA SMA2 эксперт
торгует по стратегии двух SMA
  • PeriodM и PeriodN - периоды SMA
  • Filter - фильтр по SMA
EA SMA3 эксперт осуществляет торговлю по трем SMA
EA Byzantine Generals эксперт торгует по четырем индикаторам, сигналы генерируются в соответствии с задачей о византийских генералах
EA NBC эксперт торгует по четырем индикаторам, сигналы рассчитываются байесовским методом
scr CCI скрипт собирает статистику по индикатору CCI
EA CCI эксперт торгует по статистике индикатора CCI
  • LvlStDev - уровень отсечки по стандартному отклонению
  • Filter - неотрицательное число задает индекс цены, которая должна совпасть с медианой


Прикрепленные файлы |
scr_SMA1.mq5 (5.28 KB)
EA_SMA1.mq5 (4.52 KB)
EA_SMA2.mq5 (5.15 KB)
EA_SMA3.mq5 (5.71 KB)
EA_NBC.mq5 (7.07 KB)
scr_CCI.mq5 (3.14 KB)
EA_CCI.mq5 (5.69 KB)
Популяционные алгоритмы оптимизации: Алгоритм оптимизации китов (Whale Optimization Algorithm, WOA) Популяционные алгоритмы оптимизации: Алгоритм оптимизации китов (Whale Optimization Algorithm, WOA)
Алгоритм оптимизации китов (WOA) - это метаэвристический алгоритм, вдохновленный поведением и охотничьими стратегиями горбатых китов. Основная идея WOA заключается в имитации так называемого "пузырькового сетевого" метода кормления, при котором киты создают пузыри вокруг добычи, чтобы затем нападать на нее в спиральном движении.
Нейросети — это просто (Часть 81): Анализ динамики данных с учетом контекста (CCMR) Нейросети — это просто (Часть 81): Анализ динамики данных с учетом контекста (CCMR)
В предыдущих работах мы всегда оценивали текущее состояния окружающей среды. При этом динамика изменения показателей, как таковая, всегда оставалась "за кадром". В данной статье я хочу познакомить Вас с алгоритмом, который позволяет оценить непосредственное изменение данных между 2 последовательными состояниями окружающей среды.
Комбинаторно-симметричная перекрестная проверка в MQL5 Комбинаторно-симметричная перекрестная проверка в MQL5
В статье показана реализация комбинаторно-симметричной перекрестной проверки на чистом MQL5 для измерения степени подгонки после оптимизации стратегии с использованием медленного полного алгоритма тестера стратегий.
Машинное обучение и Data Science (Часть 15): SVM — полезный инструмент в арсенале трейдера Машинное обучение и Data Science (Часть 15): SVM — полезный инструмент в арсенале трейдера
В этой статье мы разберем, какую роль метод опорных векторов (Support Vector Machines, SVM) играет в формировании будущего трейдинга. Статью можно рассматривать как подробное руководством, которое рассказывает, как с помощью SVM улучшить торговые стратегии, оптимизировать процесс принятия решений и открыть новые возможности на финансовых рынках. Вы погрузитесь в мир SVM через реальные приложения, пошаговые инструкции и экспертные оценки. Возможно, этот незаменимый инструмент поможет разобраться в сложностях современной торговли. В любом случае SVM станет очень полезным инструментом в арсенале каждого трейдера.