Здравствуйте. Не получается сделать эксперта, чтобы торговал на пересечении RSI c EMA.Получается, что RSI в одном окне, а EMA в другом. А надо, чтобы EMA открывался в окне RSI.Вот рисунок из тестера:
Я думаю ошибка вот сдесь:
А как исправить незнаю.
Вам нужно сгладить не цену Клозе, а значения индикатора РСИ. Там ничего сложного.
Алгоритм такой:
1. за данный период времени расчитываете нужное значение РСИ, пишете в массив.
2. Затем применяете к массиву нужный вам метод сглаживания iMAOnArray(), получаете второй массив.
3. Затем сравниваете элементы этих двух массивов.
Успехов.
Вам нужно сгладить не цену Клозе, а значения индикатора РСИ. Там ничего сложного.
Алгоритм такой:
1. за данный период времени расчитываете нужное значение РСИ, пишете в массив.
2. Затем применяете к массиву нужный вам метод сглаживания iMAOnArray(), получаете второй массив.
3. Затем сравниваете элементы этих двух массивов.
Успехов.
int I; for (I=Bars-1; I>=0; I--) RSI1[I]=iRSI(NULL, 0,Period_RSI,PRICE_CLOSE, I); for (I=Bars-1; I>=0; I--) MA1[I]=iMAOnArray(RSI1, Bars-1, Period_MA, 0, MODE_EMA, I);Вот что у меня получилось, а как сравнить элементы этих двух массивов.
Например, так. И еще: не работайте с нулевыми элементами - единственное исключение если работаете по ценам открытия баров.
Найдите пожалуйста ошибку,а то уже 2 часа голову ломаю.Получается таже самая картинка,что и в первом посте
if (MA1[I]>RSI1[I]) //-------------------------------------------------------------------- // Торговые критерии RSI_t=iRSI(NULL,0,Period_RSI,PRICE_CLOSE,0); // RSI MA_t=iMA(NULL,0,Period_MA,0,MODE_EMA,MA1[I]>RSI1[I],0); // МА if (RSI_t > MA_t + Rastvor*Point) // Если разница между { // ..RSI и MA большая Opn_B=true; // Критерий откр. Buy Cls_S=true; // Критерий закр. Sell } if (RSI_t < MA_t - Rastvor*Point) // Если разница между { // ..RSI и MA большая Opn_S=true; // Критерий откр. Sell Cls_B=true; // Критерий закр. Buy }
Вообще-то сложно искать, если не знать что ищется - то есть что должно быть.
На вскидку : RSI_t будет вычисляться только если истинно условие : (MA[1]>RSI1[1]), Кстати, значение его (RSI_t) равно RSI1[0], так что второй раз индикатор можно не вызывать.Это первое. Второе - Вам нужно картинку нарисовать или значения сравнить ? Картинка в тестере показывает какие индикаторы вызывались при работе эксперта. Вы явно вызвали и РСИ, и МА - причем МА как-то странно - предпоследним параметром будет результат сравнения элементов массивов - он будет преобразован к типу передаваемого значения (интеджер) поскольку типы совместимы.... Чепуха какая-то получается ???? Будет взята какая-то цена (по стандарту результат логической операции ноль\не ноль). Так что ничего удивительного, что в тестере на чартах оба эти индикатора. Кстати, чтобы нарисовать мувинг на индикаторе РСИ нужно переписать сам индикатор - выше по ветке его выложили.
И потом, зачем Вы сглаживали значения РСИ, если сверяете значения индикатора РСИ (его диапазон изменений 0-100 и обычно выше 5) с мувингом по ценам, который в для евры в районе 1-2 ? Если другие пары смотрите на ценовой диапазон. И что Вы там хотите получить ? Насколько я понял задачу, сравнивать нужно значения РСИ с его же мувингом - то есть под условным оператором должно быть нечто такого типа :
if (RSI1[1] > MA1[1] + Rastvor*Point) // Если разница между { // ..RSI и MA большая Opn_B=true; // Критерий откр. Buy Cls_S=true; // Критерий закр. Sell } if (RSI1[1] < MA1[1] - Rastvor*Point) // Если разница между { // ..RSI и MA большая Opn_S=true; // Критерий откр. Sell Cls_B=true; // Критерий закр. Buy }
Вообще-то сложно искать, если не знать что ищется - то есть что должно быть.
На вскидку : RSI_t будет вычисляться только если истинно условие : (MA[1]>RSI1[1]), Кстати, значение его (RSI_t) равно RSI1[0], так что второй раз индикатор можно не вызывать.Это первое. Второе - Вам нужно картинку нарисовать или значения сравнить ? Картинка в тестере показывает какие индикаторы вызывались при работе эксперта. Вы явно вызвали и РСИ, и МА - причем МА как-то странно - предпоследним параметром будет результат сравнения элементов массивов - он будет преобразован к типу передаваемого значения (интеджер) поскольку типы совместимы.... Чепуха какая-то получается ???? Будет взята какая-то цена (по стандарту результат логической операции ноль\не ноль). Так что ничего удивительного, что в тестере на чартах оба эти индикатора. Кстати, чтобы нарисовать мувинг на индикаторе РСИ нужно переписать сам индикатор - выше по ветке его выложили.
И потом, зачем Вы сглаживали значения РСИ, если сверяете значения индикатора РСИ (его диапазон изменений 0-100 и обычно выше 5) с мувингом по ценам, который в для евры в районе 1-2 ? Если другие пары смотрите на ценовой диапазон. И что Вы там хотите получить ? Насколько я понял задачу сравнивать нужно значения РСИ с его же мувингом - то есть под условным оператором должно быть нечто такого типа :
Извените просто только недано начал програмировать на MQL поэому много не знаю.Мне просто надо чтобы на пересечение RSI c EMA были сигналы на покупку и продажу.Что-то вроде этого:
Извените просто только недано начал програмировать на MQL поэому много не знаю.Мне просто надо чтобы на пересечение RSI c EMA были сигналы на покупку и продажу.Что-то вроде этого:
Тогда таки нужно сравнивать, как я и писал, значения РСИ с его мувингом.
Примерно так:
//--------------------------------------------------------------- 5 -- //------------------МАССИВ____СГЛАЖИВАНИЯ-------------------------------- int I; for (I=Period_MA+Period_RSI; I>=0; I--) RSI1[I]=iRSI(NULL, 0,Period_RSI,PRICE_CLOSE, I); for (I=Period_MA; I>=0; I--) MA1[I] =iMAOnArray(RSI1, 0, Period_MA, 0, MODE_EMA, I); //if (MA1[I]>RSI1[I]) - это не понятно зачем //-------------------------------------------------------------------- // Торговые критерии // Это не нужно: значения индикатора и его мувинга уже расчитаны //RSI_t=iRSI(NULL,0,Period_RSI,PRICE_CLOSE,0); // RSI //MA_t=iMA(NULL,0,Period_MA,0,MODE_EMA,MA1[I]>RSI1[I],0); // МА if (RSI1[1] > MA1[1] + Rastvor*Point) // Если разница между { // ..RSI и MA большая Opn_B=true; // Критерий откр. Buy Cls_S=true; // Критерий закр. Sell } if (RSI1[1] < MA1[1] - Rastvor*Point) // Если разница между { // ..RSI и MA большая Opn_S=true; // Критерий откр. Sell Cls_B=true; // Критерий закр. Buy } //--------------------------------------------------------------- 6 --
сами массивы RSI1 и MA1 перед использованием нужно проинициализировать нулями - иначе что-попало может получиться...
Кстати, Вы их объявили как адреса - то есть не отвели под них память при описании. В функции инит связали с индикаторным буфером - в принципе возможно, обращаю Ваше внимание на это, поскольку не знаю насколько это сознательно сделано. Достаточно было описать например так : RSI1[100] MA1[100] - думаю, что реально массивы больших размерностей вряд ли для такой задачи могут понадобиться. Разве, что Вы захотите искать последний сигнал на открытие позиции.
Пробуйте.
Успехов.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте. Не получается сделать эксперта, чтобы торговал на пересечении RSI c EMA.Получается, что RSI в одном окне, а EMA в другом. А надо, чтобы EMA открывался в окне RSI.Вот рисунок из тестера:
рисунок из тестера стратегий.
Я думаю ошибка вот сдесь:
А как исправить незнаю.