見出し画像

【FX】時間で強制的に約定するEA

 どうもさべっくすと申します。
 時間を指定したら強制的にその時間で保有ポジションを全て約定するEAを作ったのでコードを公開します。

 楽天証券MT4で動作を確認しています。

 その時間に全てのポジションを約定するために長期保有していたいポジションを持っている場合は気を付けてください。

1. コード

//+------------------------------------------------------------------+
//|                                                    TimeLimit.mq4 |
//|                                           Copyright 2024, savex. |
//+------------------------------------------------------------------+
#property strict

//変数の宣言
extern int Magic = 202405001;
input int Slippage           = 10;

int Adjusted_Slippage = 0;

input int retry = 5;                    //注文失敗時のリトライ回数
input int interval = 1000;              //インターバル秒数(ms)

input int HOUR = 21;
input int MINUTE = 25;

//関数の定義
int AdjustSlippage(string Currency, int Slippage_Pips){

   double Symbol_Digits=MarketInfo(Currency,MODE_DIGITS);
   int Calculated_Slippage = 0;
   
   if(Symbol_Digits==2||Symbol_Digits==4){
      Calculated_Slippage = Slippage_Pips;
   }
   else if(Symbol_Digits==3||Symbol_Digits==5){
      Calculated_Slippage = Slippage_Pips*10;
   }
   
   return(Calculated_Slippage);
}

int OnInit()
{
  Adjusted_Slippage = AdjustSlippage(Symbol(),Slippage);
  
  return(0);
}

void OnTick(void){
   
   int i;   
   
   //ポジションクローズ
   for(i=OrdersTotal()-1; i>=0; i-- ){
      if( OrderSelect(i, SELECT_BY_POS) == true ){
      
        if( OrderType() == OP_BUY){
           
           if(((isSummerTime() == true && Hour()==HOUR - 6 && Minute()>=MINUTE && Minute()<=MINUTE + 3) ||
             (isSummerTime() == false && Hour()==HOUR - 7 && Minute()>=MINUTE && Minute()<=MINUTE + 3))
             ){
             
            for (int retryCnt = 0; retryCnt < retry; retryCnt++){
                
                  if( !(OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Adjusted_Slippage,Green)) ){
                    Print("TimeLimit: Error closing BUY order : ",GetLastError());
                    SendMail("MT4 Error", "TimeLimit: Error closing BUY order");
                    Sleep(interval);
                    RefreshRates();
                  }
                  else{
                     Print("TimeLimit: order Closed : ");
                     SendMail("MT4 Exit", "TimeLimit: BUY order Closed");
                     break;    
                  }
                            
               }                  
               return;
          } 
         
       }
       else if(OrderType() == OP_SELL ){
               
           if(((isSummerTime() == true && Hour()==HOUR - 6 && Minute()>=MINUTE && Minute()<=MINUTE + 3) ||
             (isSummerTime() == false && Hour()==HOUR - 7 && Minute()>=MINUTE && Minute()<=MINUTE + 3))
             ){
            
            for (int retryCnt = 0; retryCnt < retry; retryCnt++){
               
                  if( !(OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Adjusted_Slippage,Green)) ){
                    Print("TimeLimit: Error closing SELL order : ",GetLastError());
                    SendMail("MT4 Error", "TimeLimit: Error closing SELL order");
                    Sleep(interval);
                    RefreshRates();  
                  }
                  else{
                     Print("TimeLimit: SELL order Closed : ");
                     SendMail("MT4 Exit", "TimeLimit: SELL order Closed");
                     break; 
                  }
               }          
                  
               return;
            }
                            
        }
      }
   }

   return;
}

bool isSummerTime(){
   bool ret = false;
   
   datetime summerStart;   //サマータイム開始日
   datetime summerEnd;     //サマータイム終了日
   datetime tc = TimeCurrent();
   
   //サマータイム開始日を3/14の前の日曜日に設定
   summerStart = StringToTime(IntegerToString(Year()) + ".03.14");
   summerStart = summerStart - TimeDayOfWeek(summerStart) * 24 * 60 * 60;
   
   //サマータイム終了日を11/7の前の日曜日に設定
   summerEnd = StringToTime(IntegerToString(Year()) + ".11.07");
   summerEnd = summerEnd - TimeDayOfWeek(summerEnd) *24 * 60 * 60;
   
   //現在の時刻がサマータイム開始日と終了日の間であればtrueを返す
   if(tc > summerStart && tc < summerEnd) ret = true;
   return ret;
}

 全文貼り付けたのでコピペしてご利用ください。
 ご利用は自己責任でお願いします。

2. 利用方法


 1分足に本EAをセットして、プロパティ画面で時間を指定してください。
 時間の指定は日本時間でお願いします。

 HOUR:指定時間(時)を入力(デフォルトは21時)
 MINUTE:指定時間(分)を入力(デフォルトは25分)

プロパティ画面

3.仕様

・スリッページが開いていて約定できない場合は、指定時刻から3分間約定を試みます。

MT4の時刻が日本時間と比べて夏時間は6時間、冬時間は7時間ずれているMT4専用のEAです。時刻がずれていないMT4の場合はコード上の-6,-7しているとこを削除してください。

4. 終わり

 朝にポジションを取り、経済指標の発表前にポジションを約定して置きたい。みたいな場合に利用すると便利だと思います。
 簡単なコードですのでお好きに改変して使ってください。

5. おまけ

 私はEAを作ってGogoJungleというサイト様で販売しております。GogoJungleではサイト上でEAを稼働させた結果が表示されます。
 
 稼働し始めたばかりでまだデータが少ないですが、私が作ったEAのリンクを張り付けますので精度を見てみてください(PCじゃないと精度までは見えないかもです)。

 もし、私のEAが信じられると思った場合はご購入いただけますとすんごく嬉しいです(*´▽`*)

九兵衛:朝にコツコツ稼ぐ高勝率EA(シングルポジション)

ゴトーくん:ゴトー日用EA(シングルポジション)

 私は上記EA二つをレギュラーで稼働させていますが、稼げています。
 よろしければどうぞ。

 ではでは、ここまでお読みいただき誠にありがとうございましたm(_ _)m
  皆さまのFXライフが素晴らしいものとなりますようにノシ

いいなと思ったら応援しよう!