Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1521

 
MakarFX:

Vous comparez le mauvais rsi au lieu de "per".

Alors c'est tout ?

 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:

Alors c'est tout ?

Oui, mais vous ne pouvez pas simplement réécrire un indicateur dans un autre.

Construisez la logique de l'indicateur, puis écrivez-le.


Dans ce cas, toute la logique n'est pas claire ou il y a des données supplémentaires qui ne sont pas utilisées.
 
MakarFX:

Oui, mais vous ne pouvez pas simplement réécrire un indicateur dans un autre.

Construisez la logique de l'indicateur, puis écrivez-le.


Dans ce cas, toute la logique n'est pas claire ou il y a des données supplémentaires qui ne sont pas utilisées.

voir sur la capture d'écran ce que j'ai obtenu.

mon idée est la suivante.

si le rsi est supérieur au niveau 70 et que la bougie se ferme en dessous de l'ouverture - il devrait y avoir un signal de vente.

J'ai une idée. Si le rsi est inférieur à 30 et que la bougie clôture au-dessus de l'ouverture - un signal d'achat.


Ne jugez pas, j'essaie juste d'apprendre un peu. ))))

Maintenant, dis-moi ce que j'ai fait de mal.

Dossiers :
 
jarikn:

Regardez la capture d'écran de ce que j'ai.

Mon idée est la suivante.

Si le rsi est supérieur à 70 et que la bougie clôture en dessous de l'ouverture - il devrait y avoir un signal de vente.

Si le rsi est inférieur à 30 et que la bougie clôture au-dessus de l'ouverture - un signal d'achat.


Ne jugez pas, j'essaie juste d'apprendre un peu. ))))

La seule chose que j'essaie d'apprendre est la suivante.

1) utiliser le bouton pour coller les captures d'écran Image

2) selon votre condition - c'est correct.

//+------------------------------------------------------------------+
//|                                                   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) utiliser le bouton pour insérer des captures d'écran

2) selon votre état - c'est correct.

Merci. Je vais m'en occuper.

 
MakarFX:

1) utiliser le bouton pour insérer des captures d'écran

2) selon votre condition - par ici

comment écrire la condition * si le rsi traverse de bas en haut AlertLevDn alors acheter ? est-ce possible ou ai-je besoin d'un curseur supplémentaire ?

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

comment écrire cette condition * si le rsi croise AlertLevDn de bas en haut alors acheter ? est-ce possible ou faut-il un curseur supplémentaire ?

Votre question vous donne la réponse...

Si le rsi croise de bas en haut - cela signifie que la valeur actuelle est plus élevée et que la précédente est plus basse.

valeur actuelle

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

la valeur précédente devrait être faite

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

après cela, comparez

si RSI2 est inférieur à AlertLevDn et RSI est supérieur à AlertLevDn

vous avez un achat)

 
MakarFX:

Votre question vous donne la réponse...

Si le rsi croise de bas en haut, cela signifie que la valeur actuelle est supérieure et que la valeur précédente est inférieure.

valeur actuelle

la valeur précédente doit être faite

après cela, comparez

si RSI2 est inférieur à AlertLevDn et RSI est supérieur à AlertLevDn

Vous avez un achat)

Je l'ai. Merci)

 
jarikn:

Je l'ai. Merci.)

correct

int limit=rates_total-prev_calculated-2;
 

Salutations, pourriez-vous me donner un indice ? MT5.

J'ai besoin d'obtenir les valeurs des bandes de Bollinger.

J'écris

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

Produit quelque chose de similaire à double_max.

En même temps, la période, le décalage et tout le reste sont corrects.