レートの小数点を3/5桁でログ出力する方法
Print()関数を使うことで、任意の情報をログファイルに出力できます。デバッグ目的で使うことが多いと思います。
if文等の条件判断が正しく行われているかを確認する際に、特に力を発揮してくれます。
先日、ある読者の方からの依頼でEAを作成していたのですが、その際、ティックごとのレートを確認する必要があり、Print()関数を使いました。
以下がその時に使ったコードです。
Print("Ask = ", Ask, " Bid = ", Bid);
説明は…不要ですよね。AskとBidのレートを表示するだけです。実行結果は以下の通りでした。
0 14:36:54 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.1314 Bid = 1.1311 0 14:36:54 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.1313 Bid = 1.131 0 14:36:54 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.1313 Bid = 1.131 0 14:36:54 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.1312 Bid = 1.1309 0 14:36:54 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.1311 Bid = 1.1308 0 14:36:54 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.1312 Bid = 1.1309 0 14:36:54 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.1311 Bid = 1.1308
問題ないように見えますが、FxProのEURUSDは小数点以下5桁まで存在します。でも、4桁目までしか出力されていません。
2行目と3行目のAskはどちらも1.1313ですが、恐らく5桁目は違うと思われます。3行目でif文の条件が成立したので、そう考えました。もし、完全に同一値なら、2行目で成立するはずですから。
NormalizeDouble()関数なんかも使ってみましたが、現象変わらず。
困ったなーと色々ググっていたら、DoubleToString()関数を発見。こいつの存在をすっかり失念していました。
で、DoubleToString()関数を使って改良したコードが以下です。
Print("Ask = ", DoubleToString(Ask, Digits), " Bid = ", DoubleToString(Bid, Digits));
こいつで再実行したところ、以下の期待通りの結果を得られました!
0 14:48:04 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.13142 Bid = 1.13112 0 14:48:04 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.13126 Bid = 1.13096 0 14:48:04 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.13130 Bid = 1.13100 0 14:48:04 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.13123 Bid = 1.13093 0 14:48:04 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.13115 Bid = 1.13085 0 14:48:04 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.13119 Bid = 1.13089 0 14:48:04 2015.02.02 00:00 EA-name EURUSD,M1: Ask = 1.13109 Bid = 1.13079
やっぱり、2行目と3行目のAskは異なる値でしたね。これできちんとアルゴリズムを検証できます♪