価格の単位変換を簡単に変換できるモジュール

 価格の単位変換を実現するためのPriceモジュールを作成したのでご紹介します。

定義

 まずはじめに価格の種類について説明します。MT4で価格を扱うとき、価格には3種類あると私は考えています。

price単位

通常の価格。
Ask, BidやTP/SLの価格など。

例としては、110.500円、1.15500ドルなど。

pips単位

pips単位は人によって定義が異なる。
私の場合は1pipsを次のように考えている。

小数点以下の桁数が2桁または3桁の通貨ペア(ドル円など)の場合0.01
小数点以下の桁数が4桁または5桁の通貨ペア(ユーロドルなど)の場合0.0001

上記はいずれもFXの銘柄を対象とした場合の考え方である。
最近はMT4でもFX以外の銘柄(コモディティや指数、BTC)が取引できるため、上記に当てはまらないものもある。
それは別途定義する必要がある。 PriceモジュールではFXの通貨ペアみを対象としてしており、それ以外の銘柄に対しては別途対応できる仕組みを用意してある。

point単位

point単位はレートの最小桁数を1ポイントとして計算した場合の単位。
バックテストの時のスプレッド、発注時のスリッページ、待機注文のストップレベルなどで使われている。

1ポイントの計算は以下の通り。
小数点以下の桁数が3桁の場合、1pointはprice単位の場合0.001
小数点以下の桁数が5桁の場合、1pointはprice単位の場合0.00001

使い方

 Price.mqhの動作には、Assert.mqhとEnv.mqhが必要となります。この3つをGithubからダウンロードして、MQl4/Include/mql4_modules配下にそれぞれ保存してください。

ファイルを用意したら、Price.mqhをincludeして使用します。

#include <mql4_modules/Price/Price.mqh>

void OnTick()
{
   // Digitsが3桁、Askが110.000の例

   int    point1 = Price::PipsToPoint(10.0);  // 10.0[pips] -> 100[point]
   double price1 = Price::PipsToPrice(10.0);  // 10.0[pips] -> 0.1[price]
   double pips1  = Price::PointToPips(10);    // 10[point] -> 1[pips]
   double price2 = Price::PointToPrice(10);   // 10[point] -> 0.001[price]
   double pips2  = Price::PriceToPips(10.0);  // 10.0[price] -> 1,000[pips]
   int    point2 = Price::PriceToPoint(10.0); // 10.0[price] -> 10,000[point]
}

 Priceモジュールでは、メンバ変数scaleによってpips単位の計算を調整しています。scaleはpips単位とpoint単位の倍率を表す変数です。もし通貨ペアの小数点以下の桁数が2桁または4桁であればscaleは1となり、pips単位とpoint単位は同じと値となります。小数点以下が3桁または5桁の場合scaleは10となり、1pipsは10pointとして計算されます。

 しかしFX以外の銘柄では上記の計算ではpips単位の算出が上手くいかない場合があります。そこでscaleは設定が変更可能となっています。もしFX以外の銘柄に対応したEAを作成する場合には、setScaleメソッドを実行してscaleの調整を行ってください。

Price::setScale(100);
arrow_upward