И приложите код в котором возникают ошибки.
А что именно в коде у Вас не получается? Какие ошибки?
И приложите код в котором возникают ошибки.
Пока не знаю каким алгоритмом эту задачу реализовать.
Как я понимаю мне надо получить два вектора значений этого индикатора в сторону прошлого за некоторое время.
Как именно мне получить в советнике значения этих двух линий индикатора в диапозоне "последний бар" .. "N количество баров назад"
( Кода этого индикатора у меня нет, я использую сторонний индикатор с закрытым кодом, RSIOMA приведен здесь как образец с двумя линиями которые отрисовываются по внутреннему алгоритму )
Пока не знаю каким алгоритмом эту задачу реализовать.
Как я понимаю мне надо получить два вектора значений этого индикатора в сторону прошлого за некоторое время.
Как именно мне получить в советнике значения этих двух линий индикатора в диапозоне "последний бар" .. "N количество баров назад"
( Кода этого индикатора у меня нет, я использую сторонний индикатор с закрытым кодом, RSIOMA приведен здесь как образец с двумя линиями которые отрисовываются по внутреннему алгоритму )
Есть функция iCustom - она позволяет получать хэндл пользовательского индикатора и соответственно значения индикатора (с одного или нескольких индикаторных буферов)
Но как я понимаю будет скопирован одномерный массив данных, а здесь присутствует две линии значений.
Как распознать какие данные от первой а какие от второй линии индикатора ?
Или есть еще способ передачи данных от индикатора ?
Но как я понимаю будет скопирован одномерный массив данных, а здесь присутствует две линии значений.
Как распознать какие данные от первой а какие от второй линии индикатора ?
Или есть еще способ передачи данных от индикатора ?
Вызовите окно данных:
Это и есть 3 массива, нумерация массивов с нуля (0,1,2). Посмотрите какие у Вас будут.
Далее вызывайте iCustom:
double iCustom( string symbol, // имя символа int timeframe, // таймфрейм string name, // папка/имя_пользовательского индикатора ... // список входных параметров индикатора int mode, // источник данных int shift // сдвиг );
В качестве источника данных и укажите номер массива.
Вызовите окно данных:
Это и есть 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 баров в прошлое в двух мерный массив.
Аналогично считываем любые данные с любого индикатора.
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;
...
Посмотрите, пожалуйста, Правильно вставляем код на форуме.
Правильно вставленный код очень улучшает читаемость сообщений.
А почему 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( " ============== !СРАБОТКА! ================= " );
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день всем
Нид помощь в прикручивании индикатора в советник, с немного специфичными условиями.
Индикатор RSIoma Bollinger Bands ( ***)
Условия срабатывания:
Синяя линия движется вниз от момента "1" с не менее половины расстояния между пунктирными линиями на графике индикатора ( 80% и 50% на этих линиях по умолчанию ),
затем синяя линяя немного пересекает вниз границу уровня 50% с небольшим двойным возвратом и последующим продолжением опускания вниз ( "2", "3", "4" )
Серая линия ( "5" ) при этом с момента пересечения синей линии уровня 50% и до выхода синей линии в точке "4" двигается вниз от уровня +-немного от 80%.
То есть нужно отловить ситуацию как на графике в выделенном диапазоне и в момент точки "4" выполнить некоторые действия в советнике: