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

 
Artyom Trishkin:
もっと深いところまで見ないと...。

もっと深く、どこにあるんだろ

新しいインジケータで、すべての試みは、ハングアップにつながる。

そして、変化のないインジケーターで、一瞬のヒヤッとがある。

その解決策は何でしょうか?

 
mila.com:

もっと深く、どこにあるんだろ

新しいインジケータを使用して、すべての試行がハングアップする結果となりました。

そして、変化のないインジケーターでは、一瞬のブレーキがかかる。

その解決策は何でしょうか?

あなたのインジケータでは、特に他のカスタムインジケータのデータを使用するのではなく、任意の次元のフラクタル検索を行い、そのようなフラクタル検索用の関数を作成し、それを使用して作業してください。
 
Artyom Trishkin:
そのようなフラクタルを見つけて、それを扱う機能を作ればいいのです。

あなたにとって、それは簡単なことなのです)。

が、私にとっては無理難題です。

こんな機能?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

下位フラクタル である。

どのように使うのですか?

 
mila.com:

あなたにとっては、その方がやりやすいのです)。

でも、私にとっては無理難題なんです。

そのインジケーターの機能を私のインジケーターに移植するにはどうしたらいいでしょうか?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

さて、必要なのは、必要なバー上のフラクタルの価格を返すことです。ここでは、簡単なインジケータを作りました。これは、そこから取り出して自分のところで使える2つの関数を持っています - 私は特別にそれらを関数として整理しました - 無効な値に対するチェックを備えています。

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,159);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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[])
  {
//---
   if(rates_total<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(i,limit,high,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(i,limit,low ,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(int shift,const int limit,const double &low[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(low[i]>low[i-1]) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(low[i]>low[i+1]) return(-1);
   return(low[shift]);
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(int shift,const int limit,const double &high[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(high[i]<high[i-1]) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(high[i]<high[i+1]) return(-1);
   return(high[shift]);
}
//+----------------------------------------------------------------------------+
 

任意のフラクタル値を得るための関数を指標から切り離すために、配列high[]とlow[]と限界値を参照渡ししないようにします。

今回のコードはMQL5に近いので、High[]、Low[]、iHigh()、iLow()関数はお断りすることにします。このインジケータではこのように表示されます。

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   // PlotIndexSetInteger(0,PLOT_ARROW,217);
   // PlotIndexSetInteger(1,PLOT_ARROW,218);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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[])
  {
//---
   if(rates_total<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceLow(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceHigh(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetPriceHigh(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
double GetPriceLow(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
ただし、関数GetPriceHigh()とGetPriceLow()からは-1もチェックする必要があります。
 
こんにちは、15分足を使って20分ごとに値を確認するEAの作り方をアドバイスください。例えば、9-20、9-40でクロスオーバーRSIが続き、20分以内にレベルが交差した場合、価格の変化をチェックします。これを直さないといけないんです。
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

つまり、9-20でRSIがクロスしたとします。9-20の価格をEAに記憶させ、9-40で9-20の価格と相対する過去20分間をチェックするようにしたい。下がっていれば、ショートを開くことになる。ありがとうございました。
 
strongflex:
こんにちは、15分足を使って20分ごとに値を確認するEAの作り方をアドバイスください。例えば、9-20、9-40でクロスオーバーRSIが続き、20分後にレベルがクロスしていれば、価格変化を確認します。これを直さないといけないんです。
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

つまり、9-20でRSIがクロスしたとします。9-20の価格をEAに記憶させ、9-40で9-20の価格と相対する過去20分間をチェックするようにしたい。下がっていれば、ショートを開くことになる。ありがとうございました。

:)

Expert Advisorを9.22で実行するとどうなるか?

システムや端末に障害が発生した場合は?価格が分からなくなる。

つまり、このチェックの時間が来たら、20分前のことを探さなければならないのです。分単位が20の倍数以上になる時間が来た--20分前のバーのRSIの状態を確認する。適切なクロスオーバーがあれば、計画通りに進める......。

しかし、M15では、交差する正確な時間や正確な価格を 判断することはできませんが、M1の価格を見れば、少なくとも15倍以上の精度で判断することができます。

 
Artyom Trishkin:

:)

9.22でEAを動かすとどうなる?

システムや端末に障害が発生した場合はどうするのですか?価格が分からなくなる。

つまり、このチェックが行われたときに、20分前のものを探さなければならないのです。分単位が20の倍数以上になる時間が来た--20分前のバーのRSIの状態を確認する。それが目的の交差点であれば、計画通りに進む...。

しかし、M15では、交差する正確な時間や正確な価格を 判断することはできませんが、M1の価格を見れば、少なくとも15倍以上の精度で判断することができます。

よし、俺には無理だと思った)) みんな、誰かこの部分のコードを書ける人? 1000ルーブル払うよ。
 
strongflex:
わかりました、私が対応できないことはわかりました))) 誰かこの部分のコードを書いてくれる人はいませんか? 1000ルーブル払いますから。
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

で、1000はどこだ?

(なんちゃって)

 
Alekseu Fedotov:
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

で、1000はどこだ?

冗談

RSIは15分である必要があります。例えば、10-20の時点で70レベルより下から上へのクロスがあった場合、その価格を記憶し、10-40の時点で10-20の時点より価格が低ければショートをオープンするようにします。
理由: