MT4のシンボル(通貨ペア)名

メタトレーダー4で取り扱う通貨ペア名(プログラム中ではSymbol()で参照)は、通常は、「USDJPY」、「EURUSD」のように、アルファベット6文字で構成されています。
ところが、業者によっては、「USDJPYm」「USDJPYx」「USDJPYFXF」「USDJPYjpy」のように、6文字の通貨ペア名の後に数文字のアルファベットが追加されているケースもあります。
プログラム中で「Symbol()」を使って通貨ペア名を指定している場合は特に問題ありませんが、複数の通貨ペアから別の通貨ペア名を作る場合にはちょっと工夫する必要があります。
例えば、「FXメタトレーダー実践プログラミング」の382ページに対象通貨ペア名と資金の通貨名から別の通貨ペア名を作るプログラムがあります。
   string symbol = StringSubstr(Symbol(), 0, 3) + AccountCurrency();
ここで、Symbol()="EURUSDx"、AccountCurrency()="JPY" の場合、"EURUSDx"の先頭3文字と"JPY"が連結されて symbol="EURJPY"となります。
しかし、通貨ペア名の最後に「x」がついている業者では、「EURJPY」という通貨ペアは存在しないため、プログラムが正しく動作しません。
ですから、この場合、最後に「x」がつくように、
   string symbol = StringSubstr(Symbol(), 0, 3) + AccountCurrency() + "x";
と書く必要があるのです。あるいは、どういうケースにも対応できるようにするために、
   string symbol = StringSubstr(Symbol(), 0, 3) + AccountCurrency() +
              StringSubstr(Symbol(), 6, StringLen(Symbol())-6);
と書くこともできます。
最後に付けた部分がちょっと複雑ですが、StringLen()という関数は、パラメータの文字数を返します。ですから、StringLen(Symbol())-6は、通貨ペア名の6文字より多い部分の文字数になります。例えば、最後に「x」が」つく場合、1、「XFX」がつく場合、3となります。そして、StringSubstr()を使って、通貨ペア名の6文字目以降で6文字より多い部分を取り出すわけです。
他に通貨ペア名に余分な文字がついて困るのは、同じEAを複数の業者のMT4で動かす場合でしょう。
もし、そのEAで通貨ペア名のチェックを行う場合、通貨ペア名全体をチェックするより、最初の6文字だけをチェックするようにした方がいいでしょう。
例えば、あるEAを「EURJPY」の通貨ペアのチャートだけで動かしたい場合、
   if(Symbol() != "EURJPY") return(1);
では、通貨ペア名が「EURJPYx」のMT4では、チェックできません。通貨ペアに余分な文字がついている場合にも対応するためには、
   if(StringSubstr(Symbol(), 0, 6) != "EURJPY") return(1);
 
として最初の6文字だけをチェックした方が確実でしょう。但し、最初の部分が「EUR/JPY」のように変わってしまうケースには対応できませんので、注意してください。



コメントは受け付けていません