MQL4のdouble型の比較に注意する話

過去の日記より転載。

今日はMQL4初心者がハマる罠の1つ、"double型の比較"について紹介します。
変数 a には 1.2693 (EUR/USD)という価格が入っていて、
変数 b には、とある魔術の計算式から 1.2693 という値が入っている場合。

もし a==b なら何か処理をする.. という場合に、
if(a == b) { 何かの処理;}
と書いてしまうと、aもbも1.2693 なのに、処理が行われない???? という現象が起きることがあります。

ウソだと思う人は、

double a=1.2693;
double b=1269299999.9999998/1000000000;
if(a==b){Alert("OK ! ");}else{ Alert(a+" "+b);}


というコードを実行してみてください。
この例では、aとbは一致しないので、後段のAlertが実行されるのですが、そこで表示されるa,bは完全に一致しています。

こうして、、、Printデバッグでaとbが一致してるのに、なんで OK!がでないんや?@@;;;;
とハマる訳です。




こういう現象を避ける為の正しい書き方は、

if(NormalizeDouble(a-b,8)==0) Alert("OK ! ");

です。


MetaQuotes社は初心者に優しく、とても親切なので、stdlib.mq4 のなかに、
double型の比較用関数 CompareDoubles や、
double型の真の値を表示させる為の DoubleToStrMorePrecision を用意しています。16桁までの正確な値を見ることが出来ます。


興味のある人は見てみてください。

ソースをカラー印刷する

むか〜し書いた日記から転載・・・。

今日は、MQL4のソースコードをカラー印刷するテクニックの紹介です。

MetaEditor上では、カラフルにキーワードが色づけされていても、そのまま Print してしまうと白黒になってしまうのには、がっかりしますよね。
これでは、ペーパーデバッグする気持ちも萎えてしまうというものです。

この手の問題を解決する常套手段としては、
(1)画面キャプチャして画像として印刷する。(ぉぃ
(2)notepad++ のようなキーワード色づけ印刷可能なエディタを使う

があります。
(1)は、手間も掛かるので最後の手段でしかないですし、(2)は、MetaEditor と同じ色づけにならないと ちょっと嫌ですよね。
多数のファイルを印刷したいのなら、(2)で、MetaEditor と同じ色づけになるように設定して使うのがよいと思います。

どっちも面倒だぁという人には次の手段があります。
(3)mq4 ファイルをHTML化して印刷する。

MetaEditorの File -> Save As... で、保存する際に、「ファイルの種類」としてHTML files を選択します。ファイル名の拡張子 mq4 を取り除いて保存すれば出来上がります。あとは、お好みのブラウザで印刷すればOKです。