MQL5 スプレッドフィルターの実装方法|EAで取引制御する手順

目次

1. MQL5のスプレッドフィルターとは(What)

【結論】
スプレッドフィルターとは「現在のスプレッドが一定値以下のときのみ注文を許可する条件」であり、取引コストを制御する最も基本的な手法です。

【定義】
スプレッド(spread)とは「Bid(売値)とAsk(買値)の差」であり、トレード開始時点で発生する実質的なコストです。


1.1 スプレッドフィルターの定義

スプレッドフィルターは、EA(自動売買)において「不利な市場状態でのエントリーを防ぐための条件分岐」です。

具体的には以下のようなロジックになります:

  • スプレッドが小さい → エントリー許可
  • スプレッドが大きい → エントリー禁止

この仕組みにより、無駄なコストを避けることができ、トレードの期待値(平均的な利益)を安定させることができます。


1.2 なぜスプレッドフィルターが必要か

スプレッドは単なる数値ではなく、トレードの初期損失そのものです。

例えば:

  • スプレッド 2.0 pips → エントリー直後に -2.0 pips
  • スプレッド 0.5 pips → エントリー直後に -0.5 pips

つまり、スプレッドが広い状態でエントリーすると、
同じ戦略でも勝率・利益率が大きく悪化します。

特に以下の状況ではスプレッドが急拡大します:

  • 経済指標発表(ニュース時)
  • 市場オープン直後(週明けなど)
  • 流動性が低い時間帯(早朝・深夜)

このため、スプレッドフィルターは
「トレードしない判断」を自動化する重要な制御機構になります。


1.3 関連用語(初心者向け)

理解をスムーズにするため、関連用語を簡潔に整理します。

  • spread(スプレッド)
    → 買値と売値の差。取引コスト。
  • slippage(スリッページ)
    → 注文価格と実際の約定価格のズレ(executionの誤差)
  • execution(約定)
    → 注文が市場で成立する処理
  • order条件
    → エントリーを実行するための条件(フィルター含む)

1.4 スプレッドフィルターの位置づけ(EA設計)

スプレッドフィルターは、EAの中では以下の位置に入ります:

シグナル生成 → フィルター(スプレッド等)→ 注文実行

この「フィルター層」は非常に重要で、代表的なものは:

  • スプレッドフィルター
  • 時間フィルター(取引時間制限)
  • ボラティリティフィルター(ATRなど)

つまり、スプレッドフィルターは
EAの品質を左右する“前処理”の一部です。


1.5 よくある誤解・失敗

初心者がつまずきやすいポイントを整理します。

  • スプレッドを無視しても問題ないと思っている
    → 実運用では最も重要なコスト要因の一つ
  • バックテストで問題ないからOKと判断する
    → テスターは固定スプレッドが多く、現実と乖離
  • フィルターを入れると利益が減ると思っている
    → 実際は「無駄なトレードを削る」ため期待値は改善

1.6 他手法との関係(軽い比較)

スプレッドフィルターは「事前コスト制御」です。

  • スプレッドフィルター → エントリー前に制御
  • スリッページ制御 → 約定時のズレ対策

この2つは役割が異なるため、併用が基本です。

2. MQL5でのスプレッドフィルター実装方法(How)

【結論】
MQL5では「現在のスプレッドを取得し、閾値と比較して注文前に制御する」だけで実装できます。

【定義】
スプレッド取得とは「現在のAskとBidの差を数値として取得し、条件分岐に使う処理」です。


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

以下の4ステップで実装できます:

  • ① 現在のBid / Askを取得
  • ② スプレッドを計算
  • ③ 許容スプレッド(閾値)と比較
  • ④ 条件を満たす場合のみ注文実行

この構造はすべてのEAに共通です。


2.2 スプレッド取得コード(基本形)

double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

// スプレッド(ポイント単位)
double spread = (ask - bid) / _Point;

解説(重要ポイント)

  • _Symbol → 現在の通貨ペア
  • _Point → 最小価格単位(例:0.00001)
  • (ask - bid) → スプレッドそのもの

👉 多くのブローカーでは「ポイント単位」で扱うため、
pips換算ではなくポイント基準で管理するのが実務的です


2.3 フィルター条件の実装

double maxSpread = 20; // 許容スプレッド(ポイント)

if(spread > maxSpread)
{
    // スプレッドが広い → エントリーしない
    return;
}

ポイント

  • return; で処理を中断 → 無駄な注文を防止
  • 閾値は戦略ごとに最適化が必要

2.4 実践的なEA組み込み例

void OnTick()
{
    double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    double spread = (ask - bid) / _Point;

    double maxSpread = 20;

    // スプレッドチェック
    if(spread > maxSpread)
        return;

    // ここでシグナル判定(例)
    if(CheckBuySignal())
    {
        // 注文処理
        trade.Buy(0.1);
    }
}

実務ポイント

  • 注文直前でチェックすることが重要
    → シグナル後にスプレッドが変化するため
  • OnTick()内で毎回評価 → 最新状態を反映

2.5 よくある失敗と対策

① スプレッド単位のミス

  • NG:pipsとpointsを混同
  • 対策:
    (_Point)で統一して計算する

② 閾値が固定すぎる

  • NG:常に同じ値(例:20)
  • 問題:通貨ペア・時間帯で最適値が異なる

👉 対策:

  • 通貨ペア別に設定
  • 時間帯で切り替え

③ バックテストとの乖離

  • NG:テスターでは良好だが実運用で崩れる
  • 原因:固定スプレッド

👉 対策:

  • 可変スプレッドでテスト
  • 実口座ログで検証

2.6 なぜこの実装で機能するのか

スプレッドは「エントリーコスト」なので、
以下の構造になります:

実質損益 = 戦略利益 - スプレッド - スリッページ

つまり:

  • スプレッドが大きい
    → 初期損失が増加
    → 損益分岐点が不利になる

そのため、
エントリー前に排除することで期待値が改善します


2.7 他手法との違い(軽補足)

  • スプレッドフィルター
    → エントリー前のコスト制御
  • スリッページ制御
    → 約定時の価格ズレ制御
  • リミット注文
    → 有利価格での約定狙い

👉 役割が異なるため「併用」が基本です

3. スプレッドフィルターの仕組みと効果(Why)

【結論】
スプレッドフィルターは「初期コストを制御することで期待値を改善する仕組み」であり、勝率ではなく損益構造そのものを最適化します。

【定義】
期待値とは「1トレードあたりの平均利益」であり、
(勝率 × 平均利益)−(負率 × 平均損失)−コストで決まります。


3.1 スプレッドがトレードに与える影響

スプレッドは「見えにくい損失」ですが、実際には最初から確定しているコストです。

例:

  • スプレッド 1.0 pips → 開始時 -1.0 pips
  • スプレッド 3.0 pips → 開始時 -3.0 pips

この差は単純に見えて、実務では以下の影響を与えます:

  • 利益確定(TP)までの距離が遠くなる
  • 損切り(SL)までの距離が近くなる
  • 短期戦略ほど影響が大きい

👉 特にスキャルピングでは致命的になります。


3.2 期待値ベースでの理解

スプレッドは期待値の式に直接影響します。

期待値 = 勝率 × 平均利益 − 負率 × 平均損失 − スプレッド

ここで重要なのは:

  • スプレッドは「必ず引かれる」
  • コントロール可能な数少ない要素

つまり:

👉 戦略を変えずに改善できるレバーです


3.3 フィルターによる期待値改善の構造

スプレッドフィルターを入れると、以下の変化が起きます:

Before(フィルターなし)

  • 全てのシグナルでエントリー
  • 高スプレッド時も含む
  • 無駄な損失が増える

After(フィルターあり)

  • 良い条件のみエントリー
  • 高コスト環境を排除
  • トレード数は減るが質が向上

👉 結果:

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

3.4 なぜ「トレード回数が減るのに利益が上がる」のか

初心者が誤解しやすいポイントです。

直感:

  • トレード回数 ↓ → 利益 ↓

実際:

  • 不利なトレードを削除
    → 平均利益 ↑

つまり:

利益 = 回数 × 質

👉 スプレッドフィルターは「質」を改善する手法です


3.5 スプレッド拡大の構造(市場の仕組み)

スプレッドはランダムではなく、市場構造に依存して変動します。

主な要因:

  • 流動性低下(注文が少ない)
  • ボラティリティ上昇(価格変動が激しい)
  • ディーラーリスク管理(ブローカー側の調整)

具体例:

  • ニュース時 → スプレッド急拡大
  • 早朝 → 流動性低下で拡大

👉 このため、
スプレッドは「危険信号」として使えるのです。


3.6 スリッページとの違い(重要)

混同されやすいポイントを整理します。

項目スプレッドスリッページ
発生タイミングエントリー前約定時
性質確定コスト不確定コスト
制御方法フィルター許容幅設定

👉 結論:
スプレッド=予防、スリッページ=対処


3.7 実務での使いどころ

スプレッドフィルターは特に以下で有効です:

  • スキャルピング(短期売買)
  • 指標トレード回避
  • EAの安定化

逆に:

  • スイングトレード(長期)
    → 影響は相対的に小さい

👉 戦略ごとに重要度が変わる点に注意


3.8 よくある誤解

  • 「スプレッドはブローカー依存だから無視できない」
    → だからこそ制御が必要
  • 「スプレッドは一定」
    → 実際は変動(可変スプレッド)
  • 「利益が減る」
    → 無駄な損失が減るのが本質

4. スプレッドフィルターと他手法の比較(vs 他手法)

【結論】
スプレッドフィルターは「エントリー前のコスト排除」に特化した手法であり、スリッページ制御や時間フィルターとは役割が異なります。併用が前提です。

【定義】
比較対象となる手法とは「トレードの精度・安全性・コストを制御する条件群(フィルター)」を指します。


4.1 主要フィルター手法の比較(一覧)

以下は実務で使われる代表的な制御手法の比較です。

手法目的タイミング主な効果推奨度
スプレッドフィルターコスト削減エントリー前無駄な損失回避★★★★☆
スリッページ制御約定精度約定時想定外損失防止★★★★☆
時間フィルターリスク回避エントリー前不安定時間回避★★★★☆
ボラティリティフィルター(ATR等)相場状態判定エントリー前異常相場回避★★★☆☆
リミット注文有利価格取得注文時コスト低減★★★☆☆

4.2 スプレッド vs スリッページ(重要比較)

最も混同されやすい2つです。

スプレッドフィルター

  • 確定コスト(必ず発生)
  • エントリー前に判断可能
  • 回避が容易

スリッページ制御

  • 不確定コスト(状況依存)
  • 約定時に発生
  • 完全回避は困難

👉 実務結論:

  • スプレッド → 「事前に排除」
  • スリッページ → 「許容範囲で制御」

4.3 スプレッド vs 時間フィルター

時間フィルターの特徴

  • 特定時間(例:早朝・指標時)を除外
  • シンプルで軽量

問題点

  • 実際のスプレッド状態を見ていない
  • 「安全な時間でもスプレッドが広い」ケースあり

👉 スプレッドフィルターの優位性:

  • 実際の市場状態(execution環境)に基づく
  • より精度の高い判断

👉 実務では:

時間フィルター + スプレッドフィルター

の併用が基本です。


4.4 スプレッド vs ボラティリティフィルター

ボラティリティ(ATRなど)

  • 価格変動の大きさを測定
  • トレンド・レンジ判定に有効

違い

  • スプレッド → コスト指標
  • ボラティリティ → 相場状態指標

👉 つまり:

  • スプレッド → 「取引して良いか」
  • ボラティリティ → 「どの戦略を使うか」

4.5 スプレッド vs リミット注文

リミット注文(指値)

  • 指定価格でのみ約定
  • スプレッドを実質回避可能

問題点

  • 約定しないリスク(機会損失)
  • トレンド時に乗り遅れる

👉 スプレッドフィルターの利点:

  • 約定機会を維持
  • 条件だけ制御

4.6 実務での最適構成(推奨)

単体ではなく「組み合わせ」で設計します。

基本構成

シグナル
↓
時間フィルター
↓
スプレッドフィルター
↓
スリッページ制御
↓
注文実行

理由

  • 多層防御(リスク分散)
  • 特定条件への依存を回避
  • 再現性の向上

4.7 よくある設計ミス

  • スプレッドフィルターのみで完結させる
  • スリッページを無視する
  • フィルター順序が不適切

👉 特に重要:

「注文直前にスプレッドチェック」しない設計は危険です


4.8 どれを優先すべきか(判断基準)

戦略別に整理します:

  • スキャルピング → スプレッド最優先
  • デイトレ → スプレッド+時間
  • スイング → 時間・ボラ重視

👉 判断軸:

  • 取引頻度
  • 利幅
  • 約定精度の要求

5. スプレッドフィルターの最適値と実務での使いどころ

【結論】
最適なスプレッド値は固定ではなく、「通貨ペア・時間帯・戦略」に応じて調整する必要があります。一律設定は非効率です。

【定義】
最適値とは「期待値(利益−コスト)が最大化されるスプレッド閾値」のことを指します。


5.1 推奨スプレッド目安(実務基準)

一般的な目安(ポイント単位):

通貨ペア推奨スプレッド上限
EURUSD10〜20
USDJPY10〜20
GBPJPY20〜40
XAUUSD(ゴールド)30〜100

注意

  • ブローカー・口座タイプで大きく変動
  • ECN口座は低め、スタンダードは高め

👉 結論:
必ず自分の環境でログを取ること


5.2 戦略別の最適設定

スキャルピング(超短期)

  • 推奨:厳しめ(10〜15)
  • 理由:コスト影響が最大

👉 フィルター必須


デイトレード

  • 推奨:中程度(15〜30)
  • 理由:利幅があるため多少許容可能

スイングトレード

  • 推奨:緩め(30以上)
  • 理由:スプレッド影響が相対的に小さい

5.3 時間帯による最適化

スプレッドは時間で大きく変動します。

危険時間帯

  • 早朝(流動性低)
  • 指標発表時
  • 週明け

安定時間帯

  • ロンドン時間
  • NY時間

👉 実務対応:

if(isHighRiskTime())
{
    maxSpread = 10;
}
else
{
    maxSpread = 20;
}

👉 ポイント:
時間帯で閾値を動的に変更する


5.4 通貨ペア別の調整

通貨ペアごとに特性が異なります。

例:

  • EURUSD → 安定・低スプレッド
  • GBPJPY → ボラ大・スプレッド広め

👉 実装例:

double maxSpread;

if(_Symbol == "EURUSD")
    maxSpread = 15;
else if(_Symbol == "GBPJPY")
    maxSpread = 30;

👉 実務では「配列・設定ファイル化」が推奨


5.5 動的スプレッドフィルター(上級)

より高度な手法です。

方法

  • 過去平均スプレッドを取得
  • 現在値と比較
if(currentSpread > averageSpread * 1.5)
    return;

メリット

  • 相場状態に適応
  • 固定値より精度が高い

デメリット

  • 実装が複雑
  • 計算コスト増加

5.6 実務での使いどころ

スプレッドフィルターは以下で特に有効:

  • EAの安定化(最重要)
  • スキャルピング戦略
  • 指標トレード回避

👉 逆に:

  • 長期投資 → 効果は限定的

5.7 よくある失敗と改善

① 厳しすぎる設定

  • 問題:エントリー機会減少
  • 対策:ログで最適値を検証

② 緩すぎる設定

  • 問題:無駄な損失増加
  • 対策:PF・DDで評価

③ 固定値の過信

  • 問題:相場変化に対応できない
  • 対策:動的調整

5.8 最適化の基本方針(重要)

最適値は以下で決めます:

  • PF(プロフィットファクター)最大化
  • DD(ドローダウン)最小化
  • トレード数とのバランス

👉 単純な利益最大ではなく、
リスク調整後リターンで評価


5.9 実務まとめ(短文化)

  • スプレッドは固定ではない
  • 戦略ごとに最適値が異なる
  • 動的調整が最も強い

6. スプレッドフィルターのよくある失敗と注意点

【結論】
スプレッドフィルターは「入れるだけでは不十分」であり、単位・タイミング・設定方法を誤ると逆効果になります。

【定義】
失敗とは「フィルターを実装しているのに、期待値が改善しない、または悪化する状態」を指します。


6.1 単位ミス(points / pipsの混同)

問題

MQL5ではスプレッドは通常「points(ポイント)」で扱われますが、
初心者は「pips」と混同しがちです。

例:

  • 1 pips = 10 points(5桁通貨の場合)

👉 よくあるミス:

double maxSpread = 2; // ← pipsのつもり(実際は2 points)

→ 実際は「ほぼ常にフィルターが発動」


対策

double maxSpread = 20; // 2.0 pips相当(5桁通貨)

👉 結論:
MQL5ではpoints基準で統一する


6.2 チェックタイミングの誤り

問題

シグナル生成時のみチェックしているケース。

👉 NG例:

if(CheckSignal())
{
    // ここで一度だけチェック
}

なぜ問題か

  • シグナル発生後にスプレッドが変動
  • 注文時には条件が崩れている可能性

正しい設計

// 注文直前にチェック
if(spread > maxSpread)
    return;

👉 結論:
必ず「注文直前」で評価する


6.3 固定値の過信

問題

常に同じスプレッド値を使用:

double maxSpread = 20;

なぜ問題か

  • 通貨ペアごとに特性が違う
  • 時間帯で大きく変動
  • 市場環境が変化する

対策

  • 通貨ペア別に設定
  • 時間帯で切り替え
  • 動的フィルター導入

👉 結論:
固定値は簡易実装、実務では不十分


6.4 バックテスト依存

問題

テスター結果だけで判断するケース。

背景

  • 多くのテスターは固定スプレッド
  • 実運用は可変スプレッド

影響

  • 実運用で期待値崩壊
  • DD(ドローダウン)増加

対策

  • 可変スプレッドデータを使用
  • 実口座ログで検証

👉 結論:
バックテストだけでは不十分


6.5 スプレッドだけで判断してしまう

問題

スプレッドのみでエントリー判断。

見落とし

  • スリッページ(executionのズレ)
  • 流動性
  • ボラティリティ

対策

併用設計:

スプレッド + スリッページ + 時間フィルター

👉 結論:
単一フィルターは脆弱


6.6 フィルターが厳しすぎる

問題

  • エントリー機会激減
  • 期待値低下

典型例

  • maxSpread = 5(過度に厳しい)

対策

  • トレード数を確認
  • PFとのバランスを見る

👉 結論:
「機会損失」とのバランスが重要


6.7 フィルターが緩すぎる

問題

  • 無駄なトレード増加
  • DD悪化

対策

  • ログ分析
  • 高スプレッド時の成績比較

👉 結論:
効果が出ないなら閾値が緩すぎる


6.8 ログを取らない

問題

  • 最適化ができない
  • 原因分析不能

対策

Print("Spread:", spread);

👉 推奨ログ:

  • スプレッド
  • エントリー可否
  • 実際の損益

6.9 実務チェックリスト(短文化)

  • 単位はpointsで統一
  • 注文直前でチェック
  • 固定値に依存しない
  • バックテストを過信しない
  • 他フィルターと併用

7. よくある質問(FAQ)

【結論】
スプレッドフィルターは「単純な条件分岐」ですが、実運用では設定・単位・併用設計が結果を大きく左右します。疑問点はここで解消できます。

【定義】
FAQは「初心者〜中級者が実装・運用時に直面する具体的な疑問とその解答」をまとめたものです。


7.1 スプレッドフィルターは必須ですか?

A. 必須ではありませんが、ほぼ全てのEAで推奨されます。
特にスキャルピングではスプレッドが利益を直接削るため、未実装だと期待値が大きく悪化する可能性があります。


7.2 スプレッドの単位はpipsとpointsどちらを使うべきですか?

A. MQL5ではpointsで統一するのが実務的です。
内部的にpointsで扱われるため、変換ミスを防ぐ意味でもpoints基準が安全です。


7.3 スプレッドの最適値はどのくらいですか?

A. 固定の正解はなく、通貨ペア・時間帯・戦略で変わります。
目安としては:

  • EURUSD:10〜20 points
  • GBPJPY:20〜40 points

ただし、必ず自分の環境でログを取り最適化してください。


7.4 バックテストだけで判断しても大丈夫ですか?

A. 不十分です。
多くのテスターは固定スプレッドのため、実運用の可変スプレッドを再現できません。
必ずフォワードテストや実口座ログで確認してください。


7.5 スプレッドが広いと必ず負けますか?

A. 必ずではありませんが、不利になります。
スプレッドは初期コストなので、広いほど損益分岐点が遠くなります。
特に短期トレードでは致命的です。


7.6 スプレッドフィルターだけで十分ですか?

A. 不十分です。併用が基本です。
推奨構成:

  • スプレッドフィルター
  • スリッページ制御
  • 時間フィルター

これにより安定性が大きく向上します。


7.7 フィルターを厳しくすると利益は増えますか?

A. 必ずしも増えません。
厳しすぎるとエントリー機会が減り、逆に利益が低下する場合があります。
「PF・DD・トレード数」のバランスで判断する必要があります。


7.8 スプレッドはどこで確認できますか?

A. MQL5では以下で取得できます。

double spread = (SymbolInfoDouble(_Symbol, SYMBOL_ASK) 
               - SymbolInfoDouble(_Symbol, SYMBOL_BID)) / _Point;

また、MT5の気配値(Market Watch)でも確認可能です。


7.9 スプレッドフィルターの効果を確認する方法は?

A. フィルター有無で比較するのが最も確実です。

  • フィルターON/OFFでバックテスト
  • フォワードテストで比較
  • 高スプレッド時の損益を分析

👉 結論:
「データで判断」が基本です