CopyClose()関数シリーズを使えば良い
「他通貨ペアを使ったEAはMT4のストラテジーテスターではバックテストできないことが分かり、対応に苦労しました」という文章を前回の記事で記載しました。
これで困っている人が他にもいると思いますし、私自身またハマりそうなので、備忘録がてら記事にしました。
結論はズバリ見出しに書いちゃっています。CopyClose()関数シリーズを使えば、可能になります。
シリーズと言うのは、CopyOpen()、CopyHigh()、CopyLow()、CopyClose()の4関数の総称という意味です。
MT4 Build600以降で登場した関数で、昔は存在しませんでした。そのため、他通貨ペアを使ったEAはバックテストできないと結論づけている古い記事が存在しますが、2015/8/1現在では「できる」ですので、ご注意ください。
関数名で何となく動きのイメージは掴めると思います。端的に言えば、ある指定通貨ペア・時間枠の終値配列を別の配列にコピーするというものです。これを使えば、他通貨ペアの価格も取得できるのです。
CopyOpen()を使った実用的な関数を載せておきます。
//+------------------------------------------------------------------+ //|【関数】他通貨ペアの終値を取得する | //| | //|【引数】 IN OUT 引数名 説明 | //| --------------------------------------------------------- | //| ○ aSymbol 通貨ペア名 | //| ○ aTimeFrame 時間枠 | //| ○ aStartPos スタートの足の位置(0が現在足) | //| | //|【戻値】指定通貨ペア・時間枠の終値 | //| | //|【備考】なし | //+------------------------------------------------------------------+ double getOtherCurrencyClose(string aSymbol, int aTimeFrame, int aStartPos){ double buf[1]; int copyCount = 1; ArrayResize(buf, 1, 1); if(CopyClose(aSymbol, aTimeFrame, aStartPos, copyCount, buf) < 0){ return(0); } double res = buf[0]; ArrayFree(buf); return(res); }
パラメータとして、取得したい他通貨ペア名(USDJPY等)、取得したい時間枠、取得したい足の位置(0が現在の足の位置)を渡します。そうすると、指定通貨ペア・時間枠の終値を返します。
配列で返ってきて欲しいケースってあまり無いと思いますので、コピーする数を1に固定化することで、指定の位置の価格のみを戻すようにしています。
double USDJPYClose = getOtherCurrencyClose(USDJPY, 0, 0)のように関数を呼び出すことで、チャート時間枠の現在足のUSDJPYの終値を取得することができます。
CopyClose()関数の仕様については、こちらをご覧ください。