https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c5f409be-c569-4e6d-869e-05a7c7326426/chart3.png

MACDは、期間の異なる2本の移動平均の差をとったものなので、マイナスからプラスに転じたところが2本の移動平均のゴールデンクロス、プラスからマイナスに転じたところがデッドクロスとなります。

MACDでは移動平均にEMAを使うので、交差のシグナルは早めに出ますが、MACDの傾きが変わったところを判別すると、さらに早くシグナルを出すことができます。そのために、MACDとシグナルラインの交差を利用します。

MACDがシグナルラインを下から上に交差したときを買いシグナル、上から下に交差したとこを売りシグナルとします。

仕掛けシグナル

<aside> 💡 買いシグナル:2本前から1本前にかけてMACDがシグナルラインを下から上に交差したとき 売りシグナル:2本前から1本前にかけてMACDがシグナルラインを上から下に交差したとき

</aside>

コード

//共通ライブラリ
#include "LibEA.mqh"

sinput double Lots = 0.1; //売買ロット数

//ティック時実行関数
void Tick()
{
   int sig_entry = EntrySignal(); //仕掛けシグナル
   //成行売買
   MyOrderSendMarket(sig_entry, sig_entry, Lots);
}

input int FastEMAPeriod = 12; //短期EMAの期間
input int SlowEMAPeriod = 26; //長期EMAの期間
input int SignalPeriod = 9; //MACDにかけるSMAの期間

//仕掛けシグナル関数
int EntrySignal()
{
   //1本前のMACD
   double MACD1 = iMACD(_Symbol, 0, FastEMAPeriod, SlowEMAPeriod, SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);
   double Signal1 = iMACD(_Symbol, 0, FastEMAPeriod, SlowEMAPeriod, SignalPeriod, PRICE_CLOSE, MODE_SIGNAL, 1);
   //2本前のMACD
   double MACD2 = iMACD(_Symbol, 0, FastEMAPeriod, SlowEMAPeriod, SignalPeriod, PRICE_CLOSE, MODE_MAIN, 2);
   double Signal2 = iMACD(_Symbol, 0, FastEMAPeriod, SlowEMAPeriod, SignalPeriod, PRICE_CLOSE, MODE_SIGNAL, 2);

   int ret = 0; //シグナルの初期化

   //買いシグナル
   if(MACD2 <= Signal2 && MACD1 > Signal1) ret = 1;
   //売りシグナル
   if(MACD2 >= Signal2 && MACD1 < Signal1) ret = -1;

   return ret; //シグナルの出力
}

説明

MACDは、iMACD()というテクニカル指標関数で求められます。

短期EMAの期間、長期EMAの期間、およびシグナルライン算出の期間として、別途宣言したFastEMAPeriodSlowEMAPeriodSignalPeriodをそれぞれ引数fast_ema_periodslow_ema_periodsignal_periodに代入します。

終値を対象としたEMAを求める場合、applied_priceの引数にPRICE_CLOSEを代入します。

modeの引数には、MACDを求める場合、MODE_MAINを、シグナルラインを求める場合、MODE_SIGNALをそれぞれ代入します。

2本前のMACDMACD2とシグナルラインSignal2の大小関係、1本前のMACDMACD1とシグナルラインSignal1の大小関係により、シグナルを判定します。