Скачать MetaTrader 5

Нид помощь в прикручивании индикатора в советник по алгоритму

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск на MQL5.community ведется во всех разделах. Попробуй сам!
Sergey Smagin
474
Sergey Smagin 2014.09.08 12:03 

Добрый день всем

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

Индикатор RSIoma Bollinger Bands ( ***)

Условия срабатывания:

Синяя линия движется вниз от момента "1" с не менее половины расстояния между пунктирными линиями на графике индикатора ( 80% и 50% на этих линиях по умолчанию ),

затем синяя линяя немного пересекает вниз границу уровня 50% с небольшим двойным возвратом и последующим продолжением опускания вниз ( "2", "3", "4" )

Серая линия ( "5" ) при этом с момента пересечения синей линии уровня 50% и до выхода синей линии в точке "4" двигается вниз от уровня +-немного от 80%.

То есть нужно отловить ситуацию как на графике в выделенном диапазоне и в момент точки "4" выполнить некоторые действия в советнике:



RSIOMA Bollinger Bands | Forex MT4 Indicators | Forex Индикаторы MT4
  • www.indicatorsmt4.com
Информация о рынке Используется: Индикатор Кривые создан: Показателей, используемых: Пользовательские индикаторы, используемые: Характеристики управления заказами: Другие особенности:
Vladimir Karputov
Модератор
45551
Vladimir Karputov 2014.09.08 13:19  
А что именно в коде у Вас не получается? Какие ошибки?
И приложите код в котором возникают ошибки.
Sergey Smagin
474
Sergey Smagin 2014.09.08 14:16  
barabashkakvn:
А что именно в коде у Вас не получается? Какие ошибки?
И приложите код в котором возникают ошибки.

Пока не знаю каким алгоритмом эту задачу реализовать.

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

Как именно мне получить в советнике значения этих двух линий индикатора в диапозоне "последний бар" .. "N количество баров назад"

( Кода этого индикатора у меня нет, я использую сторонний индикатор с закрытым кодом, RSIOMA приведен здесь как образец с двумя линиями которые отрисовываются по внутреннему алгоритму )

Vladimir Karputov
Модератор
45551
Vladimir Karputov 2014.09.08 14:43  
vfp7:

Пока не знаю каким алгоритмом эту задачу реализовать.

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

Как именно мне получить в советнике значения этих двух линий индикатора в диапозоне "последний бар" .. "N количество баров назад"

( Кода этого индикатора у меня нет, я использую сторонний индикатор с закрытым кодом, RSIOMA приведен здесь как образец с двумя линиями которые отрисовываются по внутреннему алгоритму )

Есть функция iCustom - она позволяет получать хэндл пользовательского индикатора и соответственно значения индикатора (с одного или нескольких индикаторных буферов)
Sergey Smagin
474
Sergey Smagin 2014.09.08 15:29  
barabashkakvn:
Есть функция iCustom - она позволяет получать хэндл пользовательского индикатора и соответственно значения индикатора (с одного или нескольких индикаторных буферов)

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

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

Или есть еще способ передачи данных от индикатора ?

Eugeniy Lugovoy
1979
Eugeniy Lugovoy 2014.09.09 00:14  
vfp7:

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

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

Или есть еще способ передачи данных от индикатора ?

Вызовите окно данных:

Показания индикатора 

Это и есть 3 массива, нумерация массивов с нуля (0,1,2). Посмотрите какие у Вас будут.

Далее вызывайте iCustom:

double  iCustom(
   string       symbol,           // имя символа
   int          timeframe,        // таймфрейм
   string       name,             // папка/имя_пользовательского индикатора
   ...                            // список входных параметров индикатора
   int          mode,             // источник данных
   int          shift             // сдвиг
   );
 

В качестве источника данных и укажите номер массива.

Sergey Smagin
474
Sergey Smagin 2014.09.09 07:52  
elugovoy:

Вызовите окно данных:

 

Это и есть 3 массива, нумерация массивов с нуля (0,1,2). Посмотрите какие у Вас будут.

Далее вызывайте iCustom:

В качестве источника данных и укажите номер массива.

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

На Вашем скрине все прояснилось, "Окно данных" все проясняет.

Если кому понадобиться то примерно так кодируем:

int DataRSI[ 10, 2 ];
      for( int CurBar = 0; CurBar < 10; CurBar++ )
      {
        DataRSI[ CurBar, 0 ] = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar ) );
        DataRSI[ CurBar, 1 ] = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 7, CurBar ) );
        Print( "Линия 1, Бар ", CurBar, " = ", DataRSI[ CurBar, 0 ] );
        Print( "Линия 2, Бар ", CurBar, " = ", DataRSI[ CurBar, 1 ] );


      }

Мы считываем значения двух линий индикатора RSIOMA Bollinger Bands на 10 баров в прошлое в двух мерный массив.

Аналогично считываем любые данные с любого индикатора.

Eugeniy Lugovoy
1979
Eugeniy Lugovoy 2014.09.09 09:56  
vfp7:

        DataRSI[ CurBar, 1 ] = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 7, CurBar ) ); 

А почему 7 ? Если у вас 2 линии, то индекс второй будет 1, или там еще 6 буферов есть?

Кстати преобразование типов можно делать и так:

int x;
double y = 10.0;

x = (int)y;
Vladimir Karputov
Модератор
45551
Vladimir Karputov 2014.09.09 10:03  
vfp7:

...

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

Правильно вставленный код очень улучшает читаемость сообщений. 

Sergey Smagin
474
Sergey Smagin 2014.09.09 12:10  
elugovoy:

А почему 7 ? Если у вас 2 линии, то индекс второй будет 1, или там еще 6 буферов есть?

Кстати преобразование типов можно делать и так:

Привычка с языка ADA, к хорошему быстро привыкаешь :)

Да, там еще куча промежуточных данных.

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

Получается всего 8 данных массива ( на каждый бар M30 ), а надо минимум 14 но в том же диапазоне из четырех часов и при работе индикатора на М30.

На М15 он рисует уже совершенно другой график и соответственно алгоритм не отрабатывает.

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

      int CurRSI1, CurRSI2, HysRSI1, HysRSI2, int CurBar = 0;
      CurRSI1 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar ) );     // текущие данные по линии1 индикатора
      CurRSI2 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 7, CurBar ) );     // текущие данные по линии2 индикатора
      if( CurRSI1 > 50 || CurRSI2 > 80 ) { Print( "1" ); return; };                                                        // проверка что линия1 ниже 50% и линия2 ниже 80%
      HysRSI1 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar - 1 ) ); // данные за прошлый бар линии1 индикатора
      HysRSI2 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 7, CurBar - 1 ) ); // данные за прошлый бар линии2 индикатора
      while( CurRSI1 <= HysRSI1 )                                                                                          // Далее подобный алгоритм, проверяем куда движется линия и т.п.
      {
        CurBar++;
        CurRSI1 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar ) );
        CurRSI2 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 7, CurBar ) );
        HysRSI1 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar - 1 ) );
        HysRSI2 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 7, CurBar - 1 ) );
        if( CurBar > 7 || CurRSI2 > 80 || CurRSI2 > HysRSI2 ) { Print( "2" ); return; };
      }
      while( CurRSI1 >= HysRSI1 )
      {
        CurBar++;
        CurRSI1 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar ) );
        CurRSI2 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 7, CurBar ) );
        HysRSI1 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar - 1 ) );
        HysRSI2 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 7, CurBar - 1 ) );
        if( CurBar > 7 || ( CurRSI1 > 50 || CurRSI2 > HysRSI2 ) ) { Print( "3" ); return; };
      }
      if( CurRSI1 > 50 ) { Print( "4" ); return; };
      while( CurRSI1 <= HysRSI1 && CurBar < 7 )
      {
        CurBar++;
        CurRSI1 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar ) );
        HysRSI1 = int( iCustom( Symbol(), 30, "RSIOMA Bollinger Bands", 14, 80, 20, 50, 50, 10, 1, 0, 10, 0, CurBar - 1 ) );
      }
      if( CurRSI1 < 50 ) { Print( "5" ); return; };
      Print( " ============== !СРАБОТКА! ================= " );
Vladimir Karputov
Модератор
45551
Vladimir Karputov 2014.09.09 12:17  
Насчёт ограничения по барам - не совсем понял, но может это поможет: Организация доступа к данным
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий