MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1521

 
MakarFX:

あたり」ではなく、間違った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)ボタンでスクリーンショットを貼り付ける画像

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;
 

はじめまして、ヒントをお願いします。 MT5です。

ボリンジャーバンドの 値を取得したいのですが。

私は、次のように書いています。

#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と似たようなものを出力する。

同時に、周期、オフセット、その他すべてを正しく取得します。