
最近、色々な方からEAやインジケータの開発依頼を頂く様になったのですが、
・MT4のEAで複数通貨に対して一括して売買を行いたい
・複数の通貨ペアの情報を取得して指標を作り、その結果を元にした売買ロジックをMT4で作りたい
というご要望が結構多いです。
こういったものを総称してマルチ通貨ストラテジーと呼んでいますが、
今回はその実現性についてまとめたいと思います。
結論
から先に申し上げると、「MT4での実装は非常に難しい」です。
できなくはありませんが、いくつかの課題があり、実装、検証に困るケースが多くあります。
バックテストが出来ない
これが致命傷と言っても良いのですが、
プログラム開発を行っても、その動作検証や性能検証のために行うバックテストが正常に動作しません。
例えば、チャートの通貨ペアに USDJPY を指定し、USDJPY, EURUSD に対して注文を発行するようなEAがあったとします。
このEAをストラテジーテスターで実行しても USDJPY 分の注文しか結果が表示されません。
ではEURUSD に対する注文がどうなるかというと、
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
}
else
Print("OrderSend placed successfully");
注文用の処理 OrderSend のエラーをGetLastErorで取得してみると、
[OrderSendError] : 4106 unknown symbol
というエラーが発生します。
こういったEAは、複数通貨ペアの合計の成績をもって総合的に評価したいところですが、
1通貨ペア分の結果だけでは適切な判断が下せません。
インジケータ値が正しく取得できない
通貨強弱系のインジケータなど、複数通貨ペアのレート情報を元に指標を作り出すようなインジケータを元に
売買ロジックを作成したい場合。
これもバックテストではインジケータ値が正しく取得できません。
ストラテジーテスターでは、 fxtファイルという疑似的なTick情報を保有したレート情報を元にバックテストが実行されます。
([mt4_root]\tester\history\ 配下に作成されます)
通常、指定した通貨ペアのfxtファイルがローカル環境に存在しない場合、一定範囲が自動でダウンロードされますが、
インジケータが参照する通貨ペア分のfxtファイルが自動で生成されるかというと、生成されません。
色々試した結果、 インジケータが参照しているのは fxtファイルではなく .hstファイル(チャート上に表示されるレート情報を持つファイル)
を参照していることが分かり、(とある通貨強弱系インジケータでの確認結果のため、全てにおいて同一仕様であるかは不明ですが)
関連する通貨ペアの.hstファイルの用意が必要ですが、
既成品のインジケータによっては、どの通貨ペア/期間を参照するのか不透明なこともあり、
自分が必要であろうと思った.hstファイルを集めても本番の値通りにならないこともあります。
通貨ペア情報が取得できない
やむを得ず、無理やり実装しようとするならば
各通貨ペアのレート情報を取得し、Bid値とAsk値が取得できるならば
それらを元に内部的に売買レートを判定し、ファイルなどに結果を出力する方法も考えられますが、
iClose, iOpenなどのレート取得関数で取得できるレートは Bid値のため、これをAsk値へ変換するため
スプレッド情報を取得するべく
MarketInfo("EURUSD",MODE_SPREAD)
とすると、、
なんと、これもストラテジーテスター上で動作箚せた場合、チャート指定通貨以外の値が取得できません。。
つまり、外部からスプレッド情報を与えてあげないと、Ask値ひとつ満足に取得できません。
まとめ
総合的に見て「労力に見合わない」不毛な実装を沢山すればやれなくもないのですが、
本来のビジネスロジックを作り込む以外の部分(付帯作業的なもの)に多くの時間と費用をかけるのは
非常にもったいないと思うのです。