Meridian Session Clock
- ライブラリ
- バージョン: 1.0
- アクティベーション: 5
MQL4 用の時間ライブラリです:UTC と 12 のタイムゾーンの間を夏時間を含めて正しく変換し、ブローカーのサーバー時計をモデル化(価格履歴から自動判定)し、Sydney・Tokyo・London・New York の各セッションと独自セッションについて、開いているかどうか、開始・終了時刻、OHLC レンジを提供し、FX の取引日と週末も扱います。TimeGMT() と違い、ストラテジーテスターでもリアルと同じ答えを返します。取引も描画もファイル書き込みも一切行いません。お届けするのはコンパイル済みの Meridian_Session_Clock.ex4 で、このページが API の完全なリファレンスです。
クイックスタート
- Meridian_Session_Clock.ex4 を MQL4/Libraries にコピーします(ファイル > データフォルダを開く)。
- 下の #import ブロックを EA、インジケーター、スクリプトに貼り付けます。
- OnInit:MSC_DetectBroker("EURUSD", 104, base, conf, used)、サーバー時計が分かっている場合は MSC_SetBroker(MSC_US_DST, 120)。
- サーバー時刻(TimeCurrent()、Time[i])を使います:MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent())。
- 確認:下の例をストラテジーテスターで実行します。ログに毎バー、判定されたモデルと London セッションの時刻が出力されます。
インポート宣言(コピーしてそのまま使用可)
#import "Meridian_Session_Clock.ex4"
int MSC_ZoneOffset(int zone, datetime utc);
bool MSC_IsDST(int zone, datetime utc);
datetime MSC_ToZone(datetime utc, int zone);
datetime MSC_FromZone(datetime local, int zone);
datetime MSC_NextChange(int zone, datetime utc);
string MSC_ZoneName(int zone);
bool MSC_SetBroker(int model, int base_minutes);
int MSC_DetectBroker(string symbol, int weeks, int &base_minutes, double &confidence, int &weeks_used);
int MSC_BrokerOffset(datetime utc);
datetime MSC_ServerToUTC(datetime server_time);
datetime MSC_UTCToServer(datetime utc);
int MSC_SessionAdd(int zone, int start_minute, int end_minute, int days_mask);
void MSC_SessionClear();
string MSC_SessionName(int session);
bool MSC_SessionIsOpen(int session, datetime server_time);
datetime MSC_SessionStart(int session, datetime server_time, int index);
datetime MSC_SessionEnd(int session, datetime server_time, int index);
int MSC_SessionRange(string symbol, int timeframe, int session, datetime server_time, int index, double &result[]);
datetime MSC_TradingDayStart(datetime server_time);
bool MSC_IsWeekend(datetime server_time);
int MSC_LastError();
string MSC_ErrorText(int code);
#import
enum MSC_ZONE { MSC_UTC, MSC_LONDON, MSC_FRANKFURT, MSC_ATHENS, MSC_MOSCOW, MSC_DUBAI, MSC_SINGAPORE, MSC_TOKYO,
MSC_SYDNEY, MSC_WELLINGTON, MSC_NEW_YORK, MSC_CHICAGO };
enum MSC_MODEL { MSC_FIXED, MSC_US_DST, MSC_EU_DST };
enum MSC_SESSION { MSC_SYDNEY_SESSION, MSC_TOKYO_SESSION, MSC_LONDON_SESSION, MSC_NEW_YORK_SESSION }; 基本概念
- 3 種類の時刻:utc、server(ブローカーのサーバー時刻:TimeCurrent、バーの時刻)、local(ゾーンの現地時刻)。
- ゾーン 0-11:UTC、London、Frankfurt、Athens、Moscow、Dubai、Singapore(香港・上海も同じ)、Tokyo、Sydney、Wellington、New York、Chicago。夏時間は 2000 年以降の各ゾーンの法律に従い、米国 2007、Sydney 2000 / 2006 / 2008、Auckland 2007 / 2008、Moscow 2011 / 2014 の変更も含みます。対応範囲は 2000-2099 年で、それ以外の時刻も同じ規則で計算し -2 を立てます。
- 夏時間開始で飛ばされる、または終了で繰り返される現地時刻は、切り替え前のオフセットで読みます(3 月の切り替え日の New York 02:30 = 07:30 UTC、11 月の切り替え日の 01:30 = 05:30 UTC で最初の方)。
- ブローカー時計 = UTC + オフセット。モデル:0 FIXED(通年でベース値)、1 US DST(米国の夏はベース + 60:"New York close" ブローカー、GMT+2 / GMT+3)、2 EU DST(欧州の夏はベース + 60)。既定は 1、ベース 120。
- セッションはゾーンの現地時刻で、開始日基準の月曜から金曜で定義します:0 SYDNEY 07:00-16:00 Sydney、1 TOKYO 09:00-18:00 Tokyo、2 LONDON 08:00-17:00 London、3 NEW YORK 08:00-17:00 New York。独自 id は 4-15。インスタンスは開始(含む)から終了(含まない)まで。index 0 = 指定時刻以前に始まった最新のインスタンス(進行中または終了済み)、-1 はその前、+1 は次、範囲は -260 から 260。
API リファレンス
すべての関数が MSC_LastError を設定します。誤ったゾーンまたはセッション id は -1 と、0、false、"UNKNOWN"、-1 のいずれかを返します。
MSC_ZoneOffset、MSC_IsDST、MSC_ToZone、MSC_FromZone
utc 時点のゾーンの UTC からのオフセット(分)、夏時間かどうか(Moscow 2011-2014 の恒久的な UTC+4 は夏時間ではありません)、utc + オフセットの現地時刻、上記の規則で現地時刻から UTC への変換。
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange と MSC_ZoneName
utc より後の最初のオフセット変更(UTC 時刻)、3 年以内になければ 0(UTC、Dubai、Singapore、Tokyo、2014 年以降の Moscow)。ゾーン名は上の一覧のとおりです。
MSC_SetBroker
model 0-2、base_minutes は -720 から 840 まで 15 刻み。それ以外は false と -1。
MSC_DetectBroker
symbol("" = チャートの銘柄)の週末の空き(36 時間以上)の直後の最初の H1 バーを、新しい方から weeks 週(4-520、0 = 104)まで読みます。FX は日曜の New York 時刻 17:00 に始まるので、各週からオフセットが得られ、最も多くの週に合うモデルとベースが選ばれます(同数なら US DST、次に EU DST、次に FIXED)。60% 以上の週が合えばモデルを返して適用し、そうでなければ -1 と -5 NOT DETECTED(base_minutes と confidence は入ります)。H1 履歴がなければ -3 NO DATA。24/5 の主要 FX ペアを使ってください:貴金属や指数は日曜の開始が遅く 1 時間多く読みます(テストでは XAUUSD がベース 120 ではなく 180 になりました)。夏時間の切り替えを含めるため 52 週以上を使い、祝日週は信頼度を下げます。ストラテジーテスターではテスターが読み込んだ履歴だけが見えます(weeks_used が読み込んだ週数を示します)。
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset、MSC_ServerToUTC、MSC_UTCToServer
utc 時点のサーバーのオフセット(分)、サーバー時刻から UTC(切り替え前後の 1 時間は上記の規則)、UTC からサーバー時刻。
MSC_SessionAdd、MSC_SessionClear、MSC_SessionName
セッションを追加します:zone、現地の午前 0 時からの分で開始と終了(0-1439、異なる値、終了が開始より小さければ夜間)、開始日の days_mask(bit 0 日曜から bit 6 土曜、62 = 月曜から金曜、1-127)。id 4-15 を返すか、-1 と -1 または -4 SESSION LIMIT。MSC_SessionClear は独自セッションを削除します(id は 4 から再利用)。名前:SYDNEY、TOKYO、LONDON、NEW YORK、CUSTOM n。
int fra = MSC_SessionAdd(MSC_FRANKFURT, 7 * 60, 15 * 60 + 30, 62); // 07:00-15:30 Frankfurt
MSC_SessionIsOpen、MSC_SessionStart、MSC_SessionEnd
インスタンス 0 が server_time を含むかどうか、インスタンス index の開始または終了のサーバー時刻。エラー時は 0。
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
symbol("" = チャート)の timeframe(0 = チャート、M1、M5、M15、M30、H1)のうち、始値時刻がインスタンス内にあるバーから、インスタンス index の OHLC を求めます。result[] には 7 つの値:0 始値、1 高値、2 安値、3 終値、4 高値に最初に達したバーの時刻、5 安値に最初に達したバーの時刻、6 バー数。バー数を返し、内側にバーがなければ 0 と -3 NO DATA、timeframe・セッション・index が誤りなら -1。進行中のインスタンスはこれまでのバーを使います。
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart と MSC_IsWeekend
server_time 以前で最新の New York 17:00 のサーバー時刻(FX 取引日の開始)。週末 = New York 時刻の金曜 17:00 から日曜 17:00 まで。
MSC_LastError と MSC_ErrorText
最後の呼び出しのコードとテキスト:0 OK、-1 INVALID PARAMETER、-2 OUT OF RANGE、-3 NO DATA、-4 SESSION LIMIT、-5 NOT DETECTED、それ以外は UNKNOWN。
動作する統合例
エキスパートアドバイザーです。先に上のインポートブロックと enum 行を貼り付けてください。
datetime last = 0;
int OnInit()
{
int base, used; double conf;
int m = MSC_DetectBroker("EURUSD", 104, base, conf, used);
if(m < 0) MSC_SetBroker(MSC_US_DST, 120);
PrintFormat("model %d base %d conf %.2f weeks %d: %s", m, base, conf, used, MSC_ErrorText(MSC_LastError()));
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(Time[0] == last) return;
last = Time[0];
datetime now = TimeCurrent();
PrintFormat("London %s - %s server, open %d, FX day since %s, weekend %d",
TimeToString(MSC_SessionStart(MSC_LONDON_SESSION, now, 0)), TimeToString(MSC_SessionEnd(MSC_LONDON_SESSION, now, 0)),
MSC_SessionIsOpen(MSC_LONDON_SESSION, now), TimeToString(MSC_TradingDayStart(now)), MSC_IsWeekend(now));
} アーキテクチャと注意事項
- 純粋な計算:規則は表を引くのではなく計算するため、何もダウンロードしません。ブローカーモデルとセッション表は、ライブラリをインポートするプログラムごとに保持されます。
- MetaTrader 4、あらゆる銘柄と時間足。EA、インジケーター、スクリプトで使用可能。ストラテジーテスターと最適化で安全:DLL、ファイル、Web リクエスト、チャートオブジェクト、タイマー、グローバル変数を使いません。バーを読むのは MSC_DetectBroker と MSC_SessionRange だけです。
- 制限:セッション 16(組み込み 4)、インスタンス index は -260 から 260、年は 2000-2099。
- 代表的な設定。セッションフィルター:MSC_SessionIsOpen(MSC_LONDON_SESSION, now) の間だけ取引。アジアレンジのブレイクアウト:London の開始時に MSC_TOKYO_SESSION の MSC_SessionRange、index 0(このとき Tokyo はまだ開いています)。日次ロジック:MSC_TradingDayStart でリセット。バックテスト:OnInit で MSC_DetectBroker または MSC_SetBroker を呼び、TimeGMT() は使わないでください。
- スクリーンショットと動画は、このライブラリで作ったデモ EA を示しています。購入内容には含まれません。
リスクに関する注意
セッション時刻は市場が通常活発な時間を表すもので、価格の動きを示すものではありません。ブローカーの休日予定を確認し、まずデモ口座でテストしてください。
