FX-EA System Projectはこちら公式ラインに登録して
プレゼントをもらう

【MQL】アジア・欧州・アメリカ時間帯別でトレードするEA【中級編】

MQL MT4 アジア 欧州 アメリカ 時間帯別 トレード EAMT4EA作成

アジア・欧州・アメリカ時間帯別でトレードするEA

アジア・欧州・アメリカ時間帯別でトレードするEAを作成したいと思います。

  • アジア時間:RSI70以上30以下で逆張り
  • 欧州時間:ゴールデンクロスとデッドクロスで順張り
  • アメリカ時間:RSI80以上20以下で順張り

という形で作成していきます。

メタエディタ(MetaEditor)を立ち上げる

メタエディタ(MetaEditor)を立ち上げましょう。今回は名前を「JP-EU-NY-EA」で作成します。

パラメーターを記述する

パラメーターを記述しましょう。

input int TakeProfit = 5;//利確
input int StopLoss = 50;//ストップロス
input double Lots = 0.01;//ロット数
input int MagicNumber = 12345;//マジックナンバー

input int StartTimeA = 21;//アジア開始時間(サーバー時刻)
input int EndTimeA = 6;//アジア終了時間
input int EndTimeE = 12;//欧州終了時間
input int EndTimeU = 21;//アメリカ終了時間

input int RSI_period = 14;//RSI期間
input int MA_Short_period = 50;//短期移動平均線期間
input int MA_Long_period = 100;//長期移動平均線期間

 

OnTick()関数を記述する

OnTick()関数を記述しましょう。まずは変数をそれぞれ記述していきます。

TimeHour()は指定した日付データの時を返す関数です。

その中にあるTimeCurrent()は、最後に受信したサーバー時間を返す関数です。

つまり、最後に受信したサーバー時間の時間を使います。
JpnTimeは日本時間、EurTimeは欧州時間、UsaTimeは欧米時間になります。

   int NowHour = TimeHour(TimeCurrent());//現在の時間
   int TimeSignal;
   int JpnTime = 0;
   int EurTime = 1;
   int UsaTime = 2;

次にテクニカル指標を格納する変数を用意します。

   double RSI;//RSI
   double genMA_Short,genMA_Long;//現在の短期移動平均線と現在の長期移動平均線
   double kakoMA_Short,kakoMA_Long;//1つ前の短期移動平均線と1つ前の長期移動平均線

現在の時間がStartTimeA以上で、現在の時間がEndTimeAより小さい場合TimeSignalをJpnTimeにします。

if(NowHour >= StartTimeA && NowHour < EndTimeA) TimeSignal = JpnTime;

現在の時間がEndTimeA以上で、現在の時間がEndTimeEより小さい場合TimeSignalをEurTimeにします。

if(NowHour >= EndTimeA && NowHour < EndTimeE) TimeSignal = EurTime;

現在の時間がEndTimeE以上で、現在の時間がEndTimeUより小さい場合TimeSignalをUsaTimeにします。

if(NowHour >= EndTimeE && NowHour < EndTimeU) TimeSignal = UsaTime;

それぞれの変数にテクニカル指標を値を代入します。

   RSI = iRSI(Symbol(),0,RSI_period,PRICE_CLOSE,0);//RSI
   kakoMA_Short = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,1);
   kakoMA_Long = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,1);
   genMA_Short = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,0);
   genMA_Long = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,0);

ではここから時間帯別にロジックでエントリーするプログラムを書いていきます。

日本時間でRSIが30より小さい場合は

if(TimeSignal == JpnTime && RSI < 30)

ロングのポジションを取ります。

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);

日本時間でRSIが70より大きい場合は

if(TimeSignal == JpnTime && RSI > 70)

ショートのポジションを取ります。

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);

欧州時間でゴールデンクロスした場合は

if(TimeSignal == EurTime && kakoMA_Short < kakoMA_Long && genMA_Short > genMA_Long)

ロングのポジションを持ちます。

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);

欧州時間でデッドクロスした場合は

if(TimeSignal == EurTime && kakoMA_Short > kakoMA_Long && genMA_Short < genMA_Long)

ショートのポジションを持ちます。

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);

米国時間でRSIが80より大きい場合は

if(TimeSignal == UsaTime && RSI >80)

ロングのポジションを持ちます。

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);

米国時間でRSIが20より小さい場合は

if(TimeSignal == UsaTime && RSI < 20)

ショートのポジションを持ちます。

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);

これでOnTick()関数は完了です。

   int NowHour = TimeHour(TimeCurrent());//現在の時間
   int TimeSignal;//それぞれの時間代入する変数
   int JpnTime = 0;//日本時間
   int EurTime = 1;//欧州時間
   int UsaTime = 2;//欧米時間
   
   double RSI;//RSI
   double genMA_Short,genMA_Long;//現在の短期移動平均線と現在の長期移動平均線
   double kakoMA_Short,kakoMA_Long;//1つ前の短期移動平均線と1つ前の長期移動平均線
   
   if(NowHour >= StartTimeA && NowHour < EndTimeA) TimeSignal = JpnTime;//現在の時間がStartTimeA以上で、現在の時間がEndTimeAより小さい場合TimeSignalをJpnTimeにする。
   if(NowHour >= EndTimeA && NowHour < EndTimeE) TimeSignal = EurTime;//現在の時間がEndTimeA以上で、現在の時間がEndTimeEより小さい場合TimeSignalをEurTimeにする。
   if(NowHour >= EndTimeE && NowHour < EndTimeU) TimeSignal = UsaTime;//現在の時間がEndTimeE以上で、現在の時間がEndTimeUより小さい場合TimeSignalをUsaTimeにする。

   RSI = iRSI(Symbol(),0,RSI_period,PRICE_CLOSE,0);//RSI
   kakoMA_Short = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,1);//1つ前の短期移動平均線
   kakoMA_Long = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,1);//1つ前の長期移動平均線
   genMA_Short = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,0);//現在の短期移動平均線
   genMA_Long = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,0);//現在の長期移動平均線

   if(TimeSignal == JpnTime && RSI < 30)//日本時間でRSIが30より小さい場合
   {
     OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);
   }
   if(TimeSignal == JpnTime && RSI > 70)//日本時間でRSIが70より大きい場合
   {
     OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);
   }
   if(TimeSignal == EurTime && kakoMA_Short < kakoMA_Long && genMA_Short > genMA_Long)//欧州時間でゴールデンクロスした場合
   {
     OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);
   }
   if(TimeSignal == EurTime && kakoMA_Short > kakoMA_Long && genMA_Short < genMA_Long)//欧州時間でデッドクロスした場合
   {
     OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);
   }
   if(TimeSignal == UsaTime && RSI >80)//米国時間でRSIが80より大きい場合
   {
     OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);
   }
   if(TimeSignal == UsaTime && RSI < 20)//米国時間でRSIが20より小さい場合
   {
     OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);
 
Copy

コンパイルする

コンパイルしましょう。実際に動きを確認できたら完了です。

ソースコード全体

//+------------------------------------------------------------------+
//|                                                  JP-EU-NY-EA.mq4 |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict

/*パラメーター*/
input int TakeProfit = 5;//利確
input int StopLoss = 50;//ストップロス
input double Lots = 0.01;//ロット数
input int MagicNumber = 12345;//マジックナンバー

input int StartTimeA = 21;//アジア開始時間(サーバー時刻)
input int EndTimeA = 6;//アジア終了時間
input int EndTimeE = 12;//欧州終了時間
input int EndTimeU = 21;//アメリカ終了時間

input int RSI_period = 14;//RSI期間
input int MA_Short_period = 50;//短期移動平均線期間
input int MA_Long_period = 100;//長期移動平均線期間

 //+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int NowHour = TimeHour(TimeCurrent());//現在の時間
   int TimeSignal;//それぞれの時間代入する変数
   int JpnTime = 0;//日本時間
   int EurTime = 1;//欧州時間
   int UsaTime = 2;//欧米時間
   
   double RSI;//RSI
   double genMA_Short,genMA_Long;//現在の短期移動平均線と現在の長期移動平均線
   double kakoMA_Short,kakoMA_Long;//1つ前の短期移動平均線と1つ前の長期移動平均線
   
   if(NowHour >= StartTimeA && NowHour < EndTimeA) TimeSignal = JpnTime;//現在の時間がStartTimeA以上で、現在の時間がEndTimeAより小さい場合TimeSignalをJpnTimeにする。
   if(NowHour >= EndTimeA && NowHour < EndTimeE) TimeSignal = EurTime;//現在の時間がEndTimeA以上で、現在の時間がEndTimeEより小さい場合TimeSignalをEurTimeにする。
   if(NowHour >= EndTimeE && NowHour < EndTimeU) TimeSignal = UsaTime;//現在の時間がEndTimeE以上で、現在の時間がEndTimeUより小さい場合TimeSignalをUsaTimeにする。

   RSI = iRSI(Symbol(),0,RSI_period,PRICE_CLOSE,0);//RSI
   kakoMA_Short = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,1);//1つ前の短期移動平均線
   kakoMA_Long = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,1);//1つ前の長期移動平均線
   genMA_Short = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,0);//現在の短期移動平均線
   genMA_Long = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,0);//現在の長期移動平均線

   if(TimeSignal == JpnTime && RSI < 30)//日本時間でRSIが30より小さい場合
   {
     OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);
   }
   if(TimeSignal == JpnTime && RSI > 70)//日本時間でRSIが70より大きい場合
   {
     OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);
   }
   if(TimeSignal == EurTime && kakoMA_Short < kakoMA_Long && genMA_Short > genMA_Long)//欧州時間でゴールデンクロスした場合
   {
     OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);
   }
   if(TimeSignal == EurTime && kakoMA_Short > kakoMA_Long && genMA_Short < genMA_Long)//欧州時間でデッドクロスした場合
   {
     OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);
   }
   if(TimeSignal == UsaTime && RSI >80)//米国時間でRSIが80より大きい場合
   {
     OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Lime);
   }
   if(TimeSignal == UsaTime && RSI < 20)//米国時間でRSIが20より小さい場合
   {
     OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Red);
   }
  }
//+------------------------------------------------------------------+
Copy

まとめ

こうした時間帯別にトレードするプログラムは非常によく活用しますので、ぜひ応用してみてください。

コメント

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