Помогите с советником
Здравствуйте. Не получается сделать эксперта, чтобы торговал на пересечении 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] - думаю, что реально массивы больших размерностей вряд ли для такой задачи могут понадобиться. Разве, что Вы захотите искать последний сигнал на открытие позиции.
Пробуйте.
Успехов.
Здравствуйте. Не получается сделать эксперта, чтобы торговал на пересечении RSI c EMA.Получается, что RSI в одном окне, а EMA в другом. А надо, чтобы EMA открывался в окне RSI.Вот рисунок из тестера:
рисунок из тестера стратегий.
Я думаю ошибка вот сдесь:
А как исправить незнаю.