2019年3月8日金曜日

[MQL4] ストラテジーテスターの中では SymbolInfo や MarketInfo が取得できない時がある

@MetaTrader 4.00 Build 1170 (20 Dec 2018)

[SymbolInfoDouble()](https://docs.mql4.com/marketinformation/symbolinfodouble), [SymbolInfoInteger()](https://docs.mql4.com/marketinformation/symbolinfointeger), [SymbolInfoString()](https://docs.mql4.com/marketinformation/symbolinfostring) 等の関数はストラテジーテスターの中では動作しない時があるので注意が必要です。



### 通貨ペアで指定した通貨以外の情報は SymbolInfo では取得できない
具体的には、ストラテジーテスターの「通貨ペア」で指定した通貨と関数で指定した通貨が異なる場合です。

例えば、以下のように、ストラテジーテスターの「通貨ペア」を「USDJPY」にして、EA内で「EURUSD」の情報を取ってみます。

```mq4 Print("SymbolInfo: ", SymbolInfoDouble("EURUSD", SYMBOL_POINT)); Print("MarketInfo: ", MarketInfo("EURUSD", MODE_POINT)); ``` 結果は以下のようになります後述のように、環境によって結果が異なります。 ```text `gutter: false; MarketInfo: 1e-05 SymbolInfo: 0.0 ``` ご覧のように [MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) は問題なく取得できています。 ただし、この `MarketInfo()` も特定の条件が整わないと値を取ることはできません。 ### MarketInfo も取得できない時がある `MarketInfo()` でも値が取得できないのは、気配値表示ウィンドウに表示されておらず、かつストラテジーテスターの「通貨ペア」で指定していない場合です。 例えば、以下のように、気配値表示ウィンドウに「EURUSD」を非表示にした状態で、上記と同様のストラテジーテスターを走らせます通貨ペアは「USDJPY」
結果は以下のようになります。 ```text `gutter: false; MarketInfo: 0.0 SymbolInfo: 0.0 ``` ただし、起動後一度でもストラテジーテスターで対象の通貨例だと「EURUSD」を指定していると、値が取得できるようです。 データのキャッシュが残っているためだと思われますが、正確にはよくわかりません。 他の条件はよくわかりませんが、気配値表示ウィンドウに表示されていれば `MarketInfo()` の情報は取れるようです。 表示し忘れに気をつけましよう。 なお、気配値表示ウィンドウから通貨を削除してしまうとリアルEA実行中も `MarketInfo()` の情報が取れなくなってしまいます`SymbolInfo` は気配値表示ウィンドウになくても取れる。 こちらも気をつけましょう。