FX自動売買システム開発

自作EAで日付や時間、曜日を取得する方法【MT4でFX自動売買】

 

✔ 本記事のテーマ

FX自動売買システム(EA)で日付や時間、曜日を取得する方法

 

✔ 記事を読むメリット

時間を取得する際によく使う関数とサンプルロジックを紹介します。
ブックマークしておくと後で使い易いかと思います。

 

✔ 以下の方におすすめ

・前回トレードから5分以内という取引条件を組みたい

・利確、または損切りから一定期間エントリーしないようにしたい

・指定時刻で自動的にポジションを全決済したい

 

上記のような悩みにばっちり答えます。
最後に取引条件に組み込む際の注意点やサンプルコードを掲載しています。

 

↓そもそも「MT4って何?」という方はこちら。
メタトレーダー(MT4)の使い方!入手方法も解説

↓サンプルEAの動かし方や評価、改編方法は以下
MT4で自作するFX自動売買システム(EA)とは?作り方を徹底解説!

 

 

1.日付や時間、曜日を取得する関数

いずれの場合もサーバーの時間(PCのローカル時間ではない)が基準です。
サーバー時間はMT4の気配値の部分で確認できます。

 

よく使う関数 Hour(), Minute(), Seconds(), DayOfWeek()

基本これがあれば困ることは無いかと思います。

関数 戻り値
Hour() 最後に受信したサーバー時間の"時"(0-23)
Minute() 最後に受信した サーバー時間の"分"(0-59)
Seconds() 最後に受信したサーバー時間の"秒"(0-59)
DayOfWeek() 最後に受信したサーバー時間の"曜日"(0:日,1:月,2:火,3:水,4:木,5:金,6:土)

 

例えば以下のようなケースで使用します。

・7時から9時は取引しない

・月曜日と金曜日は取引しない

・1回ポジションを取ったら5分は様子見

 

余り使わない関数 Year (), Month(), Day (), DayOfYear ()

年末年始や長期休暇のような取引量が減少する時期を避けるために使うことができます。

関数 戻り値
Year () 最後に受信したサーバー時間の"年"
Month() 最後に受信したサーバー時間の"月"
Day () 最後に受信したサーバー時間の"日"
DayOfYear () 最後に受信したサーバー時間の"経過日数"

 

2.サマータイム、ウィンタータイムを取得する関数

サマータイム(夏時間)、ウィンタータイム(冬時間)を判断したい場合に使います。
休場中にEAを停止したい場合などに使います。

関数 戻り値
TimeGMT () コンピュータのローカル時間から算出したGMT時間(サマータイム考慮)
TimeDaylightSavings() 夏時間への切り替えが行われている場合の補正秒数(冬時間の場合は0)
TimeGMTOffset () 補正秒数を考慮したGMT時間と、ローカルコンピュータの時間差

 

3.時間データの「型」2つ

datetime型で指定日時を表す方法

datetime型で指定日時のデータを取得することができます。
ある日を起点にしたロジックを組む場合は使うかもしれません。

 

datetime型の日時データを取得するのに使う関数

「D'year.mon.day hour:min:sec'」の形で返ってきます。

関数 戻り値
TimeCurrent() 最後に受信したサーバー時間(datetame型)
TimeLocal() ローカルコンピュータの時間(datetame型)

 

datetime型から希望の日時を返す方法

aは変数名

関数 戻り値
TimeYear(datetime a) 指定日時の"年"
TimeMonth(datetime a) 指定日時の"月"
TimeDay(datetime a) 指定日時の"日"
TimeHour(datetime a) 指定日時の"時"(0-23)
TimeMinute(datetime a) 指定日時の"分"(0-59)
TimeSeconds(datetime a) 指定日時の"秒"(0-59)
TimeDayOfWeek (datetime a) 指定日時の"曜日"(0:日,1:月,2:火,3:水,4:木,5:金,6:土)
TimeDayOfYear (datetime a) 指定日時の 1月1日を起点とした"経過日数"

 

MqlDateTime構造体型で指定日時を表す方法

構造体は他のプログラミング言語でも使いますが初心者向けではないです。
Time〇〇で返せば良いのでさらに使い道がない気はします。

 

datetime型からMqlDateTime構造体型に変換する関数

a,b,cは変数名

関数 戻り値
TimeToStruct(datetime a , MqlDateTime b) datetime型 a からMqlDateTime構造体型 b に変換
StructToTime(MqlDateTime b, datetime a) MqlDateTime構造体型 b から datetime型 a に変換

 

MqlDateTime構造体の中身

指定する場合は c.yearとかc.day_of_week といった形で使用します。

 command
struct MqlDateTime c
{
int year; // 年
int mon; // 月
int day; // 日
int hour; // 時間
int min; // 分
int sec; // 秒
int day_of_week; // 曜日(0:日,1:月,2:火,3:水,4:木,5:金,6:土)
int day_of_year; // 1月1日を起点とした経過日数
};

 

4.時間を取引条件に組み込む際の注意点

時間を取引条件に組み込む前のロジックで利益が出ることを確認して下さい。
要は「時間条件があれば更に利益が出るロジック」に使うべきです。

 

以下にコードの例を示します。

 

拡張コード(全決済ロジック改編)

全決済ロジックで公開しているコードに時間条件を追記しています。
サーバー時間の17時にポジションを一括決済します。

 

 command
//------------------------------------------------------------------------------------
// 6. allclose : ポジション全決済
//------------------------------------------------------------------------------------
void allclose(){
int res,res2;
double BID,ASK,endlots;
int torder = OrdersTotal();
bool closeflg;
for(int i = torder-1; i >= 0; i--){
res = OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
BID = MarketInfo(OrderSymbol(),MODE_BID);
ASK = MarketInfo(OrderSymbol(),MODE_ASK);
endlots = OrderLots();
if(DayOfWeek()==5&&Hour()>=17) //週末にクローズ
closeflg = true;
else
closeflg = false;
if(closeflg){
if(OrderType() == OP_SELL)
res2 = OrderClose(OrderTicket(),endlots,ASK,50,Blue);
if(OrderType() == OP_BUY)
res2 = OrderClose(OrderTicket(),endlots,BID,50,Blue);
}
Sleep(3000); //連続で決済命令を送ると証券会社側で弾かれるため
}
}

 

5.EA開発に詰まったら

EA開発に限らず、物事に詰まったら外部の知識を頼るのが賢い選択です。
以下ではトレードとプログラミングに役立つ参考書籍やサービスを紹介します。

 

①書籍でトレードの勉強

基本ブログ内で完結するよう心がけていますが、以下の本があると理解が深まります。
シリーズものですがとりあえず1冊読んでみると良いかと思います。

■FXメタトレーダー入門 AMAZON 楽天

 

②無料のプログラミングスクールを活用

ソースコードの理解に苦しむようであれば初級レベルのプログラミングを学びましょう。
最初の基礎ベースを身に着けるならTechAcademyがおすすめです。
TechAcademyは1週間の無料体験があるので、それで十分学べるかと思います。

>>Techacademyの無料体験はこちら

 

6.まとめ

本記事では、時間指定のロジックを組む際に使う関数についてまとめました。
度々必要になるかと思うのでブックマークをおすすめします。

 

その他のロジックについて知りたい方は以下の記事を参照下さい。

>>参考:『FX自動売買システム(EA)の自作に困った際のヒント集』

 

以上、参考になれば幸いです。

 

  • この記事を書いた人

HAZU

静岡の一部上場企業で働く兼業投資家、投資を初めて6年が経ちました。30代のセミリタイアを目指して20代からコツコツと資産形成中。趣味はキャンプとプログラミング。ブログでは主に【FXの始め方から自動化】までを扱っています。

-FX自動売買システム開発

© 2021 HAZUの資産形成ラボ Powered by AFFINGER5