Помогите с советником

 

Здравствуйте. Не получается сделать эксперта, чтобы торговал на пересечении RSI c EMA.Получается, что RSI в одном окне, а EMA в другом. А надо, чтобы EMA открывался в окне RSI.Вот рисунок из тестера:


рисунок из тестера стратегий.

Я думаю ошибка вот сдесь:

// Торговые критерии
  RSI_t=iRSI(NULL,0,Period_RSI,PRICE_CLOSE,0); // RSI
  MA_t=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,0); // МА

А как исправить незнаю.



Файлы:
rsifema.mq4  13 kb
 
Сначала надо индикатор сделать, что бы в одном окне было то и другое.
 
sasha2x >>:

Здравствуйте. Не получается сделать эксперта, чтобы торговал на пересечении RSI c EMA.Получается, что RSI в одном окне, а EMA в другом. А надо, чтобы EMA открывался в окне RSI.Вот рисунок из тестера:


рисунок из тестера стратегий.

Я думаю ошибка вот сдесь:

А как исправить незнаю.



Вам нужно сгладить не цену Клозе, а значения индикатора РСИ. Там ничего сложного.

Алгоритм такой:

1. за данный период времени расчитываете нужное значение РСИ, пишете в массив.

2. Затем применяете к массиву нужный вам метод сглаживания iMAOnArray(), получаете второй массив.

3. Затем сравниваете элементы этих двух массивов.

Успехов.

 
sasha2x >>:

Здравствуйте. Не получается сделать эксперта, чтобы торговал на пересечении RSI c EMA.Получается, что RSI в одном окне, а EMA в другом. А надо, чтобы EMA открывался в окне RSI.Вот

Прямо вовремя.

Файлы:
 
VladislavVG >>:

Вам нужно сгладить не цену Клозе, а значения индикатора РСИ. Там ничего сложного.

Алгоритм такой:

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);
Вот что у меня получилось, а как сравнить элементы этих двух массивов.
 
sasha2x >>:
Вот что у меня получилось, а как сравнить элементы этих двух массивов.
MA1[1]>RSI1[1]
Например, так. И еще: не работайте с нулевыми элементами - единственное исключение если работаете по ценам открытия баров.
 
TheXpert >>:

Прямо вовремя.

Я ж говорил, что тема актуальная. :))

 
VladislavVG >>:
Например, так. И еще: не работайте с нулевыми элементами - единственное исключение если работаете по ценам открытия баров. 


Найдите пожалуйста ошибку,а то уже 2 часа голову ломаю.Получается таже самая картинка,что и в первом посте
	          
Файлы:
rsirema.mq4  14 kb
 
sasha2x >>:
Найдите пожалуйста ошибку,а то уже 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
     }
 
VladislavVG >>:

Вообще-то сложно искать, если не знать что ищется - то есть что должно быть.

На вскидку :   RSI_t будет вычисляться только если истинно условие : (MA[1]>RSI1[1]), Кстати, значение его (RSI_t) равно RSI1[0], так что второй раз индикатор можно не вызывать.Это первое. Второе - Вам нужно картинку нарисовать или значения сравнить ? Картинка в тестере показывает какие индикаторы вызывались при работе эксперта. Вы явно вызвали и РСИ, и МА - причем МА как-то странно - предпоследним параметром будет результат сравнения элементов массивов - он будет преобразован к типу передаваемого значения (интеджер) поскольку типы совместимы.... Чепуха какая-то получается ???? Будет взята какая-то цена (по стандарту результат логической операции ноль\не ноль).   Так что ничего удивительного, что в тестере на чартах оба эти индикатора. Кстати, чтобы нарисовать мувинг на индикаторе РСИ нужно переписать сам индикатор - выше по ветке его выложили.

И потом, зачем Вы сглаживали значения РСИ, если сверяете значения индикатора РСИ (его диапазон изменений 0-100 и обычно выше 5) с мувингом по ценам, который в для евры в районе 1-2 ? Если другие пары смотрите на ценовой диапазон. И что Вы там хотите получить ? Насколько я понял задачу сравнивать нужно значения РСИ с его же мувингом - то есть под условным оператором должно быть нечто такого типа :


Извените просто только недано начал програмировать на MQL поэому много не знаю.Мне просто надо чтобы на пересечение RSI c EMA были сигналы на покупку и продажу.Что-то  вроде этого:


 
sasha2x >>:

Извените просто только недано начал програмировать на 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] - думаю, что реально массивы больших размерностей вряд ли для такой задачи могут понадобиться. Разве, что Вы захотите искать последний сигнал на открытие позиции.

Пробуйте.

Успехов.

Причина обращения: