MQL5 symbol-trading-hoursの使い方と取引時間判定の実装

目次

1. MQL5 symbol-trading-hoursとは何か

【結論】
MQL5のsymbol-trading-hoursとは、銘柄ごとの「実際に取引可能な時間帯」をプログラムから取得・判定するための仕組みです。EAの誤発注や市場クローズ時のエラー回避に必須です。

【定義】
symbol-trading-hoursとは、MQL5において銘柄(Symbol)の取引セッション(売買可能時間)を取得する機能であり、主にSymbolInfoSessionTrade()関数で取得します。


1.1 なぜ取引時間の取得が必要なのか

【結論】
取引時間を考慮しないEAは、市場クローズ時に注文エラー・スリッページ拡大・スプレッド異常を引き起こします。

【定義】
取引時間とは、ブローカーが定義する「注文が成立する時間帯(executionが有効な時間)」のことです。


MQL5で自動売買(EA)を開発する場合、「いつトレードするか」だけでなく、「いつトレードしないか」の制御が極めて重要です。

特に以下のような状況で問題が発生します:

  • 市場クローズ中(週末・祝日)
  • セッション切り替え直後(流動性が低い)
  • ロールオーバー時間(スプレッド急拡大)
  • CFD・指数などの時間制限銘柄

これらを無視すると、以下のリスクが顕在化します:

  • TRADE_RETCODE_MARKET_CLOSED エラー
  • 異常スプレッドによる不利なexecution
  • slippage(約定ずれ)の拡大
  • 注文拒否や再試行ループ

1.2 symbol-trading-hoursの基本構造

【結論】
MQL5では、銘柄ごとの取引時間は「曜日 × セッション単位」で管理されています。

【定義】
セッションとは、1日の中で分割された取引可能時間帯(例:東京時間・ロンドン時間など)を指します。


MQL5の取引時間は以下の構造で管理されています:

  • 曜日(0〜6:日曜〜土曜)
  • セッション番号(0〜複数)
  • 開始時刻(from)
  • 終了時刻(to)

つまり、単純な「1日=1つの時間帯」ではなく、
1日に複数の取引セッションが存在する可能性があります。

例:

曜日セッション開始終了
月曜009:0011:30
月曜113:0017:00

このような構造のため、単純な時間比較ではなく、
セッション単位での判定が必要になります。


1.3 使用する主要関数(概要)

【結論】
symbol-trading-hoursの取得には、SymbolInfoSessionTrade()を使用します。

【定義】
SymbolInfoSessionTrade()は、指定した銘柄・曜日・セッションの取引時間を取得する関数です。


基本的な関数シグネチャ:

bool SymbolInfoSessionTrade(
   string           symbol,       // 銘柄
   ENUM_DAY_OF_WEEK day_of_week,  // 曜日
   uint             session_index,// セッション番号
   datetime&        from,         // 開始時間
   datetime&        to            // 終了時間
);

この関数のポイント:

  • true:取得成功
  • false:セッションが存在しない
  • from / to:その日の取引可能時間

1.4 よくある誤解と失敗

【結論】
最も多い失敗は「時間固定で判定してしまうこと」です。銘柄ごとの取引時間は異なります。


初心者が陥りやすいミス:

  • 固定時間(例:9:00〜17:00)で制御してしまう
  • サーバー時間とローカル時間を混同する
  • 曜日ごとの違いを考慮しない
  • セッションが複数あることを無視する

特に重要なのは以下です:

  • FXとCFDで取引時間は異なる
  • ブローカーごとに仕様が異なる
  • 祝日・例外時間は別管理されることがある

1.5 実務での使いどころ

【結論】
symbol-trading-hoursは「エントリー制御」と「リスク回避ロジック」に組み込みます。


主な活用例:

  • エントリー前チェック(市場オープン確認)
  • スプレッド異常回避(流動性低下時間の除外)
  • 指標前後のトレード停止
  • ロールオーバー回避(スワップ時間帯)
  • execution品質の安定化

特に重要なのは:

  • OrderSend前に必ずチェックする
  • OnTickではなく関数化して再利用する
  • スプレッド・ボラティリティと組み合わせる

2. MQL5でsymbol-trading-hoursを取得する方法(実装手順)

【結論】
SymbolInfoSessionTrade()をループ処理で呼び出し、現在時刻が取引セッション内かを判定するのが基本実装です。

【定義】
取引時間判定とは、「現在のサーバー時間が、銘柄の取引可能セッション内に含まれるか」をチェックする処理です。


2.1 実装の全体手順(最短フロー)

【結論】
以下の4ステップで実装できます。これを関数化すればEA全体で再利用可能です。


手順

  • 現在のサーバー時間を取得(TimeCurrent()
  • 曜日を取得(TimeDayOfWeek()
  • セッションをループ取得(SymbolInfoSessionTrade()
  • 現在時刻が範囲内か判定

2.2 最小構成コード(コピペ可)

【結論】
以下の関数で「現在が取引時間内か」を判定できます。


bool IsTradingTime(string symbol)
{
   datetime now = TimeCurrent();
   int day = TimeDayOfWeek(now);

   datetime from, to;

   // セッション最大数は通常少数(0〜数個)
   for(int i = 0; i < 10; i++)
   {
      if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)day, i, from, to))
         break;

      // 時刻部分のみ比較
      datetime now_time = now % 86400;
      datetime from_time = from % 86400;
      datetime to_time = to % 86400;

      if(now_time >= from_time && now_time <= to_time)
         return true;
   }

   return false;
}

2.3 実装のポイント(重要)

【結論】
「日付ではなく時刻のみ比較する」ことが最重要ポイントです。


理由

SymbolInfoSessionTrade()で取得されるfromto
日付を含まない時間ベースの値です。

そのため:

now % 86400

で「秒単位の時刻」に変換して比較する必要があります。


補足(86400とは)

  • 1日 = 86400秒
  • % は剰余(余り)演算
  • → 日付を除いた「時刻部分のみ取得」

2.4 EAへの組み込み例(OrderSend前チェック)

【結論】
注文前に必ずチェックすることで、エラーと損失を防げます。


if(!IsTradingTime(_Symbol))
{
   Print("市場クローズ中のためトレード停止");
   return;
}

// 通常のエントリー処理
OrderSend(request, result);

2.5 よくある失敗と対策

【結論】
時間判定のバグは「見えにくく、長期損失につながる」ため要注意です。


失敗①:ローカル時間を使う

TimeLocal(); // NG

→ サーバー時間とズレる
→ executionタイミングが狂う

対策

TimeCurrent(); // 必須

失敗②:セッションを1つしか見ない

SymbolInfoSessionTrade(..., 0, ...)

→ 複数セッションを見逃す

対策

for(int i=0; i<10; i++)

失敗③:日付込みで比較する

if(now >= from && now <= to) // NG

→ 判定が常にズレる

対策

now % 86400

失敗④:週末・祝日を考慮しない

  • 土日はセッションなし
  • CFDは休場日あり

対策

  • セッションが1つも取得できなければfalse

2.6 実務向け拡張(精度を上げる)

【結論】
取引時間判定だけでなく、市場状態フィルターと組み合わせるのが実務レベルです。


推奨組み合わせ

  • スプレッド制限(SymbolInfoDouble(..., SYMBOL_SPREAD)
  • ボラティリティフィルター(ATRなど)
  • スリッページ許容制御
  • execution条件チェック

例(簡易フィルター)

double spread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);

if(spread > 30)
{
   Print("スプレッド異常のため停止");
   return;
}

2.7 補足:代替手段との違い(軽く比較)

【結論】
時間ベースの固定フィルターよりも、symbol-trading-hoursの方が正確です。


固定時間フィルター

  • メリット:実装が簡単
  • デメリット:ブローカー差異に対応不可

symbol-trading-hours

  • メリット:銘柄・ブローカー依存に対応
  • デメリット:実装がやや複雑

3. symbol-trading-hoursの仕組みと内部構造(Why)

【結論】
symbol-trading-hoursは「ブローカー側の取引セッション定義」を参照しており、EA側で時間を決めているのではなく、サーバー仕様に依存する設計です。

【定義】
取引セッションとは、ブローカーが銘柄ごとに設定している「注文受付・executionが有効な時間帯」のことです。


3.1 なぜ銘柄ごとに取引時間が異なるのか

【結論】
市場の性質(FX・株式・指数・CFD)によって、流動性・取引所・清算時間が異なるためです。


主な理由は以下です:

  • FX:基本24時間(ただしロールオーバーあり)
  • 株式CFD:取引所時間に依存(例:NYSE、NASDAQ)
  • 指数CFD:メンテナンス時間あり
  • コモディティ:特定時間帯のみ

つまり、「市場そのものの仕様」がそのまま反映されているため、
EA側で固定時間を設定するとズレが発生します。


実務的な重要ポイント

  • 同じEURUSDでもブローカーごとに微妙に違う
  • XM / ICMarkets / Exness などで差異あり
  • サマータイム(DST)で時間がズレる

3.2 MQL5における時間の基準(重要)

【結論】
MQL5の時間は「サーバー時間」が基準であり、ローカル時間とは無関係です。

【定義】
サーバー時間とは、ブローカーのMT5サーバーが基準とする時間(通常はGMT+2や+3など)です。


主な時間関数の違い

  • TimeCurrent():サーバー時間(最重要)
  • TimeLocal():PCのローカル時間(使わない)
  • TimeTradeServer():サーバー時間(ほぼ同義)

なぜサーバー時間を使うのか

  • execution(約定)はサーバー基準
  • スプレッド・価格更新もサーバー基準
  • ローカル時間はズレる可能性あり

よくある誤解

  • 日本時間で判断してしまう
  • VPSのタイムゾーンに依存すると思っている

→ どちらも誤り


3.3 セッション構造の本質

【結論】
取引時間は「1つの連続時間」ではなく、「複数の分割セッション」で構成されます。


なぜ分割されるのか

  • メンテナンス時間(サーバー停止)
  • 清算処理(ロールオーバー)
  • 取引所の昼休み(株式系)

具体例

  • 00:00〜23:55(FX)
  • 23:55〜00:05(メンテナンス)

この場合:

  • セッション1:00:00〜23:55
  • セッション2:なし(空白時間あり)

実装への影響

  • 「1日1セッション前提」は危険
  • 必ずループで判定する必要あり

3.4 execution・spread・slippageとの関係

【結論】
取引時間外ではexecution品質が低下または停止し、スプレッドやスリッページが異常化します。


相関関係

  • 取引時間外 → execution不可 or 拒否
  • セッション境界 → スプレッド拡大
  • 流動性低下 → slippage増加

実務上の重要性

symbol-trading-hoursは単なる時間取得ではなく、
トレード品質のフィルターとして機能します。


3.5 なぜ固定時間フィルターではダメなのか

【結論】
固定時間では「ブローカー差異・銘柄差異・DST」に対応できないためです。


固定時間の問題点

  • 夏時間でズレる
  • 銘柄ごとの差異を無視
  • CFD・指数に対応不可

symbol-trading-hoursの優位性

  • ブローカー定義をそのまま使用
  • 自動で時間調整(DST対応)
  • 銘柄ごとの正確な制御が可能

3.6 よくある設計ミス(構造理解不足)

【結論】
構造を理解せずに実装すると、「動いているのに負けるEA」になります。


典型パターン

  • 夜間に無駄なトレードをする
  • ロールオーバーで損失増加
  • スプレッド拡大時にエントリー

本質的な問題

  • 時間ではなく「市場状態」を見ていない
  • execution条件を軽視している

3.7 実務での設計思想

【結論】
symbol-trading-hoursは「最低限のフィルター」であり、単体では不十分です。


実務設計の基本

  • ① 取引時間チェック(必須)
  • ② スプレッド制御
  • ③ ボラティリティ制御
  • ④ 戦略ロジック

優先順位

  1. execution可能か
  2. 不利条件ではないか
  3. エントリー条件成立

この順序を守らないと、
「正しいロジックでも負ける」状態になります。

4. symbol-trading-hoursと他手法の比較(vs 時間フィルター・ニュース制御)

【結論】
symbol-trading-hoursは「ブローカー定義ベースの正確な取引時間判定」であり、固定時間フィルターやニュースフィルターとは役割が異なります。単体ではなく併用が前提です。

【定義】
比較対象となる主な手法:

  • 固定時間フィルター:指定した時刻で取引をON/OFF
  • ニュースフィルター:経済指標カレンダーに基づき停止
  • symbol-trading-hours:銘柄ごとの実取引可能時間を取得

4.1 手法比較(一覧)

【結論】
「精度」はsymbol-trading-hours、「柔軟性」は固定時間、「リスク回避」はニュースフィルターが強みです。


手法精度柔軟性実装難易度主な用途
symbol-trading-hours市場オープン判定
固定時間フィルター戦略時間制御
ニュースフィルター指標リスク回避

4.2 symbol-trading-hoursの強みと弱み

【結論】
symbol-trading-hoursは「正確だが、それだけでは不十分」です。


強み

  • ブローカー仕様に完全準拠
  • 銘柄ごとの差異に対応
  • DST(サマータイム)自動対応
  • execution可能状態を保証

弱み

  • 指標(ニュース)までは考慮しない
  • スプレッド異常は検知しない
  • ロジックの優位性は保証しない

4.3 固定時間フィルターとの違い

【結論】
固定時間は「戦略都合」、symbol-trading-hoursは「市場都合」です。


固定時間の特徴

if(hour >= 9 && hour <= 17)
  • メリット:簡単・高速
  • デメリット:ズレる(ブローカー依存)

違いの本質

  • 固定時間:EA側が時間を決める
  • symbol-trading-hours:市場が時間を決める

実務判断

  • 短期戦略 → 固定時間も有効
  • 安定重視 → symbol-trading-hours必須

4.4 ニュースフィルターとの違い

【結論】
ニュースフィルターは「価格変動リスク回避」、symbol-trading-hoursは「取引可能性の判定」です。


ニュースフィルターの役割

  • 雇用統計・CPIなどの回避
  • ボラティリティ急変対策
  • スプレッド急拡大回避

限界

  • 取引可能かは保証しない
  • ブローカーの仕様は考慮しない

4.5 実務での最適構成(重要)

【結論】
3つを組み合わせることで、リスクと機会のバランスが最適化されます。


推奨構成

if(!IsTradingTime(_Symbol)) return;

if(IsHighImpactNews()) return;

if(IsSpreadTooWide()) return;

// エントリー条件

この構成の意味

  • ① execution可能か
  • ② 異常環境でないか
  • ③ 戦略成立

4.6 よくある誤った選択

【結論】
「どれか1つで十分」と考えるのは危険です。


NGパターン

  • 固定時間のみ → 祝日・DSTで崩壊
  • ニュースのみ → 市場クローズ無視
  • symbol-trading-hoursのみ → スプレッド異常を拾う

4.7 判断基準(設計指針)

【結論】
目的に応じて役割分担するのが正解です。


判断フレーム

  • 市場が開いているか → symbol-trading-hours
  • 危険時間か → ニュース
  • 戦略に合う時間か → 固定時間

優先順位

  1. 市場状態(必須)
  2. リスク回避(重要)
  3. 戦略最適化(任意)

5. よくある失敗・注意点(実務でハマるポイント)

【結論】
symbol-trading-hoursの実装ミスは「エラーにならずに損失だけ増える」タイプが多く、見えない不具合として長期的にパフォーマンスを悪化させます

【定義】
ここでの失敗とは、「コードは動くが、execution品質・収益性が悪化する設計ミス」を指します。


5.1 サーバー時間とローカル時間の混同

【結論】
TimeLocal()を使うと、実際の取引時間とズレて誤判定が発生します。


NG例

datetime now = TimeLocal(); // 誤り

正しい実装

datetime now = TimeCurrent(); // 正解

なぜ問題か

  • executionはサーバー基準
  • VPSのタイムゾーンは関係ない
  • 数時間ズレるだけで「常に取引外判定」になる可能性あり

5.2 セッションを1つしか見ていない

【結論】
セッションは複数存在するため、1回の取得では不完全です。


NG例

SymbolInfoSessionTrade(symbol, day, 0, from, to);

正しい実装

for(int i=0; i<10; i++)

なぜ重要か

  • CFD・指数は分割セッションが多い
  • 昼休み・メンテナンスで分断される
  • 一部時間だけトレードできないケースあり

5.3 日付込みで比較してしまう

【結論】
そのまま比較すると、常に判定がズレます。


NG例

if(now >= from && now <= to)

正しい方法

now % 86400

理由

  • from/toは「時刻のみ」
  • nowは「日付+時刻」
    → そのままでは一致しない

5.4 週末・祝日を考慮していない

【結論】
セッションが存在しない日は「必ずfalse」になります。


よくある現象

  • 土日 → 全セッションなし
  • 祝日 → 一部銘柄停止
  • CFD → 不定期休場あり

対策

if(!SymbolInfoSessionTrade(...))
   break;

→ セッション0すら取れない = 取引不可


5.5 スプレッド・流動性を無視している

【結論】
「取引可能=安全」ではありません。スプレッドやslippageも同時に見る必要があります。


問題例

  • ロールオーバー直後にエントリー
  • スプレッド50ポイント以上
  • execution遅延

対策

double spread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);

if(spread > 30)
   return;

なぜ重要か

  • 取引時間内でも市場は不安定
  • 流動性が低いと不利約定が発生

5.6 OrderSend直前にチェックしていない

【結論】
OnTickの最初ではなく、注文直前にチェックする必要があります。


NG設計

  • OnTick冒頭だけチェック
    → 数秒後に条件変化

正しい設計

// エントリー直前
if(!IsTradingTime(_Symbol)) return;

OrderSend(...);

理由

  • セッション境界で状態が変わる
  • 数秒でexecution不可になることもある

5.7 例外ケース(DST・ブローカー差異)を無視

【結論】
ブローカーごとに仕様が異なるため、テスト前提で設計する必要があります。


典型例

  • 夏時間で1時間ズレる
  • 同一銘柄でも時間が違う
  • 特定日だけ異常なセッション

対策

  • ストラテジーテスターで検証
  • ログ出力で確認
Print("from:", from, " to:", to);

5.8 実務でのチェックリスト(重要)

【結論】
以下を満たせば、致命的なミスはほぼ防げます。


チェック項目

  • TimeCurrent()を使用している
  • セッションをループ処理している
  • 時刻のみで比較している
  • OrderSend直前でチェックしている
  • スプレッドフィルターを併用している
  • ブローカー差異をテスト済み

6. 実務での使いどころ(戦略別の活用パターン)

【結論】
symbol-trading-hoursは「全EAで必須の基礎フィルター」であり、特に短期売買・高頻度・スプレッド依存戦略で効果が最大化します。

【定義】
実務での使いどころとは、「どの戦略で、どのタイミングで、どのように組み込むべきか」という設計指針を指します。


6.1 スキャルピング(最重要)

【結論】
スキャルピングではsymbol-trading-hoursは必須です。未実装は期待値を大きく毀損します。


理由

  • 数pipsの利益 → スプレッドの影響が大
  • 流動性低下で即マイナス
  • execution遅延=致命傷

推奨構成

if(!IsTradingTime(_Symbol)) return;

if(IsSpreadTooWide()) return;

if(!IsHighLiquidityTime()) return;

// エントリー

補足

  • ロンドン・NY時間に限定するケースが多い
  • 東京時間はスキップする設計も一般的

6.2 デイトレード

【結論】
デイトレでは「時間帯の選別」に活用します。


活用方法

  • ボラティリティの高い時間帯のみ許可
  • ロールオーバー回避
  • 指標前後の停止

if(!IsTradingTime(_Symbol)) return;

if(IsRollOverTime()) return;

ポイント

  • symbol-trading-hours単体では不十分
  • ニュースフィルター併用が前提

6.3 スイングトレード

【結論】
スイングでは重要度は下がるが、「エントリー精度改善」に有効です。


活用方法

  • 不利な時間帯のエントリー回避
  • スプレッド異常時の除外

特徴

  • 保有期間が長いため影響は限定的
  • ただしエントリー精度には影響

6.4 グリッド・ナンピン系

【結論】
最も重要な用途の1つ。無制御だとリスクが爆発します。


問題点

  • 取引時間外でもポジション追加
  • スプレッド拡大時にエントリー
  • ロールオーバーで含み損拡大

推奨設計

if(!IsTradingTime(_Symbol)) return;

if(IsSpreadTooWide()) return;

if(IsVolatilityAbnormal()) return;

重要ポイント

  • エントリー頻度が高いため影響が大きい
  • フィルターの質=生存率

6.5 ニュース回避型EA

【結論】
ニュースフィルターと組み合わせて「二重防御」にします。


構成

if(!IsTradingTime(_Symbol)) return;

if(IsHighImpactNews()) return;

意味

  • 市場が閉じている → 取引不可
  • 市場が荒れている → 取引回避

6.6 実務での優先順位(重要)

【結論】
すべてのEAは以下の順序で設計するのが基本です。


優先順位

  1. 取引可能か(symbol-trading-hours)
  2. 不利条件か(spread / slippage / volatility)
  3. 戦略条件成立か

NG設計

// 先にエントリー条件
if(Signal())
{
   OrderSend();
}

正しい設計

if(!IsTradingTime(_Symbol)) return;

if(IsSpreadTooWide()) return;

if(Signal())
{
   OrderSend();
}

6.7 実務での最適化ポイント

【結論】
symbol-trading-hoursは「単なるチェック」ではなく、戦略の一部として最適化します。


最適化例

  • 時間帯ごとにロット変更
  • セッション別のロジック切替
  • execution品質でON/OFF

応用例

if(IsLondonSession())
   lot = 0.2;
else
   lot = 0.1;

6.8 まとめ(実務視点)

【結論】
symbol-trading-hoursは「入れておくべき機能」ではなく、EAの基盤となる設計要素です。


本質

  • 時間ではなく「市場状態」を制御する
  • execution品質を担保する
  • 無駄なトレードを削減する

7. FAQ(よくある質問)

【結論】
symbol-trading-hoursは「正しく使えばエラー回避と収益安定に直結」しますが、誤解も多いため要点を整理します。

【定義】
FAQでは、実務・実装で頻出する疑問に対し、短く再利用可能な回答を提示します。


7.1 symbol-trading-hoursは必須ですか?

【結論】
必須です。未実装でも動きますが、長期的にパフォーマンスが悪化します。

理由

  • 市場クローズ時のエラー防止
  • スプレッド異常回避
  • execution品質の安定化

7.2 FXは24時間なので不要では?

【結論】
不要ではありません。FXでも「完全な24時間」ではありません。

補足

  • ロールオーバー時間あり
  • 週末クローズあり
  • 流動性の低い時間帯あり

7.3 固定時間フィルターだけで十分ですか?

【結論】
不十分です。ブローカー差異とDSTに対応できません。

違い

  • 固定時間 → 手動定義
  • symbol-trading-hours → 自動取得

7.4 SymbolInfoSessionTradeがfalseになるのはなぜ?

【結論】
そのセッションが存在しないためです(正常動作)。

主な原因

  • セッション数を超えている
  • その曜日に取引時間がない
  • 土日・祝日

7.5 なぜ%86400で比較するのですか?

【結論】
時刻のみを比較するためです。

理由

  • from/toは「時刻のみ」
  • nowは「日付+時刻」
    → そのままでは比較不可

7.6 スプレッドフィルターとどちらが重要ですか?

【結論】
両方必要ですが、優先順位はsymbol-trading-hoursが先です。

順序

  1. 取引可能か(時間)
  2. 条件が良いか(スプレッド)

7.7 OnTickで毎回チェックする必要がありますか?

【結論】
最終的には「注文直前チェック」が必須です。

理由

  • 状態はリアルタイムで変化
  • 数秒で市場状態が変わる

7.8 バックテストでも必要ですか?

【結論】
必要です。テスターでも取引時間は再現されます。

補足

  • 正しく実装しないと過剰トレードになる
  • 実運用と乖離する

7.9 CFDや指数でも使えますか?

【結論】
必須レベルで重要です。

理由

  • 取引時間が限定されている
  • セッション分割が多い

7.10 完全に安全になりますか?

【結論】
なりません。あくまで「最低限の安全装置」です。

必要な追加要素

  • スプレッド制御
  • slippage対策
  • ボラティリティ管理

8. まとめ(実務実装の最適解)

【結論】
MQL5のsymbol-trading-hoursは「単なる時間取得」ではなく、EAの収益性と安定性を左右する基盤ロジックです。必ず他のフィルターと組み合わせて運用します。

【定義】
最適解とは、「取引可能性・市場状態・戦略条件」を順序立てて評価する実務設計を指します。


8.1 最小構成(これだけは必須)

【結論】
以下の3点を満たせば、致命的なミスはほぼ回避できます。


必須構成

  • symbol-trading-hoursで取引可能判定
  • スプレッド制御(spread)
  • 注文直前チェック

実装テンプレート

if(!IsTradingTime(_Symbol)) return;

double spread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
if(spread > 30) return;

// エントリー条件
if(Signal())
{
   OrderSend(request, result);
}

8.2 実務レベル構成(推奨)

【結論】
実運用では「多層フィルター」にすることで、期待値とドローダウンのバランスが改善します。


推奨構成

if(!IsTradingTime(_Symbol)) return;

if(IsHighImpactNews()) return;

if(IsSpreadTooWide()) return;

if(IsVolatilityAbnormal()) return;

if(Signal())
{
   OrderSend(request, result);
}

意味

  • ① execution可能か
  • ② 異常環境か
  • ③ 優位性があるか

8.3 よくある誤解(再整理)

【結論】
「時間管理=戦略」ではありません。あくまで前提条件です。


誤解

  • これを入れれば勝てる → 誤り
  • 時間制御だけで十分 → 誤り

正しい理解

  • symbol-trading-hours → 土台
  • ロジック → 勝敗を決める

8.4 実務での最重要ポイント

【結論】
最も重要なのは「無駄なトレードを減らすこと」です。


本質

  • トレード回数を減らす
  • 不利なexecutionを避ける
  • ノイズ相場を排除する

結果

  • ドローダウン低減
  • PF(プロフィットファクター)改善
  • 再現性向上

8.5 設計のチェックリスト(最終確認)

【結論】
以下を満たしていれば、実務レベルの品質です。


チェック項目

  • SymbolInfoSessionTradeを正しく使用
  • セッションをループ処理
  • TimeCurrent()を使用
  • 時刻のみで比較(%86400)
  • OrderSend直前チェック
  • スプレッド制御あり
  • ニュース・ボラティリティ考慮

8.6 次にやるべきこと(実務アクション)

【結論】
すぐに既存EAへ組み込み、テスターで検証することが重要です。


推奨アクション

  1. IsTradingTime関数を実装
  2. 既存EAに組み込み
  3. バックテスト比較(ON/OFF)
  4. ドローダウンとPFを確認

評価指標

  • PF(プロフィットファクター)
  • DD(ドローダウン)
  • トレード回数
  • 勝率

8.7 最終まとめ

【結論】
symbol-trading-hoursは、
「トレードするかどうか」の最初の意思決定ロジックです。


一言でいうと

  • entry条件より前に必ず通すフィルター
  • execution品質を守る防御層
  • EAの再現性を高める基盤

この設計をベースにすれば、
「動くだけのEA」から「実運用できるEA」へ進化します。