スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | CM(-) | --/--/--(--) --:--

MQL4入門|15分でMQL4の基本をマスター【インジケータ(Indicator)編】

15分でMQL4の基本をマスター

当記事ではMQL4におけるインジケータ作成について、C言語をある程度理解している方々が15分で基本をマスターできるようにまとめています。


MQL4のソースで説明

習うより慣れろということで、MQL4のソースを実際に見ながら理解をしていきましょう。

//+------------------------------------------------------------------+
//|                                         MQL4_Indicator_Study.mq4 |
//|                       MetaTrader(メタトレーダー)で永久に稼ぐ! |
//|                                http://winnerlife.blog35.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "MetaTrader(メタトレーダー)で永久に稼ぐ!"
#property link      "http://winnerlife.blog35.fc2.com/"


/*------------------------------------------------------------------*/
/*(1)プロパティの記述方法                                        */
/*------------------------------------------------------------------*/
/*プロパティでは、インジケータの根幹部分を定義します。*/
/*①インジケータを表示するウィンドウを指定します。*/
//分割した別ウィンドウにインジケータを表示する
#property indicator_separate_window 
//チャートウィンドウにインジケータを表示する
//#property indicator_chart_window

/*②インジケータの描画データを格納するバッファの数を予約します。*/
#property indicator_buffers 4 /*最大8*/

/*③描画データの描画色を指定します。*/
/*(②にて予約したバッファの描画色を指定します)*/
//MQL4で定義済みの色名を使用することができます。
#property indicator_color1 Red
#property indicator_color2 Lime
#property indicator_color3 Yellow
//配色にこだわる場合はRGBで指定することもできます。
#property indicator_color4 C'200,128,150' 


/*------------------------------------------------------------------*/
/*(2)パラメータの記述方法                                        */
/*------------------------------------------------------------------*/
/*パラメータは、以下の形式で記述します。*/
/*修飾子:extern  型名:intなど  変数名:任意に決めた名前*/
/*パラメータ値は、インジケータのプロパティから変更することができます。*/
extern int       data_int      = 0;
extern bool      data_bool     = True;
extern datetime  data_datetime = D'2012.08.22 13:37';
extern color     data_color    = Red;
extern double    data_double   = 1.1;
extern string    data_string   = "MetaTrader4のMQL4を最速でマスター";


/*------------------------------------------------------------------*/
/*(3)グローバル変数の記述方法                                    */
/*------------------------------------------------------------------*/
/*グローバル変数は、描画データなど常に保持しておきたいデータを
格納するために使用します。*/
/*ここでは、(1)②にて予約した4個のバッファのデータを
実際に格納する配列を用意します。*/
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];


/*------------------------------------------------------------------*/
/*(4)初期化関数の記述方法                                        */
/*------------------------------------------------------------------*/
/*初期化関数は、インジケータの起動時(チャートに追加したとき)に
1回だけ実行されます。*/
/*このため、最初の1回だけ実行するだけで良い内容
(描画データの表示方法など)を記述します。*/
int init()
{
   /*1個目のバッファに対して、描画方法を指定します。*/
   SetIndexStyle(0,DRAW_LINE); //描画方法:線
   /*1個目のバッファとグローバル変数を紐付けます。*/
   SetIndexBuffer(0,ExtMapBuffer1);
   
   /*2個目のバッファに対して、描画方法を指定します。*/
   SetIndexStyle(1,DRAW_SECTION); //描画方法:不連続な点を結ぶ線
   /*2個目のバッファとグローバル変数を紐付けます。*/
   SetIndexBuffer(1,ExtMapBuffer2);
   /*2個目の描画線に対して、空値を設定します。*/
   SetIndexEmptyValue(1,0.0);
   
   /*3個目のバッファに対して、描画方法を指定します。*/
   SetIndexStyle(2,DRAW_HISTOGRAM); //描画方法:ヒストグラム
   /*3個目のバッファとグローバル変数を紐付けます。*/
   SetIndexBuffer(2,ExtMapBuffer3);
   
   /*4個目のバッファに対して、描画方法を指定します。*/
   SetIndexStyle(3,DRAW_ARROW); //描画方法:矢印
   SetIndexArrow(3,217); //矢印の種類を指定します。
   /*4個目のバッファとグローバル変数を紐付けます。*/
   SetIndexBuffer(3,ExtMapBuffer4);
   /*4個目の描画線に対して、空値を設定します。*/
   SetIndexEmptyValue(3,0.0);

   //インジケータ名を設定します。
   IndicatorShortName(data_string);

   return(0);
}


/*------------------------------------------------------------------*/
/*(5)終了化関数の記述方法                                        */
/*------------------------------------------------------------------*/
/*終了化関数は、インジケータの終了時(チャートから削除したとき)に
1回だけ実行されます。*/
/*このため、最後の1回だけ実行するだけで良い内容
(作成したオブジェクトの削除など)を記述します。*/
int deinit()
{
   return(0);
}


/*------------------------------------------------------------------*/
/*(6)開始関数の記述方法                                          */
/*------------------------------------------------------------------*/
/*開始関数は、値動きの度に(1ティックごとに)実行されます。*/
/*このため、値動きの度に実行が必要な内容
(描画データの計算など)を記述します。*/
int start()
{
   /*---------------------------------------------------------------*/
   /*①計算に使用するバーの数を取得する基本パターン                 */
   /*---------------------------------------------------------------*/
   //チャート上の変化していないバーの数を取得します。
   int counted_bars = IndicatorCounted(); 
   int limit;

   //チャート上の変化していないバーの数が取得できた場合
   if(counted_bars > 0)
   {
      /*変化していないバーの数から1を引きます。
        これは、新規バーの1つ前の最終ティックが計算されないのを
        回避するための対処です。
        つまり、直近から2つのバーを再計算させるための対処です。
        ※MQL4 Referenceに記載されている内容です。*/
      counted_bars--;
   }
   //異常値の場合
   else if(counted_bars < 0)
   {
      return(-1); //インジケータを終了する。
   }
   //0の場合(初回起動時またはオフライン)は対処不要
   else
   {
      //Do Nothing
   }

   /*limit変数にBars(チャート上の足の数)からチャート上の
     変化していないバーの数を引きます。
     インジケータ起動時:counted_barsが0となるため、
     全バーが計算されます。
     上記以降:基本的にlimit変数には、2が入ることになります。
     ※MAなど計算期間がある場合は、counted_bars変数に対して
     計算に必要な期間を引く必要があります。*/
   limit = Bars - counted_bars;


   /*---------------------------------------------------------------*/
   /*②描画データを計算する基本パターン                             */
   /*---------------------------------------------------------------*/
   /*描画データの計算は、最新のバーが0から始まるため、for文を使って
     limit変数の値以上になるまでループさせるのが基本です。*/
   for(int i=0; limit > i; i++)
   {
      /*この中に独自のテクニカルのロジックを記載します。*/

      //線のデータ格納
      ExtMapBuffer1[i] = Close[i];
      
      //不連続な点を結んだ線のデータ格納
      if(Close[i] > Close[i+1])
      {
         ExtMapBuffer2[i] = Close[i]*0.95;
      }
      
      //ヒストグラムのデータ格納
      ExtMapBuffer3[i] = Close[i]*0.9;

      //矢印のデータ格納
      if(Close[i] < Close[i+1])
      {
         ExtMapBuffer4[i] = Close[i]*1.05;
      }
   }


   /*---------------------------------------------------------------*/
   /*③チャート上に表示するオブジェクトを作成する基本パターン       */
   /*---------------------------------------------------------------*/
   //オブジェクトの作成は、ObjectCreate関数を使用します。
   //オブジェクトのフォントや位置は、別途用意された関数より設定します。
   ObjectCreate("OBJ_NAME", OBJ_LABEL,
                WindowFind(data_string), 0, 0);
   ObjectSetText("OBJ_NAME", data_string, 10, "MS UI Gothic", White);
   ObjectSet("OBJ_NAME", OBJPROP_XDISTANCE, 10);
   ObjectSet("OBJ_NAME", OBJPROP_YDISTANCE, 15);
   
   /*オブジェクトを大量に作成する場合は、上記の記述を
     繰り返すのは冗長なため、自作関数でラッピングしてあげます。*/
   int j = 0;
   JK_CreateObject("OBJ_NAME"+DoubleToStr(j,0), data_string, Red, 15, 
                   "MS UI Gothic", 10, 30); j++;
   JK_CreateObject("OBJ_NAME"+DoubleToStr(j,0), data_string, Red, 15,
                   "MS UI Gothic", 10, 50); j++;
   JK_CreateObject("OBJ_NAME"+DoubleToStr(j,0), data_string, Red, 15,
                   "MS UI Gothic", 10, 70); j++;
   JK_CreateObject("OBJ_NAME"+DoubleToStr(j,0), data_string, Red, 15,
                   "MS UI Gothic", 10, 90); j++;
   JK_CreateObject("OBJ_NAME"+DoubleToStr(j,0), data_string, Red, 15,
                   "MS UI Gothic", 10, 110); j++;

   return(0);
}


/*------------------------------------------------------------------*/
/*(7)自作関数の記述方法                                          */
/*------------------------------------------------------------------*/
//自作関数の記述方法は、基本的にC言語と同じです。
//ただし、参照渡しはできません。
void JK_CreateObject(string name, string data, color clr,
                    int fontsize, string fontkind, int x, int y)
{
   ObjectCreate(name, OBJ_LABEL, WindowFind(data_string), 0, 0);
   ObjectSetText(name, data, fontsize, fontkind, clr);
   ObjectSet(name, OBJPROP_XDISTANCE, x);
   ObjectSet(name, OBJPROP_YDISTANCE, y);
}

MetaTrader4で表示させた結果

上記のMQL4ソースをコンパイルして、MetaTrader4(メタトレーダー4)で表示させた結果を以下に示します。

mql4_indicator_study

(クリックで拡大)


MQL4によるインジケータ作成のまとめ

MQL4によるインジケータ作成のポイントを以下にまとめます。

  • プロパティ(#property indicator_buffers)でバッファを予約する。
  • extern修飾子でユーザが変更可能なパラメータ変数を宣言する。
  • インジケータ起動中に常に保持したいデータはグローバル変数に格納する。
  • init()初期化関数は、インジケータ起動時に1回だけ実行される。
  • deinit()終了化関数は、インジケータ終了時に1回だけ実行される。
  • start()開始関数は、値動きの度に(1ティックごとに)実行される。
  • 開始関数で描画データを再計算する際は、必要最低限のバーだけにする。
  • 自作関数は、C言語と同様に記述できるが、参照渡しはできない。

上記の内容を理解することができれば、後はMQL4で予め用意されている関数群を利用しながら、ロジックをコーディングするだけです。

15分でここまで辿りつけたでしょうか?(笑)

MQL4入門 | CM(4) | 2012/08/24(金) 06:00
初心者にとっては、非常に分かりやすく素晴らしいサイトです。
これからも宜しくお願い致します。
[ 2014/01/09 11:27 ] [ 編集 ]
>iwanaさんへ
お褒めの言葉ありがとうございます。
最近は更新が滞りがちですが、管理人は息をしております。
今後ともよろしくお願いいたします。
[ 2014/01/12 19:15 ]
バッファの説明がわかりやすくて目からウロコでした!!
感謝感激。
[ 2014/12/10 01:15 ]
>こあらさんへ
お褒めの言葉ありがとうございます。
最近はブログ更新ができておりませんが、
また今度、入門シリーズを書いてみようと思います。
[ 2015/03/10 06:53 ]
コメントの投稿
題名
名前
メールアドレス
URL
コメント
PASS
SECRET管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。