2019年3月8日金曜日

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

@MetaTrader 4.00 Build 1170 (20 Dec 2018)

SymbolInfoDouble(), SymbolInfoInteger(), SymbolInfoString() 等の関数はストラテジーテスターの中では動作しない時があるので注意が必要です。

通貨ペアで指定した通貨以外の情報は SymbolInfo では取得できない

具体的には、ストラテジーテスターの「通貨ペア」で指定した通貨と関数で指定した通貨が異なる場合です。

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

1
2
Print("SymbolInfo: ", SymbolInfoDouble("EURUSD", SYMBOL_POINT));
Print("MarketInfo: ", MarketInfo("EURUSD", MODE_POINT));

結果は以下のようになります1

MarketInfo: 1e-05
SymbolInfo: 0.0

ご覧のように MarketInfo() は問題なく取得できています。 ただし、この MarketInfo() も特定の条件が整わないと値を取ることはできません。

MarketInfo も取得できない時がある

MarketInfo() でも値が取得できないのは、気配値表示ウィンドウに表示されておらず、かつストラテジーテスターの「通貨ペア」で指定していない場合です。

例えば、以下のように、気配値表示ウィンドウに「EURUSD」を非表示にした状態で、上記と同様のストラテジーテスターを走らせます2

結果は以下のようになります。

MarketInfo: 0.0
SymbolInfo: 0.0

ただし、起動後一度でもストラテジーテスターで対象の通貨3を指定していると、値が取得できるようです。 データのキャッシュが残っているためだと思われますが、正確にはよくわかりません。

他の条件はよくわかりませんが、気配値表示ウィンドウに表示されていれば MarketInfo() の情報は取れるようです。 表示し忘れに気をつけましよう。

なお、気配値表示ウィンドウから通貨を削除してしまうとリアルEA実行中も MarketInfo() の情報が取れなくなってしまいます4。 こちらも気をつけましょう。

  1. 後述のように、環境によって結果が異なります 
  2. 通貨ペアは「USDJPY」 
  3. 例だと「EURUSD」 
  4. SymbolInfo は気配値表示ウィンドウになくても取れる 
?