約定したポジションを一定時間経過後に手仕舞いするために、ポジションが約定した時刻を取得し、現在の時刻と比較するなどのロジックを直接コーディングすることもできます。

ここでは、共通ライブラリの[WaitSignal()](<https://toyolab-fx.notion.site/WaitSignal-73e1e25bc2704661a93bb248db3fe0c7>)という関数を使ってみます。これは、ポジションの約定後、一定時間経過するまでシグナルをオフにする関数です。入力したシグナルと出力されたシグナルが一致するかどうかで、約定して一定時間経過しかたどうかを判別することができます。

コード

//共通ライブラリ
#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()](<https://toyolab-fx.notion.site/WaitSignal-73e1e25bc2704661a93bb248db3fe0c7>)は、引数として入力シグナルと、経過時間(分)をとります。ここでは、入力シグナルとして1、経過時間として別途宣言した変数ElapsedMinを代入しています。

そして、[WaitSignal()](<https://toyolab-fx.notion.site/WaitSignal-73e1e25bc2704661a93bb248db3fe0c7>)の出力が入力と同じ1である場合、指定した時間が経過したと判断して、ポジションを決済する関数[MyOrderClose()](<https://toyolab-fx.notion.site/MyOrderClose-dc7324fd5fc6431cbd0e0fbc6ce212f5>)を実行します。


<aside> 💡 決済する時刻がバーの開始時刻とずれている場合、ストラテジーテスターのモデルを「1分足OHLC」「全ティック」にしてバックテストする必要があります。

</aside>