約定したポジションを一定時間経過後に手仕舞いするために、ポジションが約定した時刻を取得し、現在の時刻と比較するなどのロジックを直接コーディングすることもできます。
ここでは、共通ライブラリのWaitSignal()
という関数を使ってみます。これは、ポジションの約定後、一定時間経過するまでシグナルをオフにする関数です。入力したシグナルと出力されたシグナルが一致するかどうかで、約定して一定時間経過しかたどうかを判別することができます。
//共通ライブラリ
#include "LibEA.mqh"
sinput double Lots = 0.1; //売買ロット数
input int ElapsedMin = 360; //経過時間(分)
//ティック時実行関数
void Tick()
{
//ElapsedMin分経過後に決済
if(WaitSignal(1, ElapsedMin)==1) MyOrderClose();
int sig_entry = EntrySignal(); //仕掛けシグナル
//成行売買
MyOrderSendMarket(sig_entry, sig_entry, Lots);
}
input int RSIPeriod = 14; //RSIの期間
//仕掛けシグナル関数
int EntrySignal()
{
//1本前のRSI
double RSI1 = iRSI(_Symbol, 0, RSIPeriod, PRICE_CLOSE, 1);
int ret = 0; //シグナルの初期化
//買いシグナル
if(RSI1 < 30) ret = 1;
//売りシグナル
if(RSI1 > 70) ret = -1;
return ret; //シグナルの出力
}
WaitSignal()
は、引数として入力シグナルと、経過時間(分)をとります。ここでは、入力シグナルとして1
、経過時間として別途宣言した変数ElapsedMin
を代入しています。
そして、WaitSignal()
の出力が入力と同じ1
である場合、指定した時間が経過したと判断して、ポジションを決済する関数MyOrderClose()
を実行します。
<aside> 💡 決済する時刻がバーの開始時刻とずれている場合、ストラテジーテスターのモデルを「1分足OHLC」「全ティック」にしてバックテストする必要があります。
</aside>