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の期間、およびシグナルライン算出の期間として、別途宣言したFastEMAPeriod
、SlowEMAPeriod
、SignalPeriod
をそれぞれ引数fast_ema_period
、slow_ema_period
、signal_period
に代入します。
終値を対象としたEMAを求める場合、applied_price
の引数にPRICE_CLOSE
を代入します。
mode
の引数には、MACDを求める場合、MODE_MAIN
を、シグナルラインを求める場合、MODE_SIGNAL
をそれぞれ代入します。
2本前のMACDMACD2
とシグナルラインSignal2
の大小関係、1本前のMACDMACD1
とシグナルラインSignal1
の大小関係により、シグナルを判定します。