仕掛けシグナルに2本の移動平均線の交差、手仕舞いにパラボリックSARと終値の交差を利用します。
パラボリックSARは、移動平均線のようにトレンドに沿って移動しますが、バーとぶつかったところで、上昇と下落のモードが反転します。そこで、最新のバーにおけるパラボリックSARと終値の交差を手仕舞いシグナルと考えます。
<aside> 💡 売りポジションの手仕舞い(買いシグナル):1本前から現在のバーにかけて終値がパラボリックSARを下から上に交差したとき 買いポジションの手仕舞い(売りシグナル):1本前から現在のバーにかけて終値がパラボリックSARを上から下に交差したとき
</aside>
//共通ライブラリ
#include "LibEA.mqh"
sinput double Lots = 0.1; //売買ロット数
//ティック時実行関数
void Tick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
int sig_exit = ExitSignal(); //手仕舞いシグナル
//成行売買
MyOrderSendMarket(sig_entry, sig_entry+sig_exit, Lots);
}
input int FastMAPeriod = 20; //短期移動平均の期間
input int SlowMAPeriod = 50; //長期移動平均の期間
//仕掛けシグナル関数
int EntrySignal()
{
//1本前と2本前の移動平均
double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double FastMA2 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
int ret = 0; //シグナルの初期化
//買いシグナル
if(FastMA2 <= SlowMA2 && FastMA1 > SlowMA1) ret = 1;
//売りシグナル
if(FastMA2 >= SlowMA2 && FastMA1 < SlowMA1) ret = -1;
return ret; //シグナルの出力
}
input double SARStep = 0.02; //SAR加速係数の変化幅
input double SARMaxStep = 0.2; //SAR加速係数の最大値
//手仕舞いシグナル関数
int ExitSignal()
{
//0本前と1本前のSAR
double SAR0 = iSAR(_Symbol, 0, SARStep, SARMaxStep, 0);
double SAR1 = iSAR(_Symbol, 0, SARStep, SARMaxStep, 1);
int ret = 0; //シグナルの初期化
//買いシグナル
if(High[1] < SAR1 && Close[0] >= SAR0) ret = 1;
//売りシグナル
if(Low[1] > SAR1 && Close[0] <= SAR0) ret = -1;
return ret; //シグナルの出力
}
パラボリックSARは、iSAR()というテクニカル指標関数で求められます。
パラボリックSARのパラメータである加速係数の変化幅と最大値を別途SARStep
、SARMaxStep
として宣言し、それらをstep
、maximum
の引数に代入します。
最新のバーでの交差を利用するため、1本前のSARSAR1
、終値Close[1]
と最新のバーにおけるSARSAR0
、終値Close[0]
の大小関係によりシグナルの判別を行います。
この場合、手仕舞いシグナルより先に仕掛けシグナルが出ることがあるので、MyOrderSendMarket()
の第2引数には、sig_entry+sig_exit
を代入しています。
<aside> 💡 最新のバーの終値はティックごとに変化するので、ストラテジーテスターのモデルを「全ティック」にしてバックテストする必要があります。
</aside>