困った時のPrint デバッグ。

tano 2010/11/01 09:13
以前fai様がお作りになられた「ZeroZeroPrice.mq4」をいろいろ改造して利用させていただいております。
最近改悪だったためかラベルが点滅するようになりました。
いろいろつついては見たのですが、何が何やらもうお手上げです。
fai様の備忘秘録保管庫へまことに勝手ながらアップロードさせていただきました。
お時間がございましたら、どこが悪いのかご教授いただけませんでしょうか。
アップしたファイル
「3ZeroZeroPrice1.mq4」←これがそうです。
「3Tick_on_ChartSub.mq4」←これは特にはないのですが、現在私が使っているお気に入りの一つです。

プログラミングは、最初に文法の基本を覚えてからは、他人のコードを改造してゆくのが上達への早道だと思います。
そして、改造を重ねてゆくうちに、いつのまにか動かなくなったりするのはよくあることです。笑。
初心者の間は、正しく動くコードを必ずバックアップしておくと、こういう状況での原因追求が楽になります。
(本格的な開発になると、TortoiseSVNのようなバージョン管理ソフトで、改造履歴をさかのぼれるようにするのが普通です..。


さて、今回のデバッグ対象のファイルは3ZeroZeroPrice1.mq4です。パズルが好きな人は、自力で手直ししてみてください。修正後のファイルはここに置きました。


以下は私が行った手順です。




デバッグで最初にやるべきは、バグを再現することです。これが案外と難しいことがあって、相手の環境ではバグが起きるのに、こちらの環境では問題ない..ということが多々あります。バグ修正を頼む人は、どういう環境でどのような設定手順でバグが起きたのか?をプログラマに伝えると、とても喜ばれます。^^;

↑正しい表示
↓消えた表示

今回は、AUDUSDの4時間足で再現できたのでOKです。これが特定の業者の特定の銘柄でしか起こらないバグだった場合、それに気づくまでに何時間も掛かることもあるのです....。


バグが再現できたら、次は何が原因かを探します。
方法は2種類あって、処理内容におかしな所がないかコードを読み解いていく方法と、実際にバグが起きている状態での挙動を調べる方法があります。MQL4で初心者がはまりそうなバグであれば、素直に1行ずつ読めば気づくことが多いのですが、プライスタグが点滅する..なんて現象は初耳なので、後者の手段をとります。


それなりに整備された開発言語では、プログラムの実行中に、プログラム内の変数の値がいくつになっているか?表示できるデバッグ環境があります。MQL4 には、そんな便利な機能は無いので、Print 文を埋め込んで変数の値を確認するしかありません。

↑まずは、プライスタグの価格等にどんな値が入るのか確認します。

↑ログを見ると、 price の値が 1.07〜1.1 は正常ですが、その後、10〜50 という異常な値が入っていることに気づきます。


price の値は i で決まり、その i は、ZeroNum,ZeroValue,ap,base 辺りの変数で決まるので、次のステップではそれらの値を Print させます。

↑新規に Printを追加して、不要な Printをコメントアウトします。

↑ログを見ると、ZeroNum が 1 と 4 と交互に変わっていることが分かります。


ZeroNum が、どこで設定されているのかを調べると下記の部分にあたります。

↑これは、 gridspan が 0.005 でない場合のみ、gridspan=0.005,ZeroNum=1 としているので、
一度 gridspan=0.005に設定されると、今度は、gridspan=10.0,ZeroNum=4 に戻されてしまいます。


…という訳で、&& gridspan!=0.005 というコードを除去すれば解決です。