1pips当たりの価格単位とポイント換算したスリッページを計算する関数

本記事で公開しているライブラリーは公開当時のままで、古くなっております。最新版のライブラリーはメルマガ登録いただくことでダウンロードできます。

EAの作成に必須であろう2つの共通関数を紹介します。

1pips当たりの価格単位を計算する関数

我々がトレード戦略を考える時、一般的にはpipsを使いますが、MQL4にはなぜかpipsという概念がありません。MQL4では直接価格を指定したり、Point(ポイント)と呼ばれる値を使います。

Point(ポイント)はMQL4で定義された変数で、通貨の最小価格単位です。例えば、小数点以下が3桁/5桁のFX業者の場合、1ポイント=0.001(円)/0.00001(円以外)=0.1pipsになります。小数点以下が2桁/4桁の場合は、1ポイント=0.01/0.0001=1.0pipsになります。

FX業者(小数点以下の桁数)や通貨ペアによって、Pointの返す値が異なるのがやっかいです。

EAのパラメータ設定にはpipsを使って、EA内部では、FX業者(小数点以下の桁数)や通貨ペアを意識せずに、円なら0.01単位、それ以外なら0.0001単位に変換できれば便利ですよね。

そこで最初に紹介するのが、1pipsあたりの価格単位を計算する関数です。この関数で得られた価格単位にpipsを掛けあわせることで、そのpipsに対応する価格が得られます。例えば、EAのパラメータ設定に5pipsと入力すると0.0005になるイメージです。

01//+------------------------------------------------------------------+
02//|【関数】1pips当たりの価格単位を計算する                           |
03//|                                                                  |
04//|【引数】 IN OUT  引数名             説明                          |
05//|        --------------------------------------------------------- |
06//|         ○      aSymbol            通貨ペア                      |
07//|                                                                  |
08//|【戻値】1pips当たりの価格単位                                     |
09//|                                                                  |
10//|【備考】なし                                                      |
11//+------------------------------------------------------------------+
12double currencyUnitPerPips(string aSymbol)
13{
14  // 通貨ペアに対応する小数点数を取得
15  double digits = MarketInfo(aSymbol, MODE_DIGITS);
16 
17  // 通貨ペアに対応するポイント(最小価格単位)を取得
18  // 3桁/5桁のFX業者の場合、0.001/0.00001
19  // 2桁/4桁のFX業者の場合、0.01/0.0001
20  double point = MarketInfo(aSymbol, MODE_POINT);
21 
22  // 価格単位の初期化
23  double currencyUnit = 0.0;
24 
25  // 3桁/5桁のFX業者の場合
26  if(digits == 3.0 || digits == 5.0){
27    currencyUnit = point * 10.0;
28  // 2桁/4桁のFX業者の場合
29  }else{
30    currencyUnit = point;
31  }
32 
33  return(currencyUnit);
34}

aSymbolには、”USDJPY”や”EURUSD”といった通貨ペアを表す文字列が入ります。3桁/5桁のFX業者の場合のみ10.0を掛けるのが重要です。

思い出してください。小数点以下が3桁/5桁のFX業者の場合、1ポイント=0.001/0.00001=0.1pipsで、2桁/4桁のFX業者の場合、1ポイント=0.01/0.0001=1.0pipsでした。10倍の違いです。従って、3桁/5桁のFX業者の場合のみ10倍することで、3桁/5桁か2桁/4桁かに関わらず、常に1pips当たりの価格単位(0.01/0.0001)が計算されることになります。

ポイント換算した許容スリッページを計算する関数

エントリー注文を送信する場合、許容スリッページを指定できるのですが、指定する際はpipsが良いですよね。ですが、MQL4はpipsを理解できません。理解できるのは価格かポイントのどちらかです。エントリー注文の送信では、許容スリッページをポイントで指定する必要があります。

というわけで、先程と同じように、FX業者(小数点以下の桁数)を考慮した、ポイント換算した許容スリッページを計算する関数を紹介します。

01//+------------------------------------------------------------------+
02//|【関数】ポイント換算した許容スリッページを計算する                |
03//|                                                                  |
04//|【引数】 IN OUT  引数名             説明                          |
05//|        --------------------------------------------------------- |
06//|         ○      aSymbol            通貨ペア                      |
07//|         ○      aSlippagePips      許容スリッページ(pips)      |
08//|                                                                  |
09//|【戻値】許容スリッページ(ポイント)                              |
10//|                                                                  |
11//|【備考】なし                                                      |
12//+------------------------------------------------------------------+
13int getSlippage(string aSymbol, int aSlippagePips)
14{
15  double digits = MarketInfo(aSymbol, MODE_DIGITS);
16  int slippage = 0;
17 
18  // 3桁/5桁業者の場合
19  if(digits == 3.0 || digits == 5.0){
20    slippage = aSlippagePips * 10;
21  // 2桁/4桁業者の場合
22  }else{
23    slippage = aSlippagePips;
24  }
25 
26  return(slippage);
27}

構造は先程と同じです。FX業者の小数点以下の桁数によって、許容スリッページの計算方法を切り替えています。

関数の戻り値は、ポイント換算された許容スリッページとなります。

サンプルEA

関数だけではイメージが沸きづらいと思いますので、サンプルEAを載せておきます。

001//+------------------------------------------------------------------+
002//|                                                       Sample.mq4 |
003//|                                     Copyright (c) 2014, りゅーき |
004//|                                            https://autofx100.com/ |
005//+------------------------------------------------------------------+
006#property copyright "Copyright (c) 2014, りゅーき"
007#property link      "https://autofx100.com/"
008#property version   "1.00"
009 
010//+------------------------------------------------------------------+
011//| EAパラメータ設定情報                                             |
012//+------------------------------------------------------------------+
013extern int SlippagePips = 5;
014 
015//+------------------------------------------------------------------+
016//| グローバル変数                                                   |
017//+------------------------------------------------------------------+
018double gPipsPoint = 0.0;
019int    gSlippage  = 0;
020 
021//+------------------------------------------------------------------+
022//| Expert initialization function                                   |
023//+------------------------------------------------------------------+
024int OnInit()
025{
026  gPipsPoint = currencyUnitPerPips(Symbol());
027 
028  gSlippage = getSlippage(Symbol(), SlippagePips);
029 
030  Print("1pips当たりの価格単位 = ", gPipsPoint);
031  Print("許容スリッページ = ", gSlippage, "ポイント");
032 
033  return(INIT_SUCCEEDED);
034}
035 
036//+------------------------------------------------------------------+
037//| Expert deinitialization function                                 |
038//+------------------------------------------------------------------+
039void OnDeinit(const int reason)
040{
041}
042 
043//+------------------------------------------------------------------+
044//| Expert tick function                                             |
045//+------------------------------------------------------------------+
046void OnTick()
047{
048}
049 
050//+------------------------------------------------------------------+
051//|【関数】1pips当たりの価格単位を計算する                           |
052//|                                                                  |
053//|【引数】 IN OUT  引数名             説明                          |
054//|        --------------------------------------------------------- |
055//|         ○      aSymbol            通貨ペア                      |
056//|                                                                  |
057//|【戻値】1pips当たりの価格単位                                     |
058//|                                                                  |
059//|【備考】なし                                                      |
060//+------------------------------------------------------------------+
061double currencyUnitPerPips(string aSymbol)
062{
063  // 通貨ペアに対応する小数点数を取得
064  double digits = MarketInfo(aSymbol, MODE_DIGITS);
065 
066  // 通貨ペアに対応するポイント(最小価格単位)を取得
067  // 3桁/5桁のFX業者の場合、0.001/0.00001
068  // 2桁/4桁のFX業者の場合、0.01/0.0001
069  double point  = MarketInfo(aSymbol, MODE_POINT);
070 
071  // 価格単位の初期化
072  double currencyUnit = 0.0;
073 
074  // 3桁/5桁のFX業者の場合
075  if(digits == 3.0 || digits == 5.0){
076    currencyUnit = point * 10.0;
077  // 2桁/4桁のFX業者の場合
078  }else{
079    currencyUnit = point;
080  }
081 
082  return(currencyUnit);
083}
084 
085//+------------------------------------------------------------------+
086//|【関数】ポイント換算した許容スリッページを計算する                |
087//|                                                                  |
088//|【引数】 IN OUT  引数名             説明                          |
089//|        --------------------------------------------------------- |
090//|         ○      aSymbol            通貨ペア                      |
091//|         ○      aSlippagePips      許容スリッページ(pips)      |
092//|                                                                  |
093//|【戻値】許容スリッページ(ポイント)                              |
094//|                                                                  |
095//|【備考】なし                                                      |
096//+------------------------------------------------------------------+
097int getSlippage(string aSymbol, int aSlippagePips)
098{
099  double digits = MarketInfo(aSymbol, MODE_DIGITS);
100  int slippage = 0;
101 
102  // 3桁/5桁業者の場合
103  if(digits == 3.0 || digits == 5.0){
104    slippage = aSlippagePips * 10;
105  // 2桁/4桁業者の場合
106  }else{
107    slippage = aSlippagePips;
108  }
109 
110  return(slippage);
111}

MT4の無料プログラミング講座

メルマガ登録して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG