ブログタイトルを「FX自動売買システム開発部」から「autoFX」に変更しました!

仕掛け時間帯指定機能

最大3つまで仕掛けの時間帯を指定できる

※2016/8/6 kumaさんのご指摘でcalcTimeDifference()に不具合があることが判明。修正しました。

○時~○時までの間は仕掛けたいが、それ以外の時間帯は仕掛けたくない(EAを稼働させたくない)ことがしばしばあります。これを実現する機能が仕掛け時間帯指定機能です。

サマータイムを考慮した自動GMT設定関数を使って、仕掛け時間帯指定機能を実装してみようと思います。

書籍では○時~○時を1つだけ指定できるものが殆どです。しかし、ロンドン時間とニューヨーク時間の2つの時間帯でEAを稼働させたいシーンってあると思うんですよ。

というわけで、○時~○時を最大3つまで指定できる仕掛け時間帯指定機能(例えば、6:00~9:00、16:00~19:00、21:00~0:00)を紹介します。

EA全体で機能を実装するため、サンプルEAを直接掲載します。

「仕掛け時間帯指定機能」のSample.mq4
サイズ: 9.0KB
バージョン: 1.0
公開:2019年10月16日

以下のパラメータの記述により仕掛け時間帯を設定できるようになります。1~3のそれぞれに有効フラグを設けることで、機能のon/offを簡単に切り替えられるようになっています。

extern string Note02_4          = "--- Entry Time 1-3 -------------------------------------------";
extern string Note02_5          = "Entry Time 1 (Local Time)";
extern bool   UseEntryTimeFlg1  = true;
extern int    EntryStartHour1   = 6; // 仕掛け開始時刻(時) ローカルタイム
extern int    EntryStartMinute1 = 0; // 仕掛け開始時刻(分) ローカルタイム
extern int    EntryEndHour1     = 9; // 仕掛け終了時刻(時) ローカルタイム
extern int    EntryEndMinute1   = 0; // 仕掛け終了時刻(分) ローカルタイム
extern string Note02_6          = "Entry Time 2 (Local Time)";
extern bool   UseEntryTimeFlg2  = true;
extern int    EntryStartHour2   = 16;
extern int    EntryStartMinute2 = 0;
extern int    EntryEndHour2     = 19;
extern int    EntryEndMinute2   = 0;
extern string Note02_7          = "Entry Time 3 (Local Time)";
extern bool   UseEntryTimeFlg3  = true;
extern int    EntryStartHour3   = 21;
extern int    EntryStartMinute3 = 0;
extern int    EntryEndHour3     = 0;
extern int    EntryEndMinute3   = 0;

続いて、OnInit()で有効フラグが何本立っているかカウントしておきます。有効フラグが3本立っている場合で、現在時刻がいずれの仕掛け時間帯にも含まれなかった場合、仕掛け不可と判断するのに利用します。

  // 仕掛け時間帯指定
  if(UseEntryTimeFlg1){
    gEntryTimeFlgTrueCnt += 1;
  }

  if(UseEntryTimeFlg2){
    gEntryTimeFlgTrueCnt += 1;
  }

  if(UseEntryTimeFlg3){
    gEntryTimeFlgTrueCnt += 1;
  }

そして、OnTick()で現在時刻が仕掛け時間帯かどうかを判断し、NOなら仕掛けを不可とし、以降の仕掛け処理をスキップします。

  // -----------------------------------------------------------------
  // 仕掛け時間帯指定
  // -----------------------------------------------------------------
  // ローカルタイム時刻(時)⇒サーバタイム時刻(時)変換
  gSvEntryStartHour1 = convertLocalToServerTime(EntryStartHour1, timeDiff);
  gSvEntryEndHour1   = convertLocalToServerTime(EntryEndHour1,   timeDiff);

  gSvEntryStartHour2 = convertLocalToServerTime(EntryStartHour2, timeDiff);
  gSvEntryEndHour2   = convertLocalToServerTime(EntryEndHour2,   timeDiff);

  gSvEntryStartHour3 = convertLocalToServerTime(EntryStartHour3, timeDiff);
  gSvEntryEndHour3   = convertLocalToServerTime(EntryEndHour3,   timeDiff);

  // -----------------------------------------------------------------
  // 仕掛けフィルター
  // -----------------------------------------------------------------
  int overCnt = 0;

  // 仕掛け時間帯指定
  if(UseEntryTimeFlg1 && isOverTime(gSvEntryStartHour1, EntryStartMinute1, gSvEntryEndHour1, EntryEndMinute1)){
    overCnt += 1;
  }

  if(UseEntryTimeFlg2 && isOverTime(gSvEntryStartHour2, EntryStartMinute2, gSvEntryEndHour2, EntryEndMinute2)){
    overCnt += 1;
  }

  if(UseEntryTimeFlg3 && isOverTime(gSvEntryStartHour3, EntryStartMinute3, gSvEntryEndHour3, EntryEndMinute3)){
    overCnt += 1;
  }

  // 仕掛け時間外なら、仕掛けない
  if(overCnt == gEntryTimeFlgTrueCnt){
    return;
  }

convertLocalToServerTime()関数はローカルタイムをサーバタイムに変換する自作関数です。isOverTime()関数も自作関数で、現在時刻が仕掛け時間帯かどうかを教えてくれます。

if(overCnt == gEntryTimeFlgTrueCnt)の部分が理解しにくいかもしれませんが、一番重要な部分です。言葉でごちゃごちゃ説明されるより、このEAを実際に動かして何をしているのか確認してみてください。その方がずっと理解が深まりますので。

MQL4プログラミングの最新記事8件

>完全放ったらかしEA 「AutoEndlessCatchRange」

完全放ったらかしEA 「AutoEndlessCatchRange」

「本業が忙しい!」「でも資産運用したい!」そんなあなたに最適なEAです。兼業トレーダーの方はチャートを毎日みて分析してトレードする時間はなかなか確保できないものです。トレードは本EAに任せて、本業やプライベートの時間をもっと増やしませんか?元々は自分自身のために開発したEAですので、手抜き無しのガチものです。

CTR IMG