移動平均は価格変動が平滑化されるので、価格のトレンドに合わせて上下します。この移動平均線を時間軸の右方向にシフトすると、トレンドの変化が遅れるため、元の移動平均線と交差します。この交差を仕掛けシグナルと見なします。
シフトした移動平均線は価格変化に遅れて反応するので、価格が上昇して元の移動平均線がシフトした移動平均線を上抜けたとき(ゴールデンクロス)に買いシグナル、価格が下落して元の移動平均線がシフトした移動平均線を下抜けたとき(デッドクロス)に売りシグナルを出します。
<aside> 💡 買いシグナル:2本前から1本前にかけて元の移動平均線がシフトした移動平均線を下から上に交差したとき 売りシグナル:2本前から1本前にかけて元の移動平均線がシフトした移動平均線を上から下に交差したとき
</aside>
//共通ライブラリ
#include "LibEA.mqh"
sinput double Lots = 0.1; //売買ロット数
//ティック時実行関数
void Tick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
//成行売買
MyOrderSendMarket(sig_entry, sig_entry, Lots);
}
input int MAPeriod = 20; //移動平均の期間
input int MAShift = 10; //移動平均のシフト期間
//仕掛けシグナル関数
int EntrySignal()
{
//1本前と2本前の移動平均
double FastMA1 = iMA(_Symbol, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double FastMA2 = iMA(_Symbol, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
double SlowMA1 = iMA(_Symbol, 0, MAPeriod, MAShift, MODE_SMA, PRICE_CLOSE, 1);
double SlowMA2 = iMA(_Symbol, 0, MAPeriod, MAShift, MODE_SMA, PRICE_CLOSE, 2);
int ret = 0; //シグナルの初期化
//買いシグナル
if(FastMA2 <= SlowMA2 && FastMA1 > SlowMA1) ret = 1;
//売りシグナル
if(FastMA2 >= SlowMA2 && FastMA1 < SlowMA1) ret = -1;
return ret; //シグナルの出力
}
移動平均は、iMA()
というテクニカル指標関数で求められます。
移動平均の期間として、別途宣言した変数MAPeriod
をma_period
の引数に代入します。
ma_shift
の引数には、元の移動平均の場合0
を、シフトした移動平均の場合、別途宣言した変数MAShift
をそれぞれ代入します。
終値を対象とした単純移動平均の場合、applied_price
の引数にPRICE_CLOSE
を、ma_method
の引数にMODE_SMA
を代入します。
2本前の元の移動平均FastMA2
、シフトした移動平均SlowMA2
、1本前の元の移動平均FastMA1
、シフトした移動平均SlowMA1
の大小関係でシグナルを判定します。