【移植#55】古いsymbols.sel改変をやめる — 固定スプレッドのカスタム銘柄をMQL5で作る¶

この記事の3行まとめ
- 旧MT4の内部ファイル書き換えやオフライン起動を使わず、MT5標準のカスタム銘柄を作ります
- 元ティックの時刻とBidを保ち、Askだけを指定ポイント幅へ置き換えてスプレッド条件を固定します
- 専用MT5で20,000ティックを全件再読し、30ポイント固定、差異0、売買状態不変を確認しました
今回の原典は「EAが何ポイントまで耐えられるか」¶
投稿日順で次に当たる2010年2月27日の記事では、バックテスト時のスプレッドを複数通貨へ一括設定する方法が紹介されていました。
元記事「バックテスト時のスプレッドを自在に変更する。(再考…」を読む
当時の方法は、外部ツールでMT4のsymbols.selを書き換え、端末をデータセンターへ接続しない状態で起動するものでした。これにより、同じスプレッド条件でテストを繰り返し、EAがどこまでコスト増加へ耐えられるかを比べようとしていました。
目的は現在でも大切です。同じ期間と同じEAでも、スプレッド条件が変われば、取引回数、損益、ドローダウンは変わります。しかし、現行MT5で古い内部ファイル形式を探して書き換える必要はありません。
今回残すのは「比較するコスト条件を固定する」という目的です。内部ファイルの改変と強制オフライン化は捨て、MT5標準のカスタム銘柄へ置き換えます。
#36の履歴監査とは役割が違う¶
【移植#36】バックテスト履歴の証拠を点検するでは、確定M1足に保存されたスプレッド欄を読み、履歴へコスト情報が十分残っているかを監査しました。専用環境ではspread=0の足が多く、M1履歴だけで実コストを復元できないことも確認しています。
今回の#55は、過去の実スプレッドを復元する道具ではありません。
| 記事 | 目的 | 変更するもの |
|---|---|---|
| #36 | 履歴に何が記録されているか点検する | 何も変更しない |
| #55 | 比較用の固定スプレッド条件を作る | 新しいカスタム銘柄のAsk |
「観測されたコスト」と「仮定したストレス条件」を混ぜないことが大切です。#55で作る30ポイントは実績値ではなく、比較のために明示した仮定です。
MT5ではカスタム銘柄をテスターで使える¶
MQL5には、既存銘柄の仕様を基にカスタム銘柄を作るCustomSymbolCreate()があります。価格履歴はCustomTicksReplace()でMqlTick配列から登録できます。
MetaQuotesのカスタム銘柄作成・テスト解説でも、ティックまたはM1履歴を持つカスタム銘柄をストラテジーテスターで選べることが説明されています。
配布版は、次の順で処理します。
CopyTicks()で元銘柄の最新20,000ティックを古い順に取得する- 元銘柄の仕様を基にカスタム銘柄を作る
- 各ティックの時刻、Bid、Last、出来高を保つ
Ask = Bid + 指定ポイント × pointへ置き換える- 20,000件を
CustomTicksReplace()で登録する - 別のタイマーイベントで全ティックを再取得し、元データと固定幅を照合する
CopyTicks()のfrom=0は、指定した件数の最新ティックを返します。配布版は要求件数に満たない状態を成功扱いせず、同期完了まで再試行します。
書き込み件数だけでPASSにしない¶
CustomTicksReplace()が20,000を返しても、それだけでテスター用データが正しいとは決めません。履歴を書いた直後は、端末側の履歴キャッシュがまだ再構築されていないことがあるためです。
配布版は固定時間のSleep()後に1度読むのではなく、1秒タイマーの次イベントから再読します。最大60秒の範囲で、次の条件がすべて一致した場合だけPASSです。
- 再読件数が20,000件
- 全ティックの時刻が元データと一致
- 全ティックのBid、Last、出来高が元データと一致
- 全ティックの
Ask - Bidが指定ポイントと一致 - 再読したスプレッドの最小値と最大値が指定値と一致
順序が逆転した元ティック、Bidが0以下のティック、件数不足、再読差異は失敗にします。部分的に作れたデータを完全な比較条件には見せません。
同名データを不用意に上書きしない¶
カスタム銘柄名を空欄にすると、元銘柄とポイント数から自動生成します。EURUSDで30ポイントならMQL55_EURUSD_FS30です。
同名銘柄がすでにある場合は、説明欄に保存した次の所有情報を確認します。
- このツールが作った銘柄であること
- 元銘柄が一致すること
- 固定ポイント数が一致すること
ブローカー銘柄、別ツールのカスタム銘柄、異なる元銘柄やポイント数のデータには書き込みません。元のEURUSD履歴も変更しません。
この設計なら、10、30、50ポイントを別名のカスタム銘柄として残せます。同じEA、期間、初期資金、パラメーターで銘柄だけを切り替えると、コスト条件ごとの差を追いやすくなります。
専用MT5で20,000ティックを全件照合した¶
配布インジケーターとは別の検証EAを用意し、表示バッファだけでなく、元EURUSDと生成先のティック履歴を独立に読み直しました。
| 検証項目 | 実測値 |
|---|---|
| 端末 | MetaTrader 5 Build 6061 |
| 元銘柄 | EURUSD |
| 生成先 | MQL55_EURUSD_FS30 |
| データ期間 | 2026-07-30 19:47:49.247〜2026-07-31 23:54:58.224 |
| 要求/取得ティック | 20,000/20,000 |
| 登録/再読ティック | 20,000/20,000 |
| 固定スプレッド | 30ポイント(3.0 pips) |
| 再読最小/最大 | 30/30ポイント |
| 時刻・Bid等の差異 | 0件 |
| 注文・ポジション変化 | なし |
| コンパイル | 配布版・検証EAとも0エラー・0警告 |
| 実画面キャプチャー | 成功 |
検証したのは「比較用ティックが指定どおり作られたこと」です。特定EAの利益や耐性が改善したという結果ではありません。どのポイントで成績が崩れるかは、対象EAごとに同じ条件で測る必要があります。
ダウンロードと使い方¶
55_Fixed_Spread_Custom_Symbol_v1_00.mq5 をダウンロード
ファイルをMT5のIndicatorsへ保存してコンパイルし、複製元の銘柄チャートへ適用してください。初期設定は次のとおりです。
| 入力 | 初期値 | 役割 |
|---|---|---|
InpCustomSymbolName | 空欄 | 安全な名前を自動生成 |
InpFixedSpreadPoints | 30 | 固定するスプレッド幅 |
InpTicksToCopy | 20,000 | 最新から複製するティック数 |
InpTimeoutSec | 60 | 履歴同期と再読の上限 |
InpShowPanel | true | 検証結果をチャート表示 |
パネルがPASSになったら、気配値表示のカスタム銘柄グループから生成先を確認します。ストラテジーテスターでは、そのカスタム銘柄を選び、パネルに表示された期間内をテスト対象にしてください。ティックのBidとAskを使うため、「リアルティックに基づく全ティック」での比較が分かりやすいです。
複数条件を比べるときは、EA、期間、テストモード、初期資金、レバレッジ、パラメーターを固定し、カスタム銘柄だけを切り替えます。結果にはポイント数とデータ期間を必ず一緒に残してください。
使えないこと・注意点¶
- 作るのは固定スプレッドの仮想条件です。実際の時間帯別・指標時のスプレッド拡大を再現しません。
- 手数料、スワップ、スリッページ、約定拒否、通信遅延は変更しません。
- 元銘柄のティック品質が悪ければ、生成先のBid履歴もその影響を受けます。
- カスタム銘柄の仕様は初回作成時に元銘柄から複製します。元の契約仕様が変わった場合は、新しい名前で作り直して比較条件を分けてください。
- 同じ名前で後から取得範囲を更新しても、パネル外の古い履歴が残る場合があります。テスト期間は表示範囲内へ限定してください。
- カスタム銘柄を使う最適化は、MQL5 Cloud Networkでは実行できません。ローカルまたはLANエージェントを使います。
- 固定スプレッドで成績が良くても、将来の利益や実運用での約定を保証しません。
ロジック評価の結論¶
原典の価値は、古いファイル形式そのものではなく、「EAの成績をコスト条件別に比べる」という検証姿勢にあります。
MT5では、元履歴を壊さず、条件名を分け、BidとAskを持つカスタム銘柄をテスターへ渡せます。さらに、書き込み成功だけで終えず、全件再読して固定幅を証明できます。
ただし、固定スプレッドはストレステストの一部にすぎません。次に見るべきなのは、手数料、スリッページ、テストモード、データ期間をそろえたうえで、どのコスト条件から戦略の優位性が消えるかです。きれいな1本の結果ではなく、条件を明記した比較表として残すことが、再現できる検証につながります。
前後の記事¶
前: 【移植#54】キー送信をやめる — 複数チャートの時間足をMQL5で一括変更
次: 【移植#56】アクティブタブを断定しない — MT5標準イベントで最後の操作チャートを追跡