D1期間の始値と交差するM1期間の棒をカウントする指標。

 

ご挨拶このインジケーターについて教えてください。D1期間のOpen priceのレベルに遭遇したM1期間のBarsの 数をカウントするために異なる方法を試しています。私はそれをコード化しようとする試みを添付しましたが、正常に実行することができません。この件に一生懸命取り組んできましたが、壁にぶち当たりましたので、ここで親切な紳士たちの助けを求めます

このインジケーターに必要なものは以下の通りです。

1.M1期間のバーがD1期間のOpenの価格と重なったとき、それをカウントする。D1期間ごとにM1期間のバーが1440本あるので、1440本ごとにテストされることになります。

2.2. D1バーごとに、D1バーのカウントを合計し、ある値で平均化します。 平均値を30とすると、この30がD1バーの本数となります。

//+------------------------------------------------------------------+
//|                                                          XXX.mq4 |
//|                                              Copyright 2014, XXX |
//|                                                              XXX |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, XXX"
#property link      "XXX"
#property version   "1.00"
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Blue     // Color of the 1st line
//#property indicator_color2 Red      // Color of the 2nd line
 int count;  // Bar index
extern int Aver_Bars=30;             // number of bars for calculation
//extern double lots= 0.1; 
//extern int Pnt= 10; // Point multiplier for the pips.
double Buf_0[], Buf_1[];             // Declaring indicator arrays
//THIS INDICATOR IS TO COUNT NUMBER OF M1 BARS WHICH HIGH[I] IS HIGHER AND LOW[I] IS LOWER THAN OPEN[1440].
//--------------------------------------------------------------------
int init()                          // Special function init()
  {
//--------------------------------------------------------------------
   SetIndexBuffer(0,Buf_0);         // Assigning an array to a buffer
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Line style
//--------------------------------------------------------------------
   SetIndexBuffer(1,Buf_1);         // Assigning an array to a buffer
   //SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Line style
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }

3.3. 平均値をプロットしたものが指標となります。

 
どなたか助けてくださいは、全く可能性がないのでしょうか?
 

あなたのコードからは何をしようとしているのかわかりませんが、2箇所で変数iに値を与えていません。これに対処する必要があります。

int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }
 

手前味噌ですが、あなたのコードは、あなたの能力をはるかに超えたものを達成しようとしていることを示しています。

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);

例えば、i = 1 とします。

double O=iOpen(NULL,PERIOD_D1,1);

これは、昨日の始値を 返します。

   double H=iHigh(NULL,PERIOD_M1,1);
   double L=iLow(NULL,PERIOD_M1,1);

この2つは、最後に閉じた1分前のバーの値を返します。


つまり、1分前の値と昨日の始値を比較するわけです。

i = 2 の場合、2 分前の値と 2 日前の始値を比較することになります。

これは、あなたが望んでいるものではないことがわかるはずです。

 
GumRai:

手前味噌ですが、あなたのコードは、あなたの能力をはるかに超えたものを達成しようとしていることを示しています。

例えば、i = 1 とします。

これは、昨日の始値を返します。

この2つは、最後に閉じた1分前のバーの値を返します。


つまり、1分前の値と昨日の始値を比較するわけです。

i = 2 の場合、2 分前の値と 2 日前の始値を比較することになります。

これはあなたが望むものであるはずがないことがわかるはずです。


GumRaiさん、こんにちは。

お時間を割いていただき、ありがとうございました。あなたの言う通り、私は初心者で、EAをコーディングすることを学ぶために熱心に努力しています。私がしようとしていることは次のとおりです。

1.PERIOD_D1 OpenをD1バー上のPERIOD_M1バーと毎分比較する。そして、if (O > L && O < H) の条件を満たすM1バーをカウントする。

2.2. 数えたバーを配列に格納し、再び次のD1バーに進み、このサイクルを繰り返す。

3.3.カウントされたバーは、日足チャート上にプロットされます。例えば、M1バーのうち、条件を満たすものが5本であれば、この5本が日足Bar1の値としてプロットされます。そして、次の日足でM1が10になったとすると、前のバーがBar2に移動したため、再びBar1にプロットされます。

親切に、私は苦労して、この単純な文に見えたコーディングに最適な方法を教えてください。あなたがさらに説明を必要とする場合は、私に知らせてください。

 
Zaldy:


こんにちは、GumRaiさん。

お時間を割いていただきありがとうございます。あなたの言うとおり、私は初心者で、EAをコーディングすることを学ぶために熱心に努力しています。以下は、私がやろうとしていることです。

1.PERIOD_D1 OpenをD1バー上のPERIOD_M1バーと毎分比較する。そして、if (O > L && O < H) の条件を満たすM1バーをカウントする。

2.2. 数えたバーを配列に格納し、再び次のD1バーに進み、このサイクルを繰り返す。

3.3.カウントされたバーは、日足チャート上にプロットされます。例えば、M1バーのうち、条件を満たすものが5本であれば、この5本が日足Bar1の値としてプロットされます。そして、次の日足でM1が10になったとすると、前のバーがBar2に移動したため、再びBar1にプロットされます。

親切に、私は苦労して、この単純な文に見えたコーディングに最適な方法を教えてください。さらに説明が必要であれば教えてください。


私は喜んで協力しますが、これではレアムの助けにならないので、コードは書きません。

まず、1440本のM1バーが常に1日周期に対応するとは限らないことを認識する必要があります。ティックがない場合、そのバーは履歴から失われ、あなたが期待するよりも少ないかもしれません。

そこで、D1ローソクのオープンのdatetime値が必要になります。これは可能ですか?それを試して、あなたのコードを投稿してください。

 

それほど速くない

あなたが何をしようとしているのか、あなたのコード(if (O > L && O < H))では、あなたが望むものは得られないでしょう。

添付のチャートを見てください。



上向きの矢印は今日の始値

右向きの矢印は 、あなたのコード(if (O > L && O < H))に一致する最初のバー です。

しかし 、注意してみると、このバーは今日の始値の上で閉じているので、実際にはカウントは2(少なくとも(ティックチャートでは分からないが、もう少しクロスがあるかもしれない))に なるはずである。

しかし、あなたのコードではcount = 1しかない

 
qjol:

それほど速くない

あなたが何をしようとしているのか、あなたのコード(if (O > L && O < H))では、あなたが望むものは得られないでしょう。

添付のチャートを見てください。



上向きの矢印は今日の始値

右向きの矢印は 、あなたのコード(if (O > L && O < H))に一致する最初のバー です。

しかし 、注意してみると、このバーは今日の始値の上で閉じているので、実際にはカウントは2(少なくとも(ティックチャートでは分からないが、もう少しクロスがあるかもしれない))に なるはずである。

しかし、あなたのコードではcount = 1しかない


私の理解では、彼は始値を またぐバーをカウントしたいのだと思います - 私は間違っているかもしれませんが:)
 
  1. Zaldy: どなたか助けてくださいは、全く可能性がないのでしょうか?
    私たちに向かって大声を出さないでください。もちろん可能です。
  2. 整数とブーリアン演算は変換可能です。False == 0, True = 0 以外。
    return(true); else return(EMPTY_VALUE);
    return(true); else return(2147483647);
    return(true); else return(true);
  3. また、あなたはD1、チャート、M1という3つのタイムフレームを扱っています。変換する必要があります。
    コンパイルやテストはしていません。
       Counted_bars=IndicatorCounted(); // Number of counted bars
       for(iCht = Bars - 1 - Counted_bars; iCht >= 0; iCht--){ // Chart bars
          int      iD1    = iBarShift(NULL, PERIOD_D1, Time[iCht];
          double   openD1 = iOpen(NULL, PERIOD_D1, iD1);
          int      iM1Beg = iBarShift(NULL, PERIOD_M1, Time[iCht],
                   iM1End = -1;
          if(iCht > 0) iM1End = iBarShift(NULL, PERIOD_M1, Time[iCht-1];
          for(Buf_0[i] = 0; iM1Beg > iM1End; iM1Beg--){
             double hM1 = iHigh(NULL, PERIOD_M1, iM1Beg),
                    lM1 =  iLow(NULL, PERIOD_M1, iM1Beg);
    // count Bars of M1 Period that crisscross Open price of D1 Period 
            if( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++; 
          }
       }
    
    コンパイルもテストもされていません。
 
qjol:

それほど速くない

あなたが何をしようとしているのか、あなたのコード(if (O > L && O < H))では、あなたが望むものは得られないでしょう。

添付のチャートを見てください。



上向きの矢印は今日の始値

右向きの矢印は 、あなたのコード(if (O > L && O < H))に一致する最初のバー です。

しかし 、注意してみると、このバーは今日の始値の上で閉じているので、実際にはカウントは2(少なくとも(ティックチャートでは分からないが、もう少しクロスがあるかもしれない))に なるはずである。

しかし、あなたのコードではcount = 1しかない


Qjolさん、はい、右向きの矢印が最初にカウントされます。D1オープンのみで交差しているものは、カウントされます。お疲れ様でした。
 
WHRoeder:
  1. ザルディ どなたか助けてくださいは、全く可能性がないのでしょうか?
    大声を出さないでください。もちろん可能です。
  2. 整数とブーリアンは変換可能です。False == 0, true = 0 以外です。
  3. D1、チャート、M1という3つのタイムフレームを扱っているわけですから。変換する必要があります。
    コンパイルもテストもされていません。
    コンパイルもテストもしてない。

WHRoederさん、ありがとうございます。あなたの提案を試して、結果をここに戻ってきます。