【FX自動売買】EA入門 ペアごとに異なるpipsの桁数を合わせる【MT4】

FX 自動売買(EA)

MT4をまだダウンロードしていない方はこちらのページでダウンロード方法を案内しているので、事前にMT4を用意しておいてください。

今回作っていく関数の概要

通貨ペアの中には価格を表示するのに4桁の数値を使っているところや5桁の数値を使っているところなど、ペアによって価格の表記方法が異なります。つまり同じ価格でも1.5000のように表示されていたり、1.50000のように表示されている場合があるのです。もしpipsを表すために、pips=0.0001などという風に固定していると、別の通貨ペアによっては1pipsを表すつもりが10pipsになってしまったりする場合もあります。

取引通貨ペアによって異なるそれらの表示形式に影響されずに、pips情報を取得するには、小数点以下が4桁の場合には0.0001を取得し、5桁の場合には0.00001を取得するようにできる関数が必要になってきます。今回はその役割を担うPipsFunction()という関数を作成していきます。

今回は先におおまかな関数の仕組みをざっくりと説明します。

実装にあたって、double型のグローバル変数pipsを宣言します。pipsには通貨ペアごとに1pipsをあらわす値を代入しますが、この値が毎回異なるので、それを今回の関数の中で適切な値が代入されるようにしていきます。

重要な点として、この変数にint型の変数をかけることによって、求めたいpipsに変換することができるということです。例えばこれを使って損切りや利確のための幅をpipsで指定することができるようになります。

あとから値を自由に変更できるexternのint型の変数StopLossに50を代入しておけば、50pipsで損切りさせることができるようになります。ただしこのままではただ整数の50を表す変数なので、この変数と変数pipsをかけることで、実際に50pipsを表す値を生成することができます。

この関数はOnInit()関数内で利用し、プログラム起動時に一度のみ実行されるようにします。この関数の最終的な目的はグローバルエリアに宣言したpipsという変数に適切な値を代入し、StopLossやTakeProfitなどがちゃんとpipsを表せるようにすることです。

コードの確認

以下がPipsFunction()のコードになります。

void PipsFunction() //1
{
double ticksize=MarketInfo(Symbol(),MODE_TICKSIZE); //2
   if(ticksize == 0.00001) //3
   {
   pips = ticksize*10; //4
   }
   else
   {
   pips = ticksize; //5
   }
return;
}

順番に解説していきます

  1. まずはいつもどおり関数の宣言からです。戻り値は特にないので、voidとし、関数名をPipsFunction()とします。
     
  2. ticksizeというdouble型の変数を宣言します。これにはMarketInfo(Symbol(),MODE_TICKSIZE)を代入します。MarketInfo()関数はマーケットから情報を取得するための関数で、今回は5桁表示するペアであれば0.00001を、4桁であれば0.0001を取得します。
     
  3. if文で先程代入したticksizeが5桁かチェックしています。もし先程0.00001がticksizeに代入されていれば、5桁の通貨ペアです。その後ticksizeに10をかけた値をグローバルエリアに宣言しておいた変数pipsに代入します。もしticksizeが0.0001であれば、これは4桁の通貨ペアということになるので、そのままpipsに代入します。
     
  4. 5桁だった場合に10をかけてpipsに代入しています。
     
  5. 4桁だった場合はpips=ticksizeとし、そのままticksizeを利用します。上のif文がfalse、つまり5桁でない場合のみにelseの中が実行されるので、必然的に4桁ということになります。
extern double TakeProfit=0.0050;
extern double StopLoss=0.0025;
extern double LotSize=0.01;

double pips = 0; //ここでグローバル変数としてpipsを宣言している
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PipsFunction(); //OnInit内でプログラム起動時に一度だけ実行
//---
   return(INIT_SUCCEEDED);
  }

pips変数は他の関数内でも使われる変数なので、グローバルエリア(どの関数にも所属していない場所)に宣言することで、グローバル変数としてどの関数内でも使うことができるようになります。

この関数は最初に一度だけ実行できればいいので、OnInit()内におきます。プログラムの初期化時に実行され、pips変数に適切な値が代入されることで、他の関数内で損切り値や利確値を計算させるのに使うことができるようになります。

例えば、プログラムの起動前、pips変数には0が入っています。ストラテジーテスターでこのEAを起動するとプログラムが実行され、OnInit()関数が完了したときにPipsFunction()が呼び出され、pips変数に値が代入されます。

まとめ

今回は通貨ペアごとに桁数が異なる場合でもpipsを合わせるための関数、PipsFunction()の作り方を解説しました。

この関数はOnInit()内で初期化時に一度だけ実行させれば、pips変数に適切な値が代入され、正しい損切りや利確値を計算することができます。

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました