こんばんは、たかはしです。
僕のブログ、開発者さんも数名読んでくれているようなので、ちょっとデバッグの方法について書いてみます。
とある読者さんからコード解析とか色々相談を貰っていたりするんですが、原因追求の方法にちょっとしたコツがあるんです。
他の人も同じことで悩んでいたりするんじゃないかと思って、情報をシェアできたらと思います。
例えば、EAを作ったけどなかなか注文が通らない、矢印でシグナル状況を確認するインジケーターを作ったけど画面に表示されない。
コンパイルは通って、エラーはない。
でも、表示されない、動かない。
こんな経験ありますよね・・・?
実際にコードで説明したほうがわかりやすいので、例えばこんなコードがあったとします。
//ループ for(i = 0; i < limit; i++) { //シグナル double macd = iMACD(NULL,0,12,168,15,PRICE_CLOSE,MODE_MAIN,i); double signal = iMACD(NULL,0,12,168,15,PRICE_CLOSE,MODE_SIGNAL,i); double ma = NormalizeDouble(iMA(NULL,0,168,0,MODE_EMA,PRICE_CLOSE,i),3); double ma1 = NormalizeDouble(iMA(NULL,0,168,0,MODE_EMA,PRICE_CLOSE,i+1),3); //買いシグナル判定 if(ma<ma1 && macd>signal) { CrossUp[i]=Open[i]; continue; } //売りシグナル判定 if(ma>ma1 && macd<signal) { CrossDown[i]=Open[i]; continue; } }
上記ににデバッグを仕込んだのが下記になります。
仕込んだ箇所はコンソールに出力されますので、実際にプログラムがそのコードを通過したかどうかが分かります。
この条件分岐って入ってるのかな?とか、iMACDで取れる値ってどんな値なのかな?とかが分かるようになるので、原因特定しやすくなります。
なんか怪しいなと思う所で、デバッグを埋め込めばまぁまぁの確率で解決します。
//ループ for(i = 0; i < limit; i++) { Print("ループ回数:"+i); //シグナル double macd = iMACD(NULL,0,12,168,15,PRICE_CLOSE,MODE_MAIN,i); double signal = iMACD(NULL,0,12,168,15,PRICE_CLOSE,MODE_SIGNAL,i); double ma = NormalizeDouble(iMA(NULL,0,168,0,MODE_EMA,PRICE_CLOSE,i),3); double ma1 = NormalizeDouble(iMA(NULL,0,168,0,MODE_EMA,PRICE_CLOSE,i+1),3); Print("MACD"+macd); Print("SIGNAL"+signal); Print("MA"+ma); Print("MA1"+ma1); //買いシグナル判定 if(ma<ma1 && macd>signal) { Print("買いシグナル分岐突入"); CrossUp[i]=Open[i]; continue; } //売りシグナル判定 if(ma>ma1 && macd<signal) { Print("売りシグナル分岐突入"); CrossDown[i]=Open[i]; continue; } }
と、知っている人なら当然知っているやり方でも、知らない人からすれば思いもよらない事もあったりするので、こういうやり方でデバッグすると開発がぐっと楽になるし、実力もついてくると思います。
MQLの開発環境はしょぼいので、デバッグがこんな感じになりますが、もっと普通のプログラム開発環境なら色々デバッグの方法もあったりして結構面白いですよ(´∀`*)