Смотри, как бесплатно скачать роботов
Ищи нас в Twitter!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Советники

iOsMA Divergence - эксперт для MetaTrader 5

Просмотров:
1586
Рейтинг:
(12)
Опубликован:
2019.08.04 07:08
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Идея торговой стратегии

Советник торгует по индикатору iOsMA (Moving Average of Oscillator, OsMA) и ищет дивергенцию или двойную дивергенцию.

Для поиска дивергенции и двойной дивергенции взят алгоритм CompareMaps из модуля торговых сигналов [data folder] \ MQL5 \ Include \ Expert \ Signal \ SignalMACD.mqh.

Для облегчения понимания, как работает битовая карта, описание функций ExtState и CompareMaps на русском языке:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от "чайника"

Victor Kirillin, 2011.05.24 17:19

Посмотреть код можно в исходнике. Для поиска дивергенции используются два метода:

1. Метод bool CSignalMACD::ExtState(int ind) - подготавливает данные для поиска;

2. Метод bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start) - ищет рыночную модель с указанными параметрами.

Если поможет, вот комментарии к методам на русском языке:

Для метода bool CSignalMACD::ExtState(int ind)

//--- результатом работы этого метода является битовая карта экстремумов
//--- фактически, битовая карта экстремумов представляет собой "массив" 4-битовых полей
//--- каждый "элемент массива" однозначно описывает соотношение
//--- текущих экстремумов осцилятора и цены с предыдущими
//--- назначение битов элемента анализируемой битовой карты
//--- бит 3 - не используется (всегда 0)
//--- бит 2 - имеет значение 1 если текущий экстремум осцилятора "экстремальней" предыдущего
//---         (более высокий пик или более глубокая впадина), иначе 0
//--- бит 1 - не используется (всегда 0)
//--- бит 0 - имеет значение 1 если текущий экстремум цены "экстремальней" предыдущего
//---         (более высокий пик или более глубокая впадина), иначе 0
//--- кроме того, формируются:
//--- массив значений экстремумов осцилятора,
//--- массив значений экстремумов цены и
//--- массив "расстояний" между экстремумами осцилятора (в барах)
//--- следует отметить, что при использовании результатов расширенной проверки состояния,
//--- нужно учитывать, какой экстремум осцилятора (пик или впадина)
//--- является "точкой отсчёта" (т.е. был обнаружен при анализе первым)
//--- если первым был обнаружен пик, то чётные элементы всех массивов
//--- будут содержать данные о пиках, нечётный данные о впадинах
//--- если первой была обнаружена впадина, соответственно, наоборот

Для метода bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start)

//--- битовая карта образца представляет собой "массив" 4-битовых полей
//--- каждый "элемент массива" однозначно описывает искомое соотношение
//--- текущих экстремумов осцилятора и цены с предыдущими
//--- назначение битов элемента образца битовой карты
//--- бит 3 - имеет значение 1 если нам неважно соотношение экстремумов осцилятора
//---         имеет значение 0 если мы хотим "найти" соотношение экстремумов осцилятора определённое значением бита 2
//--- бит 2 - имеет значение 1 если мы хотим "найти" ситуацию когда текущий экстремум осцилятора "экстремальней" предыдущего
//---         (текущий пик более высокий или текущая впадина более глубокая)
//---         имеет значение 0 если мы хотим "найти" ситуацию когда текущий экстремум осцилятора менее "экстремальный" чем предыдущий
//---         (текущий пик менее высокий или текущая впадина менее глубокая)
//--- бит 1 - имеет значение 1 если нам неважно соотношение экстремумов цены
//---         имеет значение 0 если мы хотим "найти" соотношение экстремумов цены определённое значением бита 0
//--- бит 0 - имеет значение 1 если мы хотим "найти" ситуацию когда текущий экстремум цены "экстремальней" предыдущего
//---         (текущий пик более высокий или текущая впадина более глубокая)
//---         имеет значение 0 если мы хотим "найти" ситуацию когда текущий экстремум цены менее "экстремальный" чем предыдущий
//---         (текущий пик менее высокий или текущая впадина менее глубокая)

Основная проблема - это оптимальное количество баров, на которых необходимо получать данные индикатора. Например в функции  StateMain расчёт может производится от бара  ind и до самой левой свечи графика:

//+------------------------------------------------------------------+
//| Check of the oscillator state.                                   |
//|   ExtState -> for(int i=0;i<10;i++) -> StateMain(pos)            |
//+------------------------------------------------------------------+
int StateMain(int ind)
  {
   int    res=0;
   double var;
//--- Main from ind to the leftmost candle of the chart!!!
   for(int i=ind;;i++)

В своей реализации я это решил так: всегда копирую 300 элементов массива (число 300 хранится в глобальной программной переменной ExtCount) и всегда учитываю это число при обращении к массиву.


Подробнее о настройках советника:

Обратите внимание: торговый сигнал имеет наивысший приоритет! Ограничить его исполнение можно только при помощи параметра   Only one positions. Если Only one positions равен "true" и количество позиций открытых этим советником на данном символе больше "1" - тогда торговый сигнал игнорируется. 

Параметр Close opposite равен "true": сначала ЗАКРЫВАЕМ противоположную позицию, потом отрабатываем торговый сигнал.


Торговые настройки

В советнике можно как включать, так и выключать Trailing Stop. Для отключения параметр установить в "0.0".

Трейлинг и поиск торгового сигнала может срабатывать или через N- секунд или только в момент рождения нового бара. Интервал Трейлинга в секундах задаётся в   Trailing, in seconds, а интервал поиска торговых сигналов в Search signals, in seconds. Для этих двух параметров общее правило: если интервал задать меньше, чем "10" - это означает работу ТОЛЬКО в момент рождения нового бара, если же интервал задать ровно или более "10" - это означает работу каждые "N" секунд.


Дополнительные возможности

    • Only one positions - в рынке всегда только одна позиция
    • Reverse - переворот торгового сигнала
    • Close opposite - закрытие позиций противоположных торговому сигналу, причём сначала идёт гарантированное закрытие противоположной позиции и только потом открытие новой позиции в направлении сигнала

    Обратите внимание: торговый сигнал имеет наивысший приоритет! Ограничить его исполнение можно только при помощи параметра   Only one positions. Если Only one positions равен "true" и количество позиций открытых этим советником на данном символе больше "1" - тогда торговый сигнал игнорируется. 

    Параметр Close opposite равен "true": сначала ЗАКРЫВАЕМ противоположную позицию, потом отрабатываем торговый сигнал.


    Управление размером позиции (расчёт лота)

    Лот может быть как постоянный (Money management установить в Constant lot и задать размер лота в   The value for "Money management") так и динамический - в процентах риска на сделку (Money management установить в   Risk in percent for a deal и задать процент риска в The value for "Money management"). Также можно задать постоянный лот равный минимальному лоту -   Money management установить в Lots Min.

      Last 10 bars table Last 10 bars table

      Таблица параметров OCHL последних 10-ти баров на текущем графике и текущем таймфрейме. Также, показывает параметр tick.volume и количество пунктов каждого бара.

      MACD minimum level MACD minimum level

      Торговая стратегия по индикатору iMACD (Moving Average Convergence/Divergence, MACD) с фильтром минимального значения индикатора

      Pending Stop Trailing Pending Stop Trailing

      Краткое описание

      iStochastic Two Periods iStochastic Two Periods

      Торговая стратегия на двух осцилляторах iStochastic (Stochastic Oscillator) - при этом второй индикатор берётся с таймфрейма, отличного от текущего