アジア・欧州・アメリカ時間帯別でトレードする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);
コンパイルする
コンパイルしましょう。実際に動きを確認できたら完了です。
ソースコード全体
//+------------------------------------------------------------------+ //| 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); } } //+------------------------------------------------------------------+
まとめ
こうした時間帯別にトレードするプログラムは非常によく活用しますので、ぜひ応用してみてください。
コメント