https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2dccd441-43cb-4fb2-a314-b99d421de173/chart3.png

仕掛けシグナルに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のパラメータである加速係数の変化幅と最大値を別途SARStepSARMaxStepとして宣言し、それらをstepmaximumの引数に代入します。

最新のバーでの交差を利用するため、1本前のSARSAR1、終値Close[1]と最新のバーにおけるSARSAR0、終値Close[0]の大小関係によりシグナルの判別を行います。

この場合、手仕舞いシグナルより先に仕掛けシグナルが出ることがあるので、[MyOrderSendMarket()](<https://toyolab-fx.notion.site/MyOrderSendMarket-3e0c92f431514dc6ba54b78b23c1afc6>) の第2引数には、sig_entry+sig_exitを代入しています。


<aside> 💡 最新のバーの終値はティックごとに変化するので、ストラテジーテスターのモデルを「全ティック」にしてバックテストする必要があります。

</aside>