ID非公開さん
2022/1/24 7:08
2回答
プログラミング初心者です。MQL4のエラーについての質問です。
プログラミング初心者です。MQL4のエラーについての質問です。 MT4に元から入っているFractalsのようなインジケーターを勉強して作っているのですが、どうしても理解できないエラーがあり、わかる方にご教示願いたいです。 先に、エラーが出たインジのコードを載せます。 ----------------------------------- int start() { Fractals(); return(0); } bool Fractal(int M,int P,int shift) { if(shift<P) return(false); if(shift>Bars-P) return(false); for(int i=1; i<=P; i++) { if(M==UP_POINT) { if(High[shift+i]>High[shift]) return(false); if(High[shift-i]>=High[shift]) return(false); } if(M==DN_POINT) { if(Low[shift+i]<Low[shift]) return(false); if(Low[shift-i]<=Low[shift]) return(false); } } return(true); } void Fractals() { int shift; int limit = Bars-1; int P=10; UpPts[0] = 0.0; UpPts[1] = 0.0; DnPts[0] = 0.0; DnPts[1] = 0.0; for(shift=limit; shift>1; shift--) { if(Fractal(UP_POINT,P,shift)==true) UpPts[shift]=High[shift]; else UpPts[shift]=0.0; if(Fractal(DN_POINT,P,shift)==true) DnPts[shift]=Low[shift]; else DnPts[shift]=0.0; } } ---------------------------------------- 以上のコードで、UpPts[]、DnPts[] をチャート上に矢印で表示するインジです。 void Fractals() 下4行目の「int P」の値を変更する事で、判断する山の大きさを変えられるのですが、p=1、2、10の3パターンのみ、「array out of range」のエラーが出て表示できません。 エラー自体は、bool Fractal(int M,int P,int shift) 下5行目の if(shift>Bars-P) を if(shift>=Bars-P) に修正したら出なくなったのですが、修正前の状態で、なぜpを1、2、10 にした3パターンのみエラーが出たのかがどうしてもわかりません。 修正前の状態でも、pを1~20まで試してみて、上記3パターン以外は問題なく表示されました。 if(shift>Bars-P)を修正したのは、shift=Bars-P の時に7行下のif(High[shift+i]>High[shift]) を計算しようとすると、i=p の計算の時に、High[shift+p]が存在しなくなると思ったからです。 ただ、そうなるのはPが1、2、10の時に限った事ではないので、全てエラーになるかと思うのですが、実際には上記のように修正前でも3パターン以外は表示されました。 面倒な内容で申し訳ないのですが、エラーの正確な原因を理解してないと、今後同じようなエラーに対処できませんし、今回の修正も本当にあっているのか不安なので、宜しくお願いします。
ChieBankマオさん コメントありがとうございます。実際のコードには上に #property や SetIndexBuffer() 等も勿論あるのですが、文字数の関係で載せれなかったので、メインコードだけ抜粋しました。ごめんなさい。 tre********さん 謎が解けてすごく納得しました!ありがとうございました。 今回はtre********さんをベストアンサーにします。 他にも、見て頂いたり考えてくださった皆様、ありがとうございました。
ベストアンサー
>なぜpを1、2、10 にした3パターンのみエラーが出たのかがどうしてもわかりません。 for(int i=1; i<=P; i++)ループの中にif(~)return(false);というコードがあり「常に最後まで回る訳では無い」事を認識すれば、「全てエラーになる」訳ではないと理解していただけるかと思います。 P=1(常に初回ループが最終ループとなる)は常にエラーになるかと思いますが、それ以外でエラーになるかならないかはHigh[]/Low[]の内容によると思います。テストするチャートの時間軸や通貨ペアを変更するとデータが変化しますので、エラーになるPの値も変化すると思います。 >エラー自体は、bool Fractal(int M,int P,int shift) 下5行目の if(shift>Bars-P) を if(shift>=Bars-P) に修正したら出なくなった 正解です。
1人がナイス!しています
ID非公開さん
質問者2022/1/25 5:00
for(int i=1; i\u003c=P; i++)ループの中で、windowの一番左のBarまでif条件に合わなかった場合のみ、最後の存在しないBarを調べようとしてエラーになる、という事ですね! その前にif条件に合ってfalseを返したら、ループが止まってその先は調べないから、エラーにならないという事ですね! 色々考えてずっとわからなかったので、とてもすっきりしました!! ありがとうございました!!
質問者からのお礼コメント
コメントつけたので2重になっちゃいましたが、本当に有難うございました!!
お礼日時:1/25 5:08