特定の時間帯のみトレードするEAを作る法
2014/05/27 13:28:23
MetaSysSeeker様のリファレンスからそれらしい関数探してたらできたのでチョー簡単と思われます。
たとえば日本時間の21:30から24:00の間に取引させたくない場合
それはさておき時間指定、TimeCurrent()で取得した現在時刻(を示した莫大な整数)からTimeHour() TimeMinute() で24時間表記の数値を取得するわけですが。
多くの(すべての?)MT4でそうかと思われますがTimeCurrent()で取得するサーバー時刻は、ニューヨーク時間です。日本時間とは夏時間で13時間、冬時間で14時間の時差があります。
なのでニューヨーク時間の8:30 + 時差13:00 = 日本時間の21:30 ですね。正確を期すなら夏時間・冬時間の判定ルーチンも組むべき。
22・23時はminuteを使わずhourだけで判定できるのでもっと簡単。「8時かつ30分以降、または9時以降かつ11時前なら実行しない」処理の 爆 誕 というわけです。簡単でしょ?
時差を考えてコーディングするのはいやじゃー! いやなんじゃー! という人はTimeCurrent()で取得した値に時差ぶんの数値(たぶん時差ぶんのミリ秒)をあらかじめプラスしてやればいいのですが、わしには必要ない処理なので各々でやってつかあさい。
TimeLocal() っていうローカル時間を取得する関数もあるにはありますが、ことEAに関して「動作環境に依存した結果を返す関数」を使うのは危険かなと思います。まあTimeCurrent()もサーバー依存なわけだが、それはまた別のお話。
たとえば日本時間の21:30から24:00の間に取引させたくない場合
datetime dt = TimeCurrent();// dddDTちゃうわ!便宜上not演算子つことるけど個人的には「回避する時間帯でなければ」を真としたif文のほうがすっきりしてて好きね。あとfor文で i++ って後置するのはやめてほしい。いらん値評価=処理が生まれるのよ。++iにしましょう。
int hour = TimeHour( dt ), min = TimeMinute( dt );
if( !( (hour == 8 && min >= 30) ||
(hour >= 9 && hour < 11)
) )
{
// write trade coding
...
}
それはさておき時間指定、TimeCurrent()で取得した現在時刻(を示した莫大な整数)からTimeHour() TimeMinute() で24時間表記の数値を取得するわけですが。
多くの(すべての?)MT4でそうかと思われますがTimeCurrent()で取得するサーバー時刻は、ニューヨーク時間です。日本時間とは夏時間で13時間、冬時間で14時間の時差があります。
なのでニューヨーク時間の8:30 + 時差13:00 = 日本時間の21:30 ですね。正確を期すなら夏時間・冬時間の判定ルーチンも組むべき。
22・23時はminuteを使わずhourだけで判定できるのでもっと簡単。「8時かつ30分以降、または9時以降かつ11時前なら実行しない」処理の 爆 誕 というわけです。簡単でしょ?
時差を考えてコーディングするのはいやじゃー! いやなんじゃー! という人はTimeCurrent()で取得した値に時差ぶんの数値(たぶん時差ぶんのミリ秒)をあらかじめプラスしてやればいいのですが、わしには必要ない処理なので各々でやってつかあさい。
TimeLocal() っていうローカル時間を取得する関数もあるにはありますが、ことEAに関して「動作環境に依存した結果を返す関数」を使うのは危険かなと思います。まあTimeCurrent()もサーバー依存なわけだが、それはまた別のお話。
PR
この記事へのトラックバック
この記事のトラックバックURL