https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e47a7a5e-041d-4f5e-9992-8295acc1bed1/chart3.png

仕掛けシグナル、手仕舞いシグナルともにHLバンドのブレイクアウトを利用しますが、シグナルを判断するバーの位置が少し違います。

仕掛けシグナルの場合、4本値の確定した1本前のバーの位置で終値がHLバンドをブレイクアウトしたかどうかで判断しましたが、手仕舞いシグナルの場合、最新のバーの終値がHLバンドをブレイクアウトしたかどうかで判断します。

これはダマシのシグナルになる可能性もありますが、早めに利確するための方法の一つです。

手仕舞いシグナル

<aside> 💡 売りポジションの手仕舞い(買いシグナル):1本前から現在のバーにかけて終値がHLバンドの上位ラインを下から上に交差したとき 買いポジションの手仕舞い(売りシグナル):1本前から現在のバーにかけて終値がHLバンドの下位ラインを上から下に交差したとき

</aside>

コード

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

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

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

input int BandPeriod = 25; //HLバンドの期間

//仕掛けシグナル関数
int EntrySignal()
{
   //2本前のHLバンド
   double Hline2 = iCustom(_Symbol, 0, "HLBand", BandPeriod, MODE_UPPER, 2);
   double Lline2 = iCustom(_Symbol, 0, "HLBand", BandPeriod, MODE_LOWER, 2);

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

   //買いシグナル
   if(Close[2] <= Hline2 && Close[1] > Hline2) ret = 1;
   //売りシグナル
   if(Close[2] >= Lline2 && Close[1] < Lline2) ret = -1;

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

input int ExitPeriod = 10; //手仕舞い用HLバンドの期間

//手仕舞いシグナル関数
int ExitSignal()
{
   //1本前のHLバンド
   double Hline1 = iCustom(_Symbol, 0, "HLBand", ExitPeriod, MODE_UPPER, 1);
   double Lline1 = iCustom(_Symbol, 0, "HLBand", ExitPeriod, MODE_LOWER, 1);

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

   //買いシグナル
   if(Close[0] > Hline1) ret = 1;
   //売りシグナル
   if(Close[0] < Lline1) ret = -1;

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

説明

HLバンドは、本サイトで紹介したHLBandというカスタム指標で求められます。[iCustom()](<https://docs.mql4.com/indicators/icustom>)からHLBandを呼び出す方法はHLバンドのブレイクアウトと同じです。

最新のバーで終値が1本前の上位ラインを上回るか、下位ラインを下回るかを判断するため、1本前の上位ラインHline1、下位ラインLline1と最新のバーにおける終値Close[0]の大小関係によりシグナルの判別を行います。

手仕舞いシグナルのHLバンドの期間ExitPeriodが仕掛けシグナルのHLバンドの期間BandPeriodより短ければ、次の仕掛けシグナルより先に手仕舞いシグナルがでるので、[MyOrderSendMarket()](<https://toyolab-fx.notion.site/MyOrderSendMarket-3e0c92f431514dc6ba54b78b23c1afc6>) の第2引数には、sig_exitを代入しています。


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

</aside>