【MQL4】TimeCurrent・iTimeで時間・曜日を判定するEA処理まとめ

スーツ姿のデグーマウスがMT4 EAのコードを指しながら解説しているイラスト。ぷろぐらむFXのデフォルトアイキャッチ。
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

本記事は、MT4(MQL4)で 時間・曜日・経過時間を条件にEAの売買判断を行う方法をまとめた、EA開発者向けの技術解説記事です。

なお、MT4で扱われる「時間」は日本時間とはズレており、 夏時間・冬時間によって基準が変わります。 時間判定ロジックを正しく実装するためには、 まずこの前提を理解しておくことが重要です。

MT4の時間と日本時間の違いを解説|夏時間・冬時間・経済指標のズレ

また、理論だけでなく、 実際のチャート上で日本時間を即座に確認したい場合は、 以下の日本時間表示インジケータが便利です。

MT4で日本時間を表示するインジケータ|カーソル位置の時間も確認できる

はじめに

EAで時間・曜日・経過時間を条件にエントリーや決済を制御したい場合のサンプルを紹介します。

  • エントリー後、10時間経過していたら決済する
  • 1時間毎に新規注文を行いたい場合
  • 週末(金曜日)のクローズ前に決済したい場合

それでは、1つずつ解説していきます。

サンプルソース

エントリー後、10時間経過していたら決済する処理

if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true){
   //オーダー後10時間を超えた場合(60秒*600分で10時間)
   if(TimeCurrent() - OrderOpenTime() > 60*600 ){
      OrderKekka = OrderClose(OrderTicket(),OrderLots(),Bid,10,Violet);
   }
}

解説

まず最新のポジションのエントリー時間を取得するために、最新のポジションを選択(OrderSelect)しています。次に、


サーバー側の現在時間(TimeCurrent) – エントリー時間(OrderOpenTime) > 36000秒(10時間分の秒)

とし、現在時間からエントリー時間を引き算してエントリーしてからの経過時間を算出しています。

その時間が36000秒(10時間)を超えている場合、決済(OrderClose)するという形です。
※60(秒) * 600(分)という表記にしているのは、わかりやすいようにしているだけなので36000でも問題ありません

1時間毎に新規注文を行いたい場合の処理

//1時間ごとに新規注文を行う
if(Time[0] % 3600 == 0){
   // 新規エントリー注文
   int CNo = OrderSend(NULL,OP_BUY,・・・
}

解説

Time[0]には最新のバーができた時間が秒数で入っています。『2020.01.02 07:00:00』であれば 『1577948400』、『2020.01.02 08:00:00』であれば 『‭1577952000‬』という具合です。この秒数を3600で「%(剰余演算子)」で割り、余りが無い場合のみ新規注文処理(OrderSend)をするようにしています。

上記計算をした場合、ちょうど1時間毎に0になりますので1時間毎に処理ができるという形になります。これで、何分(時間)足でEAを動かしたとしても9時、10時、11時・・・に新規エントリーしてくれます。

あと、9時15分、10時15分、11時15分・・・としたい場合はどうするかと言いますと、3600のところを1時間⇒15分は4で割った秒数となるので、「if(Time[0] % 900 == 0)」こんな感じでOKです。

スポンサーリンク

週末(金曜日)のクローズ前に決済したい場合の処理

//ポジションを保持しており、かつ金曜日、かつ22時(日本時間AM5:00)を超えたら強制決済する 
if(OrdersTotal() >= 1 && DayOfWeek()==5 && Hour() >= 22){
   // 決済注文
   OrderClose(OrderTicket(),・・・・);
}

解説

まず、OrdersTotal()関数でポジション数を確認しています。ポジションが無かったら特に決済する必要が無いためです。

次に、DayOfWeek()関数で曜日を確認しています。日:0、月:1、火:2、水:3、木:4、金:5、土:6という形です。

最後に、Hour()関数で時間を確認しています。22時は日本時間のAM5:00にあたるので、AM5:00になったら決済するような形です。時間は自分の好みに合わせてもっと早く決済したい場合は時間を調整してください。
※時間はもしかしたらズレがあるかもしれないので一応自分で確認してください(私が利用している日本のFX業者は22時でAM5:00でした)

あと条件が満たされた場合の決済ですが、複数ポジションある場合はもちろん複数決済する必要があります。

おまけ(金曜日のエントリーも制限したい場合)

//金曜日、かつ16時(日本時間PM23:00)を超えたら新規エントリーしない
if(DayOfWeek()==5 && Hour() >= 16){
    
   //ポジションを保持しており、かつ22時(日本時間AM5:00)を超えたら強制決済する 
   if(OrdersTotal() >= 1 && Hour() >= 22){
      //決済注文
      OrderClose(OrderTicket(),・・・・);
   } 
       
   //以降処理しない
   return;
} 

こんな風にしておけば、週末の新規エントリーも管理できますね!
※return;で以降処理しないようにしているだけなので、この処理をソースコードの先頭の方に書き込んでおく必要があります

主な構文

TimeCurrent()

取引サーバを基準に現在の時間を返す。

PCのローカルタイム(PCの時計)に依存しないので、仮に自分のPCの時計が遅れていても問題が発生しません。

OrderOpenTime()

現在選択しているポジションのエントリー時間を返す。

iTime()

【使用例】
iTime(NULL, 0, 10);

指定したバーの時間を返す。引数は以下の通りです。

  • 引数1・・・通貨ペアです(NULLでチャートの通貨になります)
  • 引数2・・・時間軸です(0でチャートの時間軸になります)
  • 引数3・・・バーシフトです(0で現在バーの開始時間、1で1つ前ーのバーの開始時間)

本記事で扱った内容は、 EAにおける「時間・曜日判定」ロジックの一部です。

TimeCurrent / iTime を使った時間制御は、 経済指標回避などの実践ロジックでも活用できます。

EAで経済指標日に取引しないようにする関数とサンプルソース

📌 これらの処理は、バー本数・新バー判定と組み合わせて使われることが多く、 EA全体の実行タイミング制御(いつ判断し、いつ処理するか)を構成します。

バー本数・新バー判定・時間制御を 体系的に整理したまとめ記事はこちら👇

【MQL4】バー(ローソク足)本数・新バー判定を使ったEA処理まとめ

さいごに

以上、『【MQL4】TimeCurrent・iTimeで時間・曜日を判定するEA処理まとめ』でした。

私が現在利用している時間関連の処理は大体上記の内容で全てです。あまり時間関連の処理を書いていないと、『あれ?どう書くんだっけ・・・』とよくなるのでまとめてみました。


✅ 今回のロジックをベースにしたEAサンプルも多数公開中

今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。

ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。


📊 EA運用・検証フェーズに進みたい方へ

今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。


EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。

コメント

タイトルとURLをコピーしました