仕掛けシグナル、手仕舞いシグナルともに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()
からHLBand
を呼び出す方法はHLバンドのブレイクアウトと同じです。
最新のバーで終値が1本前の上位ラインを上回るか、下位ラインを下回るかを判断するため、1本前の上位ラインHline1
、下位ラインLline1
と最新のバーにおける終値Close[0]
の大小関係によりシグナルの判別を行います。
手仕舞いシグナルのHLバンドの期間ExitPeriod
が仕掛けシグナルのHLバンドの期間BandPeriod
より短ければ、次の仕掛けシグナルより先に手仕舞いシグナルがでるので、MyOrderSendMarket()
の第2引数には、sig_exit
を代入しています。
<aside> 💡 最新のバーの終値はティックごとに変化するので、ストラテジーテスターのモデルを「全ティック」にしてバックテストする必要があります。
</aside>