新しいタイムフレームのチャートに変更すると、インジケータが消えてしまう。 - ページ 2

 

説明ありがとうございました。

よくわかりました。

SCFX

 

こんにちは。

そのおかしなエラーに頭を抱えています。

この4行のシンプルなインジケータは、タイムフレームを変更すると消えてしまいます。

ここに投稿された提案をすでに適用しましたが、まだ失敗しています。

とても嫌な気分です・・・。

どうか私を助けてください。

ありがとうございました。

SCFX

//+------------------------------------------------------------------+
//|                                                        H_roc.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//#property indicator_minimum -3.5
//#property indicator_maximum 3.5
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "boring"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
//--- indicator buffers
double         boring[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,boring);
   
          
//---
   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;
   if(limit<=0) limit=300;
//---
 
 for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) 
      boring[i]=Close[i];
    
}  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
scfx:

こんにちは。

そのおかしなエラーに頭を抱えています。

この4行のシンプルなインジケータは、タイムフレームを変更すると消えてしまいます。

ここに投稿された提案をすでに適用しましたが、まだ失敗しています。

とても嫌な気分です・・・。

どうか私を助けてください。

ありがとうございました。

SCFX



2014.06.15 11:26:39.908 'test.mq4' (59,44)でゼロディバイド
 
angevoyageur:
2014.06.15 11:26:39.908 'test.mq4' でゼロディバイド (59,44)


ご返信ありがとうございます。

私のジャーナルでは、そのような通知はありませんが、TFを変更すると、このインジケータが削除されます。

まだ直せません。

SCFX

2014.05.18 08:41:31.080カスタム インジケータ H_889_boring GBPUSD,H1: 削除しました。
2014.05.18 08:41:25.441 カスタムインジケータ H_889_boring GBPUSD,H4:ロード成功

 
scfx:

まだ直りません。

SCFX

それは、あなたが一生懸命にやっていないからです。

自分でやるには、コードの一行一行を調べ、分解して、それが何をしているのかを正確に把握する必要がありますし、その方法はいくつかあります。

for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) // what is this parentheses doing here ? How can you expect to write code that works if you are this sloppy about it ?
      boring[i]=Close[i];
    
}  

これらはすべて、問題の原因を見つけるためにあなたができることです。

  • ジャーナルタブをチェックしたということですが、その隣のエキスパートタブを見ましたか?
  • 先週、あなたのコードがarray out of rangeを引き起こしていることを既にお伝えしましたが、その意味を調べましたか?
  • メタエディタの中にデバッガがあるので、それを使ってデバッグする方法を学んでみてください。
  • Print()を使えば、コードを実行したときに変数の値がどうなっているかをチェック
  • することができます。

エキスパートタブをクリックすると、あなたのインジケータがこの行でゼロ除算をしたことがわかりますが、タイムフレームを変更しても何の関係もありません。

if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50

ということは、このHigh[i]-Low[i]が何らかの理由でゼロになったということでしょう。チャート上のインジケータを見ると、インジケータはいくつかの値を描画した後、1ティックしかないバーで停止しています。 1ティックしかない場合、high[i] == low[i] なので、ゼロ除算が発生することになります。

ここで、high[i]-low[i]がゼロの場合に使用されないことを確認してください。

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---
   for(int i=1;i<=limit  ;i++)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    
    if( MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50 ) 
    {boring[i]=Close[i];
   }}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

エキスパートタブによると、ゼロ除算は行われませんでしたが、この行でarray out of rangeエラーが発生したことがわかります。

if(high[i] - low[i] == 0)  

では、ループをテストするためにすべての計算と条件を取り除いたらどうなるでしょうか?

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit  ;i++)
   { 
    boring[i]=Close[i];
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

今度はこの行で、エキスパートタブが再びarray out of rangeを報告しています。

boring[i]=Close[i];

これで、ループ内で価格配列が使用されるたびに、コードが配列の範囲外を引き起こすことがわかったと思います。ループの何が問題なのか、なぜClose[i], Low[i], High[i]が範囲外なのかを考えてみてください。このインジケータはチャートの最後まで描画されるので、エラーは最後の方、つまり配列の最高インデックスにあるはずです。

   int limit=rates_total-prev_calculated; // what is the value of limit in this calculation when prev_calulated == 0 ?
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit;i++) // how does the value of limit compare with the highest available Close[] array index ?

まず正しく動作するループのコーディング方法を学ぶことなく、インジケータを作ろうとしているように見えます。このような場合、どのようにすればよいのか、たくさんの例があります。付属のインジケーターのコードを見て、どのように動作するかを正確に理解するまで実験し、その後、計算を実行させる前に、正しく動作する単純な一本の線を引くインジケーターを作ってみてください。
 

@ scfx

直せるのはあなただけです。または、https://www.mql5.com/en/job

にアクセスし、そこにジョブを投稿してください。

 
SDC:
...

SDCさん、正しいことでもそんなに厳しく言う必要はないですよ。
 
angevoyageur:

SDCさん、正しいことでもそんなに厳しく言う必要はないですよ。

笑 ちょっと言い直しました ;)

 

すみません、誤解を与えてしまいました、申し訳ありません、インジケータはそのようにコーディングすることができます。

int limit = -1;
   if( prev_calculated == 0 ) limit =  rates_total - 3000;// will calculate 3000 Bars
  if( prev_calculated > 0 )   limit = rates_total-prev_calculated;

 for(int i=limit;  i>=0; i--)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    

// Please test it, check if it's OK;
// Put the indicator in a backtest EA, say MACDSample, to check it
 

チャートのバーが3000本以下であれば、まだ範囲外 です。