Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1521

 
MakarFX:

Você está comparando o rsi errado em vez de "per".

Então é isso?

 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:

Então é isso?

Sim, mas você não pode simplesmente reescrever um indicador em outro.

Construa a lógica do indicador e depois escreva-o.


Neste caso, nem toda a lógica é clara ou há dados extras que não são utilizados.
 
MakarFX:

Sim, mas você não pode simplesmente reescrever um indicador em outro.

Construa a lógica do indicador e depois escreva-o.


Neste caso, nem toda a lógica é clara ou há dados extras que não estão sendo utilizados.

ver na imagem da tela o que eu tenho.

minha idéia é a seguinte.

se o rsi está acima do nível 70 e a vela se fecha abaixo do aberto - deve haver um sinal para venda

Tenho uma idéia. Se o rsi está abaixo de 30 e a vela se fecha acima do aberto - um sinal de compra.


não julgue, eu só estou tentando aprender um pouco))))

Agora me diga o que eu fiz de errado.

Arquivos anexados:
 
jarikn:

Veja a captura de tela do que eu tenho.

minha idéia é a seguinte.

Se o rsi estiver acima de 70 e a vela se fechar abaixo do aberto - deve haver um sinal para vender.

Se o rsi estiver abaixo de 30 e a vela se fechar acima do aberto - um sinal de compra.


não julgue, eu só estou tentando aprender um pouco))))

A única coisa que eu estou tentando aprender é isto.

1) use o botão para colar screenshots Imagem

2) de acordo com sua condição - está correto.

//+------------------------------------------------------------------+
//|                                                   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) use o botão para inserir screenshots

2) de acordo com sua condição - isto é correto.

Obrigado. Vou dar uma olhada nisso.

 
MakarFX:

1) use o botão para inserir screenshots

2) de acordo com sua condição - desta forma

como escrever a condição * se o rsi cruza de baixo para cima AlertLevDn então comprar? é possível ou preciso de um deslizador adicional?

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

como escrever esta condição * se o rsi cruza o AlertLevDn de baixo para cima, então compre? é possível ou você precisa de um deslizador adicional?

Sua pergunta lhe dá a resposta...

Se o rsi cruza de baixo para cima - isso significa que o valor atual é maior e o anterior é menor.

valor atual

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

valor anterior deve ser feito

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

depois dessa comparação

se o RSI2 for menor que o AlertLevDn e o RSI for maior que o AlertLevDn

você tem uma compra)

 
MakarFX:

Sua pergunta lhe dá a resposta...

Se o rsi cruza de baixo para cima, significa que o valor atual é maior e o valor anterior é menor.

valor atual

o valor anterior deve ser feito

depois dessa comparação

se o RSI2 for menor que o AlertLevDn e o RSI for maior que o AlertLevDn

Você tem uma compra)

Entendi. Obrigado)

 
jarikn:

Entendido. Obrigado).

correto

int limit=rates_total-prev_calculated-2;
 

Saudações, você poderia me dar uma dica? MT5.

Preciso obter os valores das Bandas Bollinger.

Eu escrevo

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

Produz algo semelhante ao double_max.

Ao mesmo tempo, recebe período, compensação, e tudo mais correto.



Razão: