Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1521

 
MakarFX:

Stai confrontando l'rsi sbagliato invece del "per".

Quindi è tutto qui?

 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:

Quindi è tutto qui?

Sì, ma non si può riscrivere un indicatore in un altro.

Costruisci la logica dell'indicatore e poi scrivilo.


In questo caso, non tutta la logica è chiara o ci sono dati extra che non vengono utilizzati.
 
MakarFX:

Sì, ma non si può riscrivere un indicatore in un altro.

Costruisci la logica dell'indicatore e poi scrivilo.


In questo caso, non tutta la logica è chiara o ci sono dati extra che non vengono utilizzati.

vedere sullo screenshot quello che ho ottenuto.

la mia idea è questa.

se l'rsi è sopra il livello 70 e la candela chiude sotto l'apertura - ci dovrebbe essere un segnale di vendita

Ho un'idea: se l'rsi è inferiore a 30 e la candela chiude sopra l'apertura - un segnale di acquisto.


Non giudicare, sto solo cercando di imparare un po' ))))

Ora ditemi cosa ho fatto di sbagliato.

File:
 
jarikn:

Guarda lo screenshot di quello che ho.

la mia idea è questa.

Se l'rsi è superiore a 70 e la candela chiude sotto l'apertura - ci dovrebbe essere un segnale di vendita.

Se l'rsi è sotto 30 e la candela chiude sopra l'apertura - un segnale di acquisto.


Non giudicare, sto solo cercando di imparare un po' ))))

L'unica cosa che sto cercando di imparare è questa.

1) usa il pulsante per incollare gli screenshot Immagine

2) secondo la sua condizione - è corretto.

//+------------------------------------------------------------------+
//|                                                   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) usa il pulsante per inserire gli screenshot

2) secondo la sua condizione - questo è corretto.

Grazie, ci darò un'occhiata.

 
MakarFX:

1) usa il pulsante per inserire gli screenshot

2) secondo la vostra condizione - proprio così

come scrivere la condizione * se rsi attraversa dal basso verso l'alto AlertLevDn allora comprare? è possibile o ho bisogno di un ulteriore slider?

{
//---
   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:

come scrivere questa condizione * se rsi attraversa AlertLevDn dal basso verso l'alto allora compra? è possibile o hai bisogno di un ulteriore slider?

La tua domanda ti dà la risposta...

Se l'rsi attraversa dal basso verso l'alto - significa che il valore attuale è più alto e quello precedente è più basso.

valore corrente

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

il valore precedente dovrebbe essere fatto

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

dopo di che confrontare

se RSI2 è minore di AlertLevDn e RSI è maggiore di AlertLevDn

hai un acquisto)

 
MakarFX:

La tua domanda ti dà la risposta...

Se l'rsi attraversa dal basso verso l'alto, significa che il valore attuale è più alto e il valore precedente è più basso.

valore corrente

il valore precedente deve essere fatto

dopo di che confrontare

se RSI2 è minore di AlertLevDn e RSI è maggiore di AlertLevDn

Hai un acquisto)

Capito. Grazie)

 
jarikn:

Capito, grazie).

corretto

int limit=rates_total-prev_calculated-2;
 

Saluti, potreste darmi un suggerimento? MT5.

Ho bisogno di ottenere i valori delle Bande di Bollinger.

Scrivo

#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);
} 

Emette qualcosa di simile a double_max.

Allo stesso tempo, ottiene il periodo, l'offset e tutto il resto in modo corretto.