移動平均線のクロスで売買する

 移動平均線のクロスで売買するEA(2MA Cross EA.mq4)を具体例として、MetaTrader4(MT4)におけるEAの具体的な作成方法について解説します。

 「2MA Cross EA.mq4」の具体的な売買ロジックは、以下のとおりです。

  • ゴールデンデッドクロスで買い売りエントリーする。
  • 買い(売り)ポジションはデッドゴールデンクロスで決済する。
  • エントリー及び決済は、クロスが確定した後に初めて形成されるバーの始値で行う。
  • エントリー及び決済は成行注文で行う。
  • 保有ポジション数は1つ(ドテン売買)。
2MA Cross EA Explanation
「2MA Cross EA.mq4」の売買ロジック
  1. 全体像
  2. #property命令の記述
  3. 変数の宣言
  4. 関数の定義
  5. 初期設定の記述
  6. 具体的な売買ロジックの記述
  7. 関連ツール
  8. 関連インジケーター
  9. 関連EA

1.全体像

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

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

 具体的には、以下のようになります。

Download (PDF, 365KB)

>>目次に戻る

2.#property命令の記述

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

copyroght and HP
著作権と関連HPのURLを指定

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

>>目次に戻る

3.変数の宣言

⑴ 変数とは

 変数とは、数値などを格納するためのメモリ領域に名前を付けたものです。

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

⑵ 具体例

 「2MA Cross EA.mq4」における変数の宣言に関する部分のコードについて解説します。

Variable Example
変数の宣言の具体例
ア 「//」とは

 「//」とは、プログラムにコメント(注釈や説明など)を記述するために使用されるものです。

 「//」が記述された行は、その行の文末までがコメントとして処理され、プログラムには一切影響を与えません

 コメントを2行以上にわたって記述したい場合には、コメントにする部分を「/*」と「*/」で囲みます。

Comment
「//」と「/*・*/」の使い方
イ externとは

 「extern」を付けて変数を宣言すると、当該変数をEAのパラメーターとして取り扱うことができるようになります。

 具体的には、「extern」を付けると、EAをチャートに適用した際に表示されるダイアログボックスにおける「パラメーターの入力」タブに、当該変数が表示されるようになります。

External Variable
「extern」を付けると、パラメーターの入力タブに表示される

 なお、「extern」を付けて宣言した変数を、外部変数といいます。

ウ 各変数の意味

 「2MA Cross EA.mq4」において宣言した各変数の意味は、以下のとおりです。

  • Magic
    マジックナンバー(=EAを識別する整数値)を格納します。
  • FMA_Period
    短期移動平均線の計算期間を格納します。
  • SMA_Period
    長期移動平均線の計算期間を格納します。
  • MA_Mode
    使用する移動平均線の種類を示す整数値を格納します。
  • Applied_Price
    移動平均線の計算に使用する価格データの種類を示す整数値を格納します。
  • Lots
    取引するロットサイズを格納します。
    MT4では、通常、1ロットは10万通貨を意味します。
  • Slippage
    許容スリッページ数を格納します。
  • Comments
    エントリー注文に付加するコメントを格納します。
    コメントは、「ターミナルウィンドウ」の「取引」タブで確認することができます。
  • FMA_1
    1本前のバーの短期移動平均線の値を格納します。
  • FMA_2
    2本前のバーの短期移動平均線の値を格納します。
  • SMA_1
    1本前のバーの長期移動平均線の値を格納します。
  • SMA_2
    2本前のバーの長期移動平均線の値を格納します。
  • Ticket
    エントリー注文が約定した際に、ポジションに付される整数値(=チケット番号)を格納します。
  • Adjusted_Slippage
    AdjustSlippage()関数(後述)によって調整された許容スリッページ数を格納します。
  • Bar_Time
    バーの形成開始時刻を格納します。
  • Closed
    決済注文が約定したか否かの結果を格納します。
    約定した場合は「true」を、約定しなかった場合は「false」を格納します。

>>目次に戻る

4.関数の定義

⑴ 関数とは

 関数とは、一定の処理を実行する流れをひとまとめにしたものです。

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

⑶ 具体例

 「2MA Cross EA.mq4」における、関数の定義に関する部分のコードについて解説します。

AdjustSlippage()
具体例
ア AdjustSlippage()関数の内容

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

イ MarketInfo()とは

 MarketInfo()とは、MQL4であらかじめ定義されている関数で、指定した通貨ペアに関する様々なマーケット情報を取得するために使用するものです。

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

ウ if()とは

 if()とは、if()文と呼ばれるもので、()内に記述された条件が満たされた場合に、一定の処理を実行させるために使用されるものです。

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

エ return()とは

 return()とは、retrun()文と呼ばれるもので、一定の計算結果を返す働きをするものです。

 AdjustSlippage()関数においては、提示レートの小数点以下の桁数に応じて調整された許容スリッページ数を返します。

>>目次に戻る

5.初期設定の記述

⑴ init()とは

 init()とは、MQL4であらかじめ定義されている関数で、EAをチャートに適用した際に、1度だけ実行されるものです。

 init()関数は、以下のように記述して使用します。

init()
init()関数の書式

 init()関数は、EAをチャートに適用した後、最初に一度だけ実行されるものなので、同関数内には、EAの初期設定など、一度だけ実行されれば足りる事項を記述します。

 なお、init()関数の使用は任意なので、これを必要としない場合には、記述する必要はありません。

⑵ return(0)とは

 return(0)とは、プログラムを終了させる記述です。

 retrun(0)と記述した場合には、それ以降のプログラムは実行されません

⑶ 具体例

 「2MA Cross EA.mq4」においては、許容スリッページ数の調整を行うAdjustSlippage()関数を使用しますが、同関数は、EAをチャートに適用した際に、最初に初期設定として1度だけ実行されれば足りるものなので、init()関数内に以下のように記述します。

init() AdjustSlippage()
具体例

 なお、Symbol()とは、MQL4であらかじめ定義されている関数で、現在開いているチャートの通貨ペア名を取得するものです。

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

>>目次に戻る

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

Download (PDF, 242KB)

⑴ start()とは

  start()とは、MQL4であらかじめ定義されている関数で、ティックごとに実行されるものです。

 start()関数は、ティックごとに実行されるものなので、同関数内には、具体的な売買ロジックを記述します。

 start()関数は、以下のように記述して使用します。

start() Format
start()関数の書式

⑵ EAを始値のみで実行させる

 「2MA Cross EA.mq4」は、ゴールデンクロス又はデッドクロスが完成してから、その直後のバーの始値でエントリー又は決済を行います。

 したがって、「2MA Cross EA.mq4」は、始値の時点でのみ稼働すれば足りるということになります。

 そこで、「2MACross EA.mq4」では、以下のように記述して、EAを始値のみで稼働させるようにしています。

Open Only
具体例
ア Time[]とは

 Time[]とは、各バーの形成開始時刻を格納しているdatetime型の配列です。

  • Time[]の詳細については「こちら」を参照してください。
  • 配列の詳細については「こちら」を参照してください。
イ 具体例の解釈

 2014年4月1日00:00:00にEAの稼働を開始した場合を具体例として、上記プログラムがどのように動作して、EAが始値のみで稼働されることになるのかを解説します。

  1. EAの稼働開始時点(1ティック目)
    ・Bar_Timeには「0」が格納されている。
    ・Time[0]には「2014/4/1/00:00:00」が格納されている。
    ・「Bar_Time≠Time[0]」
    Bar_Timeに「2014/4/1/00:00:00」が代入されたうえで、売買ロジックが実行される。
  2. EA稼働後2ティック目から「2014/4/1/01:00:00」まで
    ・Bar_Timeには「2014/4/1/00:00:00」が格納されている。
    ・Time[0]には「2014/4/1/00:00:00」が格納されている。
    ・「Bar_Time=Time[0]」。
    retrun(0)が実行され、売買ロジックに至る前にプログラムは終了する。
  3. EAが稼働してから2本目のバーが形成される時点
    ・Bar_Timeには「2014/4/1/00:00:00」が格納されている。
    ・Time[0]には「2014/4/1/01:00:00」が格納されている。
    ・「Bar_Time≠Time[0]」
    Bar_Timeに「2014/4/1/01:00:00」が代入されたうえで、売買ロジックが実行される。
  4. 以降は、上記2.~3.のロジックが繰り返されることになるので、EAは始値の時点でのみ、売買ロジックが実行されることになる。

⑶ インジケーターの値を計算する

 「2MA Cross EA.mq4」のように、売買の条件にインジケーターの値を使うEAの場合には、売買ロジックに入る前に、インジケーターの値を計算するコードを記述しておく必要があります。

 「2MA Cross EA.mq4」においては、以下のように記述して、インジケーター(移動平均線)の値を計算しています。

Calculate Indicator Value
具体例
ア iMA()とは

 iMA()とは、MQL4であらかじめ定義されている関数で、移動平均線の値を算出するものです。

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

イ NormalizeDouble()とは

 NormalizeDouble()とは、MQL4であらかじめ定義されている関数で、特定の値(浮動小数点)を指定した小数点以下の桁数で四捨五入するものです。

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

⑷ 保有ポジションを決済する

 「2MA Cross EA.mq4」では、エントリーするロジックよりも、保有ポジションを決済するロジックを先に記述しています。

 これは、以下の理由によります。

  1. リスク管理
    FX取引におけるレート変動によるリスクは、ポジションを保有し続けることによって生じること、及び、プログラムはコードを記述した順に実行されることから、エントリー処理よりもクローズ処理を先に記述することによって、その逆の場合よりも、速やかに保有ポジションを決済して、リスクを回避することができます。
  2. 速やかにエントリーする
    「2MA Cross EA.mq4」のように、ドテン売買を行うシステムの場合、ポジションを保有している限り、新たにエントリーすることはできないので、速やかなエントリーを可能とするためには、エントリー処理よりもクローズ処理を先に記述しておくことが必要となります。

 「2MA Cross EA.mq4」における、保有ポジションを決済するロジックに関するコードは、以下のとおりです。

Position Close
具体例
ア 決済条件

 「2MA Cross EA.mq4 」における決済条件を記述したコードの解釈を示すと、以下のようになります。

  • 買いポジションの決済条件
    チケット番号が正(=ポジションを保有している)で、かつ、2本前のバーの短期移動平均線の値が2本前のバーの長期移動平均線の値以上で、かつ、1本前のバーの短期移動平均線の値が1本前のバーの長期移動平均線の値よりも小さい
  • 売りポジションの決済条件
    チケット番号が正(=ポジションを保有している)で、かつ、2本前のバーの短期移動平均線の値が2本前のバーの長期移動平均線の値下で、かつ、1本前のバーの短期移動平均線の値が1本前のバーの長期移動平均線の値よりも大きい
イ OrderClose()とは

 OrderClose()とは、MQL4であらかじめ定義されている関数で、保有ポジションを決済する注文を出すものです。

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

ウ チケット番号を初期化する

 OrderClose()関数によって正常にポジションが決済された場合には、保有ポジションに付されていたチケット番号を「0」に初期化します。

⑸ エントリーする

 「2MA Cross EA.mq4」における、エントリーに関する部分のコードは、以下のとおりです。

Entry Logic
具体例
ア エントリー条件

 「2MA Cross EA.mq4」におけるエントリー条件を記述したコードの解釈を示すと、以下のようになります。

  • 買いエントリーの条件
    ポジションを保有していない状態で、2本前の短期移動平均線の値が2本前の長期移動平均線の値以下で、1本前の短期移動平均線の値が1本前の長期移動平均線の値よりも大きい
  • 売りエントリーの条件
    ポジションを保有していない状態で、2本前の短期移動平均線の値が2本前の長期移動平均線の値以上で、1本前の短期移動平均線の値が1本前の長期移動平均線の値よりも小さい

 なお、OrdersTotal()とは、MQL4であらかじめ定義されている関数で、現に保有しているポジションと、待機注文の合計数を返すものです。

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

イ OrderSend()とは

 OrderSend()とは、MQL4であらかじめ定義されている関数で、注文を出す働きをするものです。

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

>>目次に戻る

7.関連ツール

MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!
『EAつくーる』
『EAつくーる』 | fx-on.com

『EAつくーる』
『EAつくーる』 | fx-on.com

 上記ツール(EAつくーる『EAつくーる』 | fx-on.com)の詳細については「こちら『EAつくーる』 | fx-on.com」を参照してください(無料マニュアルは「こちら」からダウンロードできます。)。

>>目次に戻る

8.関連インジケーター

トレンドに方向にRSIとMAで押し目買い、戻り売り!
トレンドフォローインジケータ MT4 RSIMA押し抜けくん
トレンドフォローインジケータ MT4 RSIMA押し抜けくん | fx-on.com

トレンドフォローインジケータ MT4 RSIMA押し抜けくん
トレンドフォローインジケータ MT4 RSIMA押し抜けくん | fx-on.com

 上記インジケーター(トレンドフォローインジケータ MT4 RSIMA押し抜けくんトレンドフォローインジケータ MT4 RSIMA押し抜けくん | fx-on.com)の詳細については「こちらトレンドフォローインジケータ MT4 RSIMA押し抜けくん | fx-on.com」を参照してください。

MAの角度が横ばいなのか急角度なのかを明確に表示。データウィンドウで正確な角度も確認可能!
【MT4インジ】移動平均線(MA)の角度によって色分け表示。アラートやメール通知、WAV再生にも対応。擬似MTF 対応[MTP_MA_Angle_Alert]
【MT4インジ】移動平均線(MA)の角度によって色分け表示。アラートやメール通知、WAV再生にも対応。擬似MTF 対応[MTP_MA_Angle_Alert] | fx-on.com

【MT4インジ】移動平均線(MA)の角度によって色分け表示。アラートやメール通知、WAV再生にも対応。擬似MTF 対応[MTP_MA_Angle_Alert]
【MT4インジ】移動平均線(MA)の角度によって色分け表示。アラートやメール通知、WAV再生にも対応。擬似MTF 対応[MTP_MA_Angle_Alert] | fx-on.com

 上記ツール(MTP_MA_Angle_Alert【MT4インジ】移動平均線(MA)の角度によって色分け表示。アラートやメール通知、WAV再生にも対応。擬似MTF 対応[MTP_MA_Angle_Alert] | fx-on.com)の詳細については「こちら【MT4インジ】移動平均線(MA)の角度によって色分け表示。アラートやメール通知、WAV再生にも対応。擬似MTF 対応[MTP_MA_Angle_Alert] | fx-on.com」を参照してください。

>>目次に戻る

9.関連EA

王道のろうそく足、ボリンジャーバンド、移動平均線でタイミングを見つけ2つのロジックで売買します
足ボリさん
足ボリさん | fx-on.com

足ボリさん
足ボリさん | fx-on.com

 上記EA(足ボリさん足ボリさん | fx-on.com)の詳細については「こちら足ボリさん | fx-on.com」を参照してください。

>>目次に戻る


MT4の使い方からプログラミングまで、わかりやすく解説