MQL4プログラミングにおけるiMACD関数の使い方(サンプルソースあり)

MQL4でiMACD関数を使用する基本的な方法を説明します。

目次

iMACD関数の基本構文

double iMACD(
   string symbol,            // 通貨ペア
   int timeframe,            // タイムフレーム
   int fast_ema_period,      // 短期EMA期間
   int slow_ema_period,      // 長期EMA期間
   int signal_period,        // シグナル線期間
   int applied_price,        // 適用価格
   int mode,                 // ライン識別子
   int shift                 // シフト
);

一般的な使用例

double macdMain = iMACD(Symbol(), PERIOD_CURRENT, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0);
double macdSignal = iMACD(Symbol(), PERIOD_CURRENT, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 0);

以下は、パラメータの説明を表にまとめたものです。

パラメータ説明
symbol通貨ペア (例: NULL または Symbol() で現在のチャートの通貨ペアを使用)
timeframeタイムフレーム (例: PERIOD_CURRENT で現在のチャートのタイムフレームを使用)
fast_ema_period短期EMA期間 (一般的に12)
slow_ema_period長期EMA期間 (一般的に26)
signal_periodシグナル線期間 (一般的に9)
applied_price適用価格 (例: PRICE_CLOSE)
modeライン識別子 (MODE_MAIN: MACDライン, MODE_SIGNAL: シグナルライン)
shiftシフト (0は現在のバー)

MACDクロスオーバーの例

double macdMain = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1);
double macdSignal = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1);
double macdMainPrev = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2);
double macdSignalPrev = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 2);

if (macdMain > macdSignal && macdMainPrev <= macdSignalPrev) {
   // MACDがシグナルラインを上から下へクロス(買いシグナル)
}
else if (macdMain < macdSignal && macdMainPrev >= macdSignalPrev) {
   // MACDがシグナルラインを下から上へクロス(売りシグナル)
}

EAサンプルソース

MQL4でiMACD関数を使用してEAを作成する例を示します。このEAはMACDのクロスオーバーを使用して取引シグナルを生成します。

#property copyright "Copyright 2024, Your Name"
#property link      "https://www.example.com"
#property version   "1.00"
#property strict

input int FastEMA = 12;
input int SlowEMA = 26;
input int SignalSMA = 9;
input double Lots = 0.1;

int OnInit()
{
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
}

void OnTick()
{
   double macdMain = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 0);
   double macdSignal = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_SIGNAL, 0);
   double macdMainPrev = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 1);
   double macdSignalPrev = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_SIGNAL, 1);
   
   if(!PositionSelect(Symbol()))
   {
      // 新規ポジションを開く
      if(macdMain > macdSignal && macdMainPrev <= macdSignalPrev)
      {
         // 買いシグナル
         OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0, "MACD Buy", 0, 0, clrGreen);
      }
      else if(macdMain < macdSignal && macdMainPrev >= macdSignalPrev)
      {
         // 売りシグナル
         OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, 0, 0, "MACD Sell", 0, 0, clrRed);
      }
   }
   else
   {
      // 既存ポジションを管理
      if(OrderType() == OP_BUY && macdMain < macdSignal)
      {
         // 買いポジションを閉じる
         OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrBlue);
      }
      else if(OrderType() == OP_SELL && macdMain > macdSignal)
      {
         // 売りポジションを閉じる
         OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrYellow);
      }
   }
}

このEAの動作は以下の通りです

  1. MACDのメインラインとシグナルラインの現在値と1つ前の値を計算します。
  2. オープンポジションがない場合:
    • MACDメインラインがシグナルラインを下から上にクロスした場合、買いポジションを開きます。
    • MACDメインラインがシグナルラインを上から下にクロスした場合、売りポジションを開きます。
  3. オープンポジションがある場合:
    • 買いポジションを持っていて、MACDメインラインがシグナルラインを下回った場合、ポジションを閉じます。
    • 売りポジションを持っていて、MACDメインラインがシグナルラインを上回った場合、ポジションを閉じます。

注意点

  • このEAは基本的な例であり、実際のトレードには追加のリスク管理やフィルタリングが必要です。
  • パラメータ(FastEMA, SlowEMA, SignalSMA, Lots)は、バックテストと最適化を通じて調整する必要があります。
  • 実際の取引に使用する前に、デモ口座でテストし、パフォーマンスを評価することが重要です。

このEAは、MACDを使用した基本的なトレーディングアイデアを示していますが、実際のトレーディングに使用する前に、十分なテストと調整を行うことが重要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

池田 直哉 池田 直哉 メタプロアカデミー創業者・講師

オリジナルのEAを作ることができるようになるWebスクール【メタプロアカデミー】を運営しています。プログラミング未経験の方が最短1ヵ月で勝てるオリジナルEAが作れるようになります。

目次