- 1 1. MQL5のスプレッドフィルターとは(What)
- 2 2. MQL5でのスプレッドフィルター実装方法(How)
- 3 3. スプレッドフィルターの仕組みと効果(Why)
- 4 4. スプレッドフィルターと他手法の比較(vs 他手法)
- 5 5. スプレッドフィルターの最適値と実務での使いどころ
- 6 6. スプレッドフィルターのよくある失敗と注意点
- 7 7. よくある質問(FAQ)
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 推奨スプレッド目安(実務基準)
一般的な目安(ポイント単位):
| 通貨ペア | 推奨スプレッド上限 |
|---|---|
| EURUSD | 10〜20 |
| USDJPY | 10〜20 |
| GBPJPY | 20〜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でバックテスト
- フォワードテストで比較
- 高スプレッド時の損益を分析
👉 結論:
「データで判断」が基本です