【MQL4の勉強】特定の時間を指定して売買するEA作成!プログラム書き方やサンプルコードあり!

ザフナーラボブログ

MetaTrader4(MT4)では、プログラムを記述することによって、時間指定注文を出す(=特定の時間を指定して発注する)ことで、時間を指定して売買することができます。

そこで、五十日(ごとおび)に売買するEA(Time Limit Trade.mq4)を具体例として、MT4において時間指定注文を出すためのプログラムについて解説します。

なお、五十日とは、毎月5日、10日、15日、20日、25日、30日(又は月末)のことで、当該日には企業の支払いが集中し、国際的な決済通貨であるドルの需要が高まり(=ドル高)、仲値公示(日本時間午前9:55)に向けて円安に向かいやすいといわれています。

1.売買の概要

上述のように、五十日においては、仲値公示(日本時間午前9:55)に向けて円安に向かいやすいといわれていることから、以下のような内容の時間指定注文を出すようにします。

  • エントリー
    五十日(=5日、10日、15日、20日、25日、30日)における日本時間午前9:30に成行で買いエントリーする。
  • クローズ(決済)
    エントリーと同一日の日本時間午前9:50に成行で決済する。
  • ポジション数
    取引するポジション数は「1」とする。
  • 時間軸
    5分足チャートを使用する。

2.全体像

MT4でEAを作成するには、以下の手順に従ってプログラムを記述していくことになります。

  1. #property命令を記述する。
  2. 変数の宣言を行う。
  3. 関数の定義を行う。
  4. init()関数内にEAの初期設定を記述する。
  5. start()関数内に具体的な売買ロジックを記述する。

以下のリンクから全体像のサンプルコードをダウンロードして、サンプルコードを見ながら記事を読み進めてください。

Time-Limit-Trade

3.#property命令の記述

「Time Limit Trade.mq4」においては、以下のように記述して、著作権と関連HPのURLを指定しています。

 

#property命令の詳細については「こちら」を参照してください。

4.変数の宣言

変数の詳細については「こちら」を参照してください。

「Time Limit Trade.mq4」においては、以下のように変数を宣言しています。

サンプルコード


//変数の宣言
extern int Magic = 1234;

extern int Open_Hour    = 3;
extern int Open_Minute = 30;

extern int Close_Hour    = 3;
extern int Close_Minute = 50;

extern double Lots         = 0.1;
extern int Slippge           = 10;
extern string Comments = "Time Limit Trade";

int Ticket = 0;

int Adjusted_Slippage = 0;

datetime Bar_Time = 0;

bool Closed = false;

各変数の意味は、以下のとおりです。

  • Magic
    マジックナンバー(=EAを識別するための整数値)を格納します。
  • Open_Hour
    エントリーする「時間」(取引サーバーを基準とする)を格納します。
    具体例では、初期設定を「3」としています。
  • Open_Minute
    エントリーする「分」を格納します。
  • Close_Hour
    決済する「時間」(取引サーバーを基準とする)を格納します。
    具体例では、初期設定を「3」としています。
  • Close_Minute
    決済する「分」を格納します。
  • Lots
    取引するロットサイズを指定します。
    MT4では、通常、1ロットは10万通貨を意味します。
  • Slippage
    許容スリッページ数を格納します。
  • Comments
    エントリー注文に付加するコメントを格納します。
    コメントは、「ターミナルウィンドウ」の「取引」タブで確認することができます。
  • Ticket
    エントリー注文が約定した際に、ポジションに付される整数値(=チケット番号)を格納します。
  • Adjusted_Slippage
    AdjustSlippage()関数によって調整された許容スリッページ数を格納します。
  • Bar_Time
    バーの形成開始時刻を格納します。
  • Closed
    保有ポジションの決済処理が正常に行われたかどうかの結果を格納します。

5.関数の定義

関数の詳細については「こちら」を参照してください。

「Time Limit Trade.mq4」においては、以下のように関数を定義しています。

Definition-of-Function-in-Time-Limit-Trade

AdjustSlippage()関数の詳細については「こちら」を参照してください。

6.初期設定の記述

「Time Limit Trade.mq4」においては、AdjustSlippage()関数を使用しますが、当該関数による処理は、EAをチャートに適用した際に、最初に一度だけ実行されれば足りるものなので、init()関数内に以下のように記述します。

サンプルコード


int init()
{
  Adjusted_Slippage = AdjustSlippage(Symbol(),Slippage);
  
  return(0);
}

init()関数の詳細については「こちら」を参照してください。

7.具体的な売買ロジックの記述

「Time Limit Trade.mq4」における具体的な売買ロジックの記述は、以下のようになります。

Start-Function-in-Time-Limit-Trade

  • start()関数の詳細については「こちら」を参照してください。
  • if()文の詳細については「こちら」を参照してください。
  • return(0)の詳細については「こちら」を参照してください。

⑴ 始値か否かのチェック

「Time Limit Trade.mq4」は、5分足チャートの始値のみで取引するので、以下のようなコードを記述して、EAが始値のみで稼働するようにしています。

サンプルコード


//始値か否かのチェック
if(Bar_Time == Time[0])
  {
    return(0);
  }
else if(Bar_Time != Time[0])
         {
           Bar_Time = Time[0];
         }

上記コードの詳細については「こちら」を参照してください。

⑵ クローズ処理

ポジションを保有していることを確認

OrdersTotal()関数を使用して、ポジションを保有していることを確認しています。

  • OrdersTotal()関数の詳細については「こちら」を参照してください。
注文を選択

OrderSelect()関数を使用して、「Time Limit Trade.mq4」によって取得したポジションを選択しています。

  • OrderSelect()関数の詳細については「こちら」を参照してください。
決済条件

if()文内のコードの解釈は、以下のようになります。

「日にちが5、10、15、20、25、30のいずれかで」かつ「時間がClose_Hourで指定した値と等しく、かつ、分がClose_Minuteで指定した値と等しく」かつ「選択した注文が未決済」だったら

  • Day()関数の詳細については「こちら」を参照してください。
  • Hour()関数の詳細については「こちら」を参照してください。
  • Minute()関数の詳細については「こちら」を参照してください。
  • OrderCloseTime()関数の詳細については「こちら」を参照してください。
決済する

OrderClose()関数を使用してポジションを決済し、正常に決済されたら、変数TicketとClosedを初期化するようにしています。

  • OrderClose()関数の詳細については「こちら」を参照してください。
  • OrderClosePrice()関数の詳細については「こちら」を参照してください。

⑶ エントリー処理

ポジションを保有していないことを確認

OrdersTotal()関数を使用して、ポジションを保有していないことを確認しています。

  • OrdersTotal()関数の詳細については「こちら」を参照してください。
エントリー条件

if()文内のコードの解釈は、以下のようになります。

「日にちが5、10、15、20、25、30のいずれかで」かつ「時間がOpen_Hourで指定した値と等しく、かつ、分がOpen_Minuteで指定した値と等し」かったら

  • Day()関数の詳細については「こちら」を参照してください。
  • Hour()関数の詳細については「こちら」を参照してください。
  • Minute()関数の詳細については「こちら」を参照してください。
エントリーする

OrderSend()関数を使用してエントリーし、チケット番号を変数Ticketに格納しています。

  • OrderSend()関数の詳細については「こちら」を参照してください。
  • Symbol()関数の詳細については「こちら」を参照してください。