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を引き起こしていることを既にお伝えしましたが、その意味を調べましたか?
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 barif( MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50 )
{boring[i]=Close[i];
}}
//--- return value of prev_calculated for next callreturn(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 callreturn(rates_total);
}
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 ?
int limit = -1;
if( prev_calculated == 0 ) limit = rates_total - 3000;// will calculate 3000 Barsif( 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
説明ありがとうございました。
よくわかりました。
SCFX
こんにちは。
そのおかしなエラーに頭を抱えています。
この4行のシンプルなインジケータは、タイムフレームを変更すると消えてしまいます。
ここに投稿された提案をすでに適用しましたが、まだ失敗しています。
とても嫌な気分です・・・。
どうか私を助けてください。
ありがとうございました。
SCFX
こんにちは。
そのおかしなエラーに頭を抱えています。
この4行のシンプルなインジケータは、タイムフレームを変更すると消えてしまいます。
ここに投稿された提案をすでに適用しましたが、まだ失敗しています。
とても嫌な気分です・・・。
どうか私を助けてください。
ありがとうございました。
SCFX
ご返信ありがとうございます。
私のジャーナルでは、そのような通知はありませんが、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
それは、あなたが一生懸命にやっていないからです。
自分でやるには、コードの一行一行を調べ、分解して、それが何をしているのかを正確に把握する必要がありますし、その方法はいくつかあります。
これらはすべて、問題の原因を見つけるためにあなたができることです。
エキスパートタブをクリックすると、あなたのインジケータがこの行でゼロ除算をしたことがわかりますが、タイムフレームを変更しても何の関係もありません。
ということは、このHigh[i]-Low[i]が何らかの理由でゼロになったということでしょう。チャート上のインジケータを見ると、インジケータはいくつかの値を描画した後、1ティックしかないバーで停止しています。 1ティックしかない場合、high[i] == low[i] なので、ゼロ除算が発生することになります。
ここで、high[i]-low[i]がゼロの場合に使用されないことを確認してください。
エキスパートタブによると、ゼロ除算は行われませんでしたが、この行でarray out of rangeエラーが発生したことがわかります。
if(high[i] - low[i] == 0)
では、ループをテストするためにすべての計算と条件を取り除いたらどうなるでしょうか?
今度はこの行で、エキスパートタブが再びarray out of rangeを報告しています。
これで、ループ内で価格配列が使用されるたびに、コードが配列の範囲外を引き起こすことがわかったと思います。ループの何が問題なのか、なぜClose[i], Low[i], High[i]が範囲外なのかを考えてみてください。このインジケータはチャートの最後まで描画されるので、エラーは最後の方、つまり配列の最高インデックスにあるはずです。
まず正しく動作するループのコーディング方法を学ぶことなく、インジケータを作ろうとしているように見えます。このような場合、どのようにすればよいのか、たくさんの例があります。付属のインジケーターのコードを見て、どのように動作するかを正確に理解するまで実験し、その後、計算を実行させる前に、正しく動作する単純な一本の線を引くインジケーターを作ってみてください。
@ scfx
直せるのはあなただけです。または、https://www.mql5.com/en/job
にアクセスし、そこにジョブを投稿してください。
...
SDCさん、正しいことでもそんなに厳しく言う必要はないですよ。
SDCさん、正しいことでもそんなに厳しく言う必要はないですよ。
笑 ちょっと言い直しました ;)
すみません、誤解を与えてしまいました、申し訳ありません、インジケータはそのようにコーディングすることができます。
チャートのバーが3000本以下であれば、まだ範囲外 です。