本記事で公開しているライブラリーは公開当時のままで、古くなっております。最新版のライブラリーはメルマガ登録いただくことでダウンロードできます。
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 | //+------------------------------------------------------------------+ |
12 | double 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 | //+------------------------------------------------------------------+ |
13 | int 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 | //+------------------------------------------------------------------+ |
013 | extern int SlippagePips = 5; |
014 |
015 | //+------------------------------------------------------------------+ |
016 | //| グローバル変数 | |
017 | //+------------------------------------------------------------------+ |
018 | double gPipsPoint = 0.0; |
019 | int gSlippage = 0; |
020 |
021 | //+------------------------------------------------------------------+ |
022 | //| Expert initialization function | |
023 | //+------------------------------------------------------------------+ |
024 | int 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 | //+------------------------------------------------------------------+ |
039 | void OnDeinit( const int reason) |
040 | { |
041 | } |
042 |
043 | //+------------------------------------------------------------------+ |
044 | //| Expert tick function | |
045 | //+------------------------------------------------------------------+ |
046 | void OnTick() |
047 | { |
048 | } |
049 |
050 | //+------------------------------------------------------------------+ |
051 | //|【関数】1pips当たりの価格単位を計算する | |
052 | //| | |
053 | //|【引数】 IN OUT 引数名 説明 | |
054 | //| --------------------------------------------------------- | |
055 | //| ○ aSymbol 通貨ペア | |
056 | //| | |
057 | //|【戻値】1pips当たりの価格単位 | |
058 | //| | |
059 | //|【備考】なし | |
060 | //+------------------------------------------------------------------+ |
061 | double 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 | //+------------------------------------------------------------------+ |
097 | int 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 | } |