Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1521

 
MakarFX:

Не то сравниваешь вместо "per"должны быть показания rsi

то есть так?

 int Signal(int i)
{
  // Снимем показания индикатора
   double Current   = iRSI(NULL, 0, per, PRICE_CLOSE, i);
   double Previous    = iRSI(NULL, 0, per, PRICE_CLOSE, i+1);
   
    double SCurrent   = iRSI(NULL, 0, per, PRICE_CLOSE, i);
     // Для предыдущего бара
   double SPrevious    = iRSI(NULL, 0, per, PRICE_CLOSE, i+1);
      // А теперь проверим всловия для наличия сигналов
   
   // есть сигнал на покупку?
   if(Current <= niz && Close[1]>Open[1])
   
   return(BUY);
   
   if(Current >= verx && Close[1]<Open[1])
    return(SELL);
   
   // Сигнала нет   
   return(-1);
 
jarikn:

то есть так?

Да, но нельзя просто переписывать один индикатор в другой.

Построй логику работы индикатора, а потом пиши.


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

Да, но нельзя просто переписывать один индикатор в другой.

Построй логику работы индикатора, а потом пиши.


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

посмотрите на скрине что у меня получилось. 

идея у меня такова. 

если rsi выше уровня 70 и свеча закрылась ниже открытия - должен быть сигнал на селл

если rsi ниже уровня 30 и свеча закрылась выше открытия то сигнал на бай.


не судите строго я только пытаюсь немного научится)))) 

теперь скажите что я делал не так?

Файлы:
 
jarikn:

посмотрите на скрине что у меня получилось. 

идея у меня такова. 

если rsi выше уровня 70 и свеча закрылась ниже открытия - должен быть сигнал на селл

если rsi ниже уровня 30 и свеча закрылась выше открытия то сигнал на бай.


не судите строго я только пытаюсь немного научится)))) 

теперь скажите что я делал не так?

1) скрины вставляй в сообщения при помощи кнопки  Image

2)согласно твоего условия - правильно так

//+------------------------------------------------------------------+
//|                                                   jarikn_RSI.mq4 |
//|                                           Copyright 2020, DrMak. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, DrMak."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Покупаем
#property indicator_label1  "Продаём"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Продаём
#property indicator_label2  "Покупаем"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int   RSI_Period  =14;  //Период рассчета RSI
input int   AlertLevUp  =70;  //Уровень для покупок 
input int   AlertLevDn  =30;  //Уровень для продаж
//--- indicator buffers
double      Buy[];            // Буфер для покупок
double      Sell[];           // Буфер для продаж
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buy);
   SetIndexBuffer(1,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue (0, 0);
   SetIndexEmptyValue (1, 0);
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle (0, DRAW_ARROW);
   SetIndexStyle (1, DRAW_ARROW); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow(0, 234);  //Стрелка "вниз" для продаж
   SetIndexArrow(1, 233);  //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel(0, "Продаём");
   SetIndexLabel(1, "Покупаем");
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits (Digits);
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ("Мой первый индикатор");
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=rates_total-prev_calculated-1;
   if(limit<1) return(0);
   for(int i=limit;i>=0;i--)
     {
      // Снимем показания индикатора
      double RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);
      if(RSI>AlertLevUp&&open[i]>close[i])
         Buy[i]=high[i];
      if(RSI<AlertLevDn&&open[i]<close[i])
         Sell[i]=low[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
MakarFX:

1) скрины вставляй в сообщения при помощи кнопки 

2)согласно твоего условия - правильно так

спасибо. буду разбираться 

 
MakarFX:

1) скрины вставляй в сообщения при помощи кнопки 

2)согласно твоего условия - правильно так

а как написать такое условие * если rsi пересекает снизу вверх AlertLevDn то бай? это возможно или нужна дополнительно скользящая?

{
//---
   int limit=rates_total-prev_calculated-1;
   if(limit<1) return(0);
   for(int i=limit;i>=0;i--)
     {
      // Снимем показания индикатора
      double RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);
      if(RSI>AlertLevUp)
         Buy[i]=high[i];
      if(RSI<AlertLevDn)
         Sell[i]=low[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
jarikn:

а как написать такое условие * если rsi пересекает снизу вверх AlertLevDn то бай? это возможно или нужна дополнительно скользящая?

Твой вопрос и дает тебе ответ...

если rsi пересекает снизу вверх - значит текущее значение выше, а предыдущее ниже

текущее значение

double RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);

предыдущее надо сделать

double RSI2 = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);

после этого сравнить

если RSI2 меньше AlertLevDn и  RSI больше AlertLevDn

у тебя бай)

 
MakarFX:

Твой вопрос и дает тебе ответ...

если rsi пересекает снизу вверх - значит текущее значение выше, а предыдущее ниже

текущее значение

предыдущее надо сделать

после этого сравнить

если RSI2 меньше AlertLevDn и  RSI больше AlertLevDn

у тебя бай)

понял. спасибо)

 
jarikn:

понял. спасибо)

исправь

int limit=rates_total-prev_calculated-2;
 

Приветствую, подскажите, пожалста.  МТ5

Нужно получить значения Bollinger Bands

пишу 

#property strict

#include <Indicators\Trend.mqh>
CiBands       m_bands;

input int Magic = 778871;

int OnInit(){//////////////***OnInit()****///*************OnInit()*******/////////***/////////////////////////OnInit()


Print(m_bands.Create(Symbol(), PERIOD_CURRENT, 20, 0, 2, PRICE_CLOSE));
Print((string)m_bands.MaPeriod());
Print((string)m_bands.Base(Bars(NULL, PERIOD_CURRENT)));

return(INIT_SUCCEEDED);
} 

выводит что-то схожее с double_max. 

При этом период, смещение, и остальное получает корректно



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