Вспомогательные индикаторы

Лучшие брокеры бинарных опционов за 2020 год, народный рейтинг:
  • Бинариум
    Бинариум

    1 место! Лидер среди всех бинарных платформ.
    Лучший выбор для новичков и малоопытных трейдеров!
    Бесплатное обучение трейдингу и демо счет на любую валюту!
    Получите свой бонус за регистрацию в Бинариуме:

Уменьшаем расход памяти на вспомогательные индикаторы

1. В чем проблема

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

Например, всем известный индикатор MACD использует две копии индикатора EMA (Exponential Moving Average), вычисляя разницу между их значениями:

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

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

Более того, эти расходы возрастают еще в разы, если:

  • этот индикатор мультитаймфреймовый (например, отслеживает совпадение волн на нескольких ТФ), на каждый ТФ ему приходится создать отдельные копии вспомогательных индикаторов;
  • этот индикатор мультивалютный;
  • трейдер с помощью этого индикатора торгует на нескольких валютных парах (знаю трейдеров, у которых количество одновременно торгуемых пар переваливает за два десятка).

Сочетание этих условий способно приводить к элементарной нехватке оперативной памяти на компьютере (знаю реальные случаи, когда из-за подобных индикаторов терминал требовал гигабайты памяти). В MetaTrader нехватка памяти выглядит так:

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

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

Список лучших платформ для торговли бинарными опционами:
  • Бинариум
    Бинариум

    1 место! Лидер среди всех бинарных платформ.
    Лучший выбор для новичков и малоопытных трейдеров!
    Бесплатное обучение трейдингу и демо счет на любую валюту!
    Получите свой бонус за регистрацию в Бинариуме:

2. Тестовый составной индикатор

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

Пусть это будет индикатор, ловящий зарождения трендов. Он будет суммировать сигналы сразу с 5 таймфреймов, например: H4, H1, M15, M5, M1. Это позволит ему ловить резонанс больших и маленьких зарождающихся трендов, что должно повысить надежность прогноза. В качестве источников сигналов на каждом таймфрейме будут выступать индикаторы Ichimoku и Price_Channel, входящие в поставку MetaTrader 5:

  • по Ichimoku будем считать признаком восходящего тренда нахождение линии Tenkan (красная) выше линии Kijun (синяя), нисходящего тренда — наоборот;
  • по Price_Channel восходящий тренд — если цена выше средней линии, нисходящий — если ниже.

Итого наш индикатор будет использовать 10 вспомогательных индикаторов: 5 таймфреймов по 2 индикатора. Назовем наш индикатор Trender.

Вот его полный исходный код (также он приложен к статье):

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

Ну и теперь перейдем к самому важному: подсчитаем, сколько же памяти потребляет такой индикатор.

Заглянем в исходный код индикатора Ichimoku (полный код см. в приложении):

и Price_Channel (полный код см. в приложении):

По этим строчкам кода видно, что эти индикаторы на двоих создают 8 буферов. Умножим это на 5 таймфреймов. И добавим 1 буфер самого индикатора Trender. Итого получится 41 буфер! Вот такие внушительные цифры могут скрываться за некоторыми простенькими на вид (на графике) индикаторами.

При стандартных настройках терминала один буфер содержит примерно 100000 значений, каждое имеет тип double и занимает 8 байт. Таким образом, 41 буфер — это примерно 31 Mb памяти. Это только сами значения, я не знаю, какая еще служебная информация содержится в буферах.

«31 Mb — это не так уж много», — скажете вы. Но когда трейдер торгует на большом количестве пар, такие объемы становятся проблемой для него. Помимо индикаторов, сами графики сильно пожирают память — ведь, в отличие от индикаторов, каждый бар имеет сразу несколько значений: OHLC, время, объем. Как всё это уместить на одном компьютере?

3. Направления решения проблемы

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

Для этого давайте вспомним. школьную геометрию. Представим все буферы нашего составного индикатора в виде сплошного прямоугольника:

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

Ширина в данном случае – количество баров, на которых строятся индикаторы. Высота – количество индикаторных буферов.

4. Уменьшаем количество баров

Не нужно даже быть программистом, чтобы «покрутить» настройки MetaTrader:

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

4.2. Есть ли другое решение?

MQL5-программисты знают, что индикаторные буферы объявляются в индикаторе как динамические массивы без предварительного задания размера. Вот, например, 5 буферов в том же Ichimoku:

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

Аналогично и в функции OnCalculate:

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

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

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

5. Уменьшаем количество буферов

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

Рассмотрим далее эти способы подробнее и проверим, работают ли они на практике, какие имеют достоинства и недостатки.

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

Проделаем это с одним из наших вспомогательных индикаторов — Price_Channel. В нем три буфера, а Trender считывает только один, так что есть чего убрать ненужного.

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

Первым делом уменьшаем счетчик буферов с 3 до 1:

И убираем два лишних буферных массива:

Теперь, если попытаться скомпилировать этот индикатор, компилятор покажет все строки, где есть обращения к этим массивам:

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

В нашем случае строчек с «undeclared identifier» всего 4. Давайте их править.

Как и следовало ожидать, две из них находятся в OnInit. Но вместе с ними пришлось убрать и строчку с нужным нам ExtMiddBuffer — добавив вместо нее аналогичную, но с другим номером буфера. Ведь буфера с номером 2 у индикатора теперь быть не может, а может быть только 0:

Если планируете «урезанный» индикатор использовать потом в визуальном режиме, то учитывайте, что при смене номера буфера нужно менять и настройки оформления. В нашем случае это:

Если же визуализация вам не нужна, то можно и не тратить время на смену оформления — к ошибкам это не приводит.

Продолжим отрабатывать список «undeclared identifier». Последние 2 изменения (что, опять же, предсказуемо) приходятся на OnCalculate, где идет заполнение этих буферных массивов. Так как нужный нам ExtMiddBuffer обращается к удаленным ExtHighBuffer и ExtLowBuffer, вместо них пришлось подставить промежуточные переменные:

Как видите, ничего сложного во всей этой «хирургической операции» не оказалось. Нужные места нашлись быстро, всего несколько «движений скальпелем» и — минус два буфера. В масштабах всего составного индикатора Trender экономия составит 10 буферов (2*5 ТФ).

Можно открыть друг под другом Price_Channel и Price_Channel-Need и увидеть исчезнувшие лишние буферы:

Чтобы использовать Price_Channel-Need в индикаторе Trender, надо исправить в коде Trender имя вспомогательного индикатора с «Price_Channel» на «Price_Channel-Need», а также номер нужного нам буфера в нем — вместо 2 теперь 0. Готовый Trender-Need прикреплен к статье.

5.2. Способ «Aggregate»

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

В нашем случае такой способ можно применить к Ichimoku. Ведь Trender использует из него 2 буфера (0 — Tenkan и 1 — Kijun):

Если в Ichimoku агрегировать 0-й и 1-й буфер в один сигнальный, то представленный выше фрагмент кода в Trender заменится на такой:

Полностью этот Trender-Aggregate приложен к статье.

А теперь рассмотрим ключевые изменения, которые нужно внести в Ichimoku.

В этом индикаторе есть еще и неиспользуемые буферы. Так что кроме способа «Aggregate» заодно применим и описанный ранее способ «Need». Таким образом, из 5 буферов в Ichimoku останется лишь один — агрегирующий нужные нам буферы:

Дадим этому единственному буферу новое имя:

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

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

Итак, вносим изменения в OnInit:

И самое интересное — в OnCalculate. Обратите внимание: три ненужных буфера просто удаляем (мы ведь применяем и способ «Need»), а нужные нам ExtTenkanBuffer и ExtKijunBuffer заменяем временными переменными Tenkan и Kijun. Эти переменные и используются в конце цикла для расчета нашего агрегирующего буфера ExtSignalBuffer:

Итого — минус 4 буфера. А если бы мы применили к Ichimoku только способ «Need», то было бы лишь минус 3.

В рамках всего Trender наша экономия составила 20 буферов (4*5 ТФ).

Полный код Ichimoku-Aggregate приложен к статье. Чтобы посмотреть, как выглядит этот индикатор в сравнении с оригиналом, откроем их оба на одном графике. Измененный индикатор, как вы помните, выводится теперь в нижней части графика в отдельном окне:

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

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

Основные проблемы, которые при этом возникнут:

  • Конфликт имен. Совпадающие имена переменных, функций, особенно системных (OnCalculate, например);
  • Отсутствие буферов. В некоторых индикаторах это может стать непреодолимым препятствием для адаптации, если логика индикаторов тесно завязана именно на буферное хранение/обработку данных. Замена буферов на простые массивы в нашем случае не выход, т.к. наша цель — снижение расхода памяти. Нам важен именно полный отказ от хранения в памяти какой-либо гигантской истории.

Продемонстрирую далее приемы, позволяющие эффективно решить эти проблемы.

Нужно каждый вспомогательный индикатор оформить в виде класса. Тогда все переменные и функции индикаторов будут иметь (внутри своих классов) уникальные имена и не будут конфликтовать с другими индикаторами.

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

Я написал вот такой класс:

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

Сохраним и названия всех буферов. Да, вы не ослышались, мы объявим все 5 буферов этого индикатора. Но они будут не настоящие. Они будут состоять всего из одного бара каждый:

Для чего это было сделано? Для того, чтобы меньше изменений потом вносить в код. Сейчас увидите. Переопределим унаследованный метод CIchimoku.Calculate, заполнив его перенесенным из Ichimoku кодом функции OnCalculate.

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

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

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

Теперь заполним метод CIchimoku.Init, в нем всё просто:

В индикаторе Ichimoku есть еще две функции, которые тоже нужно перенести в класс CIchimoku: Highest и Lowest. Они ищут максимальное и минимальное значение на заданном фрагменте ценовых буферов.

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

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

Метод Lowest модифицируется аналогичным образом.

С индикатором Price_Channel тоже проделываются похожие изменения, только он уже будет представлен в виде класса с именем CChannel. Полностью оба класса вы можете увидеть в Trender-Include, приложенном к статье.

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

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

Они означают, что график индикатора сдвинут на 1 бар. В нашем случае это приводит к тому, что, например, функции CopyBuffer и CopyHigh обращаются к двум разным барам, несмотря на то, что координаты бара (его время) заданы в их параметрах одинаковые.

В Trender-Include эта проблема решена (в классе CChannel добавлены «единички» где нужно, в отличие от класса CIchimoku, где такой проблемы не было), так что если вам тоже попадется подобный коварный индикатор, вы знаете, где искать подсказку.

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

Создание всех вспомогательных индикаторов в OnInit теперь станет выглядеть так:

А в OnCalculate на смену CopyBuffer придет прямое обращение к свойствам объектов:

Минус 40 буферов. Не зря мы потрудились.

После каждой переделки индикатора Trender описанными ранее способами «Need» и «Aggregate», я тестировал получившийся индикатор в визуальном режиме.

Проведем такой тест и сейчас: откроем на одном графике исходный индикатор (Trender) и переделанный (Trender-Include). Можно сделать вывод, что переделано всё было правильно, т.к. линии обоих индикаторов точно совпадают друг с другом:

5.4. Можно ли по одному?

Мы рассмотрели уже 3 способа уменьшить количество буферов вспомогательных индикаторов. Но что если попробовать кардинально изменить подход — и уменьшать не общее количество буферов, а количество буферов, одновременно находящихся в памяти? То есть, не сразу все индикаторы загружать в память, а по одному. Организовать эдакую «карусель»: создали один вспомогательный индикатор, прочитали с него данные, удалили, создали следующий и т.д., и так перебирать таймфрейм за таймфреймом. Больше всего буферов у индикатора Ichimoku — 5 штук. Значит, теоретически, в каждый момент времени в памяти могло бы находиться не более 5 буферов (плюс 1 буфер главного индикатора), и общая экономия составила бы 35 буферов!

Возможно ли это? В MQL5 ведь даже и функция есть для удаления индикаторов — IndicatorRelease.

Но, не все тут так просто, как кажется. MetaTrader 5 заботится о высокой скорости работы MQL5-программ, поэтому любые таймсерии, к которым было обращение, кэшируются в памяти — вдруг они понадобятся какому-то еще индикатору, эксперту или скрипту. И только если длительное время никто не будет повторно запрашивать эти данные, тогда они выгрузятся, освободив память. Это время ожидания составляет до 30 минут.

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

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

6. Измеряем реальный расход памяти

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

Измерять объем занятой терминалом памяти будем с помощью «Диспетчера задач» Windows. На вкладке «Процессы» там видно, сколько терминал занимает оперативной и виртуальной памяти. Например:

Измерения производятся по следующему алгоритму, позволяющему увидеть минимальный расход памяти терминалом (это и будет близко к непосредственному расходу памяти индикаторами):

  1. Скачиваем глубокую историю с сервера MetaQuotes-Demo (достаточно запустить тестирование по символу, чтобы история по нему автоматически скачалась);
  2. Терминал настраиваем на очередное измерение (открываем нужные графики и индикаторы) и перезапускаем — чтобы в памяти не оставалось ничего лишнего, кроме того, что нам нужно;
  3. Дожидаемся, пока перезапущенный терминал завершит расчеты всех индикаторов. Это станет видно по нулевой загрузке процессора;
  4. Сворачиваем терминал на панель задач (стандартная кнопка Windows «Свернуть» в правом верхнем углу терминала) — так он освобождает не используемую в данный момент для расчетов оперативную память (на скриншоте выше как раз пример расхода оперативной памяти в спокойном свернутом состоянии — видно, что ее может быть занято гораздо меньше по сравнению с виртуальной);
  5. В «Диспетчере задач» считываем сумму колонок «Память» (оперативная) и «Вирт.п.» (виртуальная память). Так они называются в Windows XP, в других версиях ОС могут называться по-другому.
  • Для большей точности измерений, будем использовать не один ценовой график, а сразу все доступные пары на демо-счете MetaQuotes — т.е. 22 графика M1. Потом вычислять средние значения;
  • Настройка «Макс. баров в окне» (описанная в главе 4.1) стандартная — 100000;
  • ОС — Windows XP, 32 bit.

Чего ожидать от результатов измерений? Сделаю тут два замечания:

  1. Хотя индикатор Trender и задействует 41 буфер, это не означает, что он занимает 41*100000 баров. Ведь эти буферы раскинуты по пяти таймфреймам, и на старших из них баров меньше, чем на младших. Например, в истории EURUSD на минутках всего более 4 млн. баров, а на часовках, соответственно, лишь около 70000 (4000000/60). Поэтому не стоит ожидать, что уменьшение числа буферов в Trender приведет к такому же снижению расхода памяти;
  2. Память занимает не только индикатор, но и используемые им ценовые серии. Trender обращается к пяти таймфреймам. Это значит, что если мы уменьшим число буферов в несколько раз, то общий расход памяти не уменьшится во столько же раз. Потому что ценовых серий в памяти все равно будет использоваться 5.

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

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

Чей расход памяти измеряем Индикаторных буферов Таймфреймы Расход памяти
Терминал 0 0 38 Mb на терминал
График 0 1 12 Mb на один пустой график
Индикатор Trender 41 5 46 Mb на один индикатор
Индикатор Trender-Need 31 5 42 Mb на один индикатор
Индикатор Trender-Aggregate 21 5 37 Mb на один индикатор
Индикатор Trender-Include 1 5 38 Mb на один индикатор

Выводы по результатам измерений:

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

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

  • Перенос кода всех вспомогательных индикаторов в главный индикатор не всегда является самым эффективным решением.

Почему же способ Include не оказался эффективней способа Aggregate? Чтобы определить причину, нужно вспомнить основные различия кода этих индикаторов. В Aggregate необходимые для расчетов ценовые серии подаются терминалом как входные массивы в OnCalculate, А в Include все эти данные (для всех таймфреймов) активно запрашиваются для каждого бара через CopyHigh, CopyLow, CopyClose. Видимо, это и приводит к появлению дополнительных расходов памяти, связанных с особенностями кэширования ценовых серий при использовании этих функций.

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

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

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

К статье приложены индикаторы, описываемые в статье. Чтобы все работало, нужно сохранить их в папку «MQL5\Indicators\TestSlaveIndicators», т.к. все версии индикатора Trender (кроме Trender-Include, конечно же) ищут свои вспомогательные индикаторы в ней.

Стратегия Черепах — классика трейдинга «старой школы»

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

Характеристики торговой системы «Черепах»

Платформа: Любая
Валютные пары: EURUSD, USDRUB, AUDUSD, USDCAD,NZDUSD,USDSGD,EURGBP,Gold,акции, сырьевые товары, индексы
Таймфрейм: D1
Время торговли: круглосуточно
Рекомендуемые ДЦ: Alpari, Roboforex

Справочный материал

История возникновения стратегии

Много лет назад два трейдера Ричард Деннис и Вильям Экхард поспорили: можно ли обучить простого человека трейдингу если научить его торговой системе и призвать дисциплинированно следовать её правилам.

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

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

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

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

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

Вспомогательные индикаторы

  • Azzx_donchian(Каналы Дончиана)

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

В случае с периодом в 20 дней учитываются последние 20 свечей. Отмечается самая высокая и самая низкая цена. Аналогично происходит с периодом в 55 дней. Здесь нет ничего сложного. Вы легко сможете построить канал сами карандашом на бумаге. Устанавливается индикатор на график три раза с периодами 55 дней, 20 дней и 10 дней.

  • TheClassicTurtleTrader(Черепаха)

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

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

Устанавливается на график два раза. Один с периодом 20 и стоп — периодом 10. Второй с периодом 55 и стоп — периодом 20.

Для успешной классической торговли достаточно индикаторов «Каналы Дончиана» и «The Classic Turtle Trader».

Давайте добавим индикатор на график, чтобы увидеть всё наглядно:

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

Закрашивает области 10, 20, 55 дневного пробоя и отображает стрелками вход, а галочками выход.

Рисует свечу, которая отображает средне-долгосрочный тренд.

На данном примере — это не очень сильный тренд вниз.

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

Стандартный индикатор в терминале.

Устанавливается с периодом 20.

Правила входа

Два вида торговли, основываются на пробое канала Дончиана. Сделки открываются сразу же, как только цена пробивает канал. Можно не дожидаться закрытия свечи.

Более краткосрочный вход:

— Цена пробивает 20-ти дневный канал Дончиана.

— Сделка по предыдущему сигналу, не важно входили мы или нет, закрылась с убытком.

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

На картинке Вы можете увидеть дневной график EUR/USD.

Зелёными линиями отражена граница канала Дончиана с периодом 20, то есть 20 дней.

Когда цена пробивает этот канал, мы входим в сделку.

Более долгосрочный вход:

-Цена пробивает 55-ти дневный канал Дончиана.

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

Стоп-лосс

Для Форекс существует упрощённая форма расчёта для черепах. Выглядит она следующим образом:

ATR (20) * 2

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

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

Но мы с вами не торгуем миллиардами, поэтому нам нужно обязательно размещать настоящие стоп-лоссы.

Для того, чтобы работать с формулой расчета стоп-лосса, стоит добавить на график индикатор ATR:

В последней сделке стоп-лосс составил бы 280 пунктов:

Причина больших цифр в том, что это дневные графики.

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

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

Правила выхода

Как известно, если есть вход, то значит должен быть выход.

  • Для сделки, открытой по пробитию 20-ти дневного канала, выход происходит при пробитии противоположного 10-ти дневного канала.
  • Для сделки, открытой по пробитию 55-ти дневного канала, выход происходит при пробитии противоположного 20-ти дневного канала.
  1. В первом случае черепахи выходили при пробое 10-ти дневного канала. На графике он отмечен красными границами:

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

При переходе через минимум 10-ти дневного канала у нас появляется вот такая точка:

Если на неё навести курсор, то появится название индикатора, время и приписка о выходе из длинных позиций.

  1. А в случае с 55-ти дневным каналом, выход осуществлялся при пробитии 20-ти дневного канала.

Давайте откроем сделку на продажу и ещё раз посмотрим на неё.

На графике вы можете увидеть пробой для 55-ти дневного графика:

В выделенной точке был пробой 20-ти дневного канала наверх. Здесь мы бы вышли из сделки:

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

Добавочные ордера

Устанавливаются примерно на расстоянии каждые 0,5 ATR от точки входа

Войти в рынок мы смогли бы где-то на этом уровне. ATR составил бы 140 пунктов. Половина от них — это 70:

Через 70 пунктов мы разместили бы ещё один ордер на вход в том же направлении. Через 70 ещё один и через 70 пунктов ещё один.

Доливочные ордера расположились бы вот таким образом через каждые 70 пунктов:

Если бы ATR был другим, то доливки осуществлялись бы равными долями от его половины.

Мани-менеджмент

Теперь давайте поговорим о мани- менеджменте.

  • Риск на сделку не более 1%
  • При использовании доливочных ордеров риск на каждую сделку 0,25%

Хочется сразу сказать, что черепахи никогда не рисковали больше, чем 1% депозита на сделку. Если вы хотите использовать и доливочные ордера, то стоит использовать в каждой сделке примерно риск 0,25% от депозита.

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

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

Примеры сделок

Теперь давайте рассмотрим несколько примеров входов в рынок.

  • С предпоследним входом при пересечении 20-ти дневного канала всё будет просто

Позиция здесь закрылась примерно с маленькой прибылью в 15 пунктов:

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

Обратите внимание, что вход в покупки на последнем максимуме по пробитию 20-ти дневного канала мы бы пропустили, потому что предыдущий пробой 20-ти дневного канала принёс прибыль.

  • Давайте посмотрим, смогли бы мы войти в сделку на примере другого пробоя.

Потенциально она прибыльна:

Смотрим, был ли прибыльным предыдущий пробой. Для того, чтобы он считался убыточным, цена должна пройти против нашей потенциальной позиции хотя бы на 2 ATR:

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

Следовательно, мы можем брать рассматриваемый сигнал.

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

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

Стоп-лосс выставлялся бы, как страховочный. На данный момент ATR составил 47 пунктов. Поэтому мы бы взяли примерно 100 пунктов.

Сделку можно было бы продолжить держать до пересечения максимума 10 дневного канала:

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

Вышли бы мы с прибылью в 630 пунктов:

Вот именно на взятие подобных трендов и рассчитана стратегия.

  • Теперь давайте рассмотрим входы по 55-ти дневному каналу.

Напоминаю, что в случае с 55-ти дневным пробоем мы берём все сделки, не важно были ли они прибыльны или нет в прошлом. А выходим из сделки при пробое 20-ти дневного канала.

Удобнее всего использовать 2 графика, для того, чтобы было проще ориентироваться в стратегии.

Последний вход на нашем примере произошёл чуть позже, чем 20-ти дневный:

Стоп-лосс рассчитывается аналогично.

В данном случае он составил примерно 92 пункта. Он выставился бы на нашем графике:

Вышли бы мы из системы через большое количество времени.

Давайте рассчитаем прибыль, которую мы могли бы получить в итоге:

Прибыль в этой сделке составила бы 2300 пунктов со стоп-лоссом в 100 пунктов. То есть прибыль была бы больше стопа в 23 раза!

Согласитесь, что это очень неплохая сделка. В этом заключается вся мощь долгосрочных трендов.

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

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

Уроки черепах

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

2) Управляйте рисками. Контролируйте риски для продолжения торговли, иначе вы не успеет насладиться чередой успешный сделок.

3) Будьте последовательны. Выполняйте свой план для входа в сделку, чтобы достичь цели системы — получение прибыли.

4) Делайте простые вещи. Простые системы легче выдерживают испытания времени.

Таблица с трендами с 2020 года

Автор индикатора Turtle составил интересную таблицу, где просчитаны все тренды с 2020 года после пробоя 20-дневного канала. Завершением тренда считается возврат к противоположному 10-ти дневному уровню. Расчеты проведены по основным валютным парам: EURUSD, GBPUSD, USDCHF, NZDUSD, USDJPY, USDCAD, AUDUSD, EURGBP, GOLD и SILVER.

Внимание ! Это просто ВСЕ пробои 20-ти дневного канала с завершением по возврату к 10-дневному каналу. Это не входы по системе черепах. Доп. условие для входа по системе 1 (чтобы предыдущий вход был убыточным), а также пробой 55-дневного канала не учитывались.

Первая таблица это тренды вниз, вторая — тренды вверх.

Легенда к таблице:
1) # — номер по порядку;
2) Symbol — валютная пара;
3) Open Price — цена начала тренда, Пробой 20-ти дневного уровня;
4) Start Trend — время начала тренда;
5) Close Price — цена закрытия, отскок к противоположному 10-ти дневному уровню;
6) End Trend — время закрытия тренда;
7) Day — длительность тренда в днях;
8) Point — количество пунктов от цены входа до цены закрытия;
9) Type — тип тренда Down/Up — Низходящий/Растущий;

10) Итого показывает итоговую сумму ПУНКТОВ.

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

Скачать таблицу

Заключение

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

Как использовать индикаторы форекс.

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

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

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

Торгуй по крупному только с ведущим брокером

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

1. Производящие построение – индикаторы уровней или каналов, автоматически производят построение на графике валютной пары:

• Каналы – линейной регрессии, ценовые каналы, Кельтнера. Применяются при различных вариантах торговли на пробое или в канальных стратегиях.

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

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

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

2. Анализирующие тренд – торговля в направлении существующий тенденции является основой большинства стратегий трейдинга, более полно провести анализ помогают индикаторы тренда forex, они предоставляют данные не только о направлении движения цены, но и анализируют такие показатели как сила тренда и вероятность разворота, а так же выводят на экран и другие, дополнительные данные.

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

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

Скачивайте осцилляторы в разделе — http://forexluck.ru/osc

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

Предупреждение о рисках.

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

Консультации по торговле на форекс и других биржевых площадках России

  • Бинариум
    Бинариум

    1 место! Лидер среди всех бинарных платформ.
    Лучший выбор для новичков и малоопытных трейдеров!
    Бесплатное обучение трейдингу и демо счет на любую валюту!
    Получите свой бонус за регистрацию в Бинариуме:

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