✔ 本記事のテーマ
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冊読んでみると良いかと思います。
②無料のプログラミングスクールを活用
ソースコードの理解に苦しむようであれば初級レベルのプログラミングを学びましょう。
最初の基礎ベースを身に着けるならTechAcademyがおすすめです。
TechAcademyは1週間の無料体験があるので、それで十分学べるかと思います。
6.まとめ
本記事では、時間指定のロジックを組む際に使う関数についてまとめました。
度々必要になるかと思うのでブックマークをおすすめします。
その他のロジックについて知りたい方は以下の記事を参照下さい。
>>参考:『FX自動売買システム(EA)の自作に困った際のヒント集』
以上、参考になれば幸いです。