【移植#50】12通貨の指標値を1枚へ — 確定足を揃えるトレンド・コンセンサス¶

この記事の3行まとめ
- 12通貨ペアのEMA20とEMA50を、同じH1確定時刻へ揃えて1画面に集約します
- 欠損銘柄を有効数と分け、最低8銘柄が揃わない限り80%到達を成立させません
- 実機では12銘柄を独立に再計算し、強気8・弱気4・12バッファ・18表示部品を照合しました
今回の原典は「別通貨のインジケーター値を読めるか」¶
投稿日順で次に当たる2010年2月8日の記事は、複数の読者質問へまとめて答える回でした。
質問は、画面上の価格をOCRで集める方法、外部CSVをMT4で扱う方法、共有メモリの排他制御など、いくつかの話題に分かれています。
その中に、今回の題材があります。
- 12通貨ペアで同じインジケーターを動かす
- 条件を満たした通貨ペア数をまとめる
- 一定数がそろったら、目的の通貨ペアを判断したい
原典の回答は、表示中の別インジケーターを画面から直接読むのではなく、値を再計算して取得する方向を示していました。MT4ではiCustom()を使う考え方です。
ただし、質問に登場した「80%を表示するインジケーター」の計算式やコードは公開されていません。そこで今回は、その数値を推測して再現しません。
代わりに、条件が明確なEMA20とEMA50を使い、「別銘柄の指標値を同じ時刻で集約する部分」を検証可能な形にしました。
OCRと外部CSVは別の技術テーマなので、この記事には混ぜません。
何を表示するインジケーターか¶
初期設定では、次の12通貨ペアを対象にします。
EURUSD, GBPUSD, USDJPY, USDCHF,
USDCAD, AUDUSD, NZDUSD, EURJPY,
GBPJPY, EURGBP, AUDJPY, CADJPY
各通貨ペアについて、H1の直近確定足で次の状態を判定します。
| 表示 | 条件 |
|---|---|
BULL | EMA20がEMA50より上 |
BEAR | EMA20がEMA50より下 |
FLAT | 2本の差が銘柄の0.1 point以内 |
NO DATA | 銘柄、履歴、指標値、同一時刻のどれかを取得できない |
強気比率は、次の式です。
画像の実測値は、強気8、弱気4、有効12です。
初期閾値は80%なので、この時点の表示はBELOW TARGETです。
これは売買シグナルではありません。12通貨のうち何通貨が、同じ単純ルールで強気状態かをまとめた観測値です。
「各銘柄の1本前」ではなく同じ時刻を探す¶
マルチシンボル処理で気をつけたいのは、バー番号だけを合わせても、時刻が同じとは限らないことです。
銘柄ごとに履歴の開始位置や欠損が違うと、すべての銘柄で単純にshift=1を読むだけでは、別時刻の値を混ぜる可能性があります。
今回の基準は、表示中チャートのH1直近確定足です。
対象銘柄ごとに、iBarShift()のexact=trueで、その時刻と完全一致するバーを探します。
int shift = iBarShift(symbol, PERIOD_H1, anchor_time, true);
if(shift < 1)
{
// 近い別時刻へ寄せず、NO DATAとして扱う
}
完全一致するバーがなければ、近い過去バーで代用しません。
実画像では、全12通貨を2026.07.24 23:00のH1バーへそろえています。画面の時刻は、検証に使ったMT5上のバー開始時刻です。
iMAもiCustomも「ハンドルを作ってバッファを読む」¶
MQL5のiMA()は、移動平均の数値そのものではなく、指標ハンドルを返します。
int fast_handle =
iMA(symbol, PERIOD_H1, 20, 0, MODE_EMA, PRICE_CLOSE);
int slow_handle =
iMA(symbol, PERIOD_H1, 50, 0, MODE_EMA, PRICE_CLOSE);
指標の計算が終わったことをBarsCalculated()で確認し、CopyBuffer()で値を1個ずつ読みます。
double fast[1];
double slow[1];
if(BarsCalculated(fast_handle) > shift &&
BarsCalculated(slow_handle) > shift &&
CopyBuffer(fast_handle, 0, shift, 1, fast) == 1 &&
CopyBuffer(slow_handle, 0, shift, 1, slow) == 1)
{
// fast[0]とslow[0]を比較
}
独自インジケーターへ置き換える場合も流れは同じです。
対象インジケーターをコンパイルし、入力値の型と順番、読みたいバッファ番号を合わせたうえで、同じCopyBuffer()へ渡します。
原典の「別通貨で動くインジケーター値を再計算して取る」という考え方は、MQL5でもハンドル方式として引き継げます。
24本のハンドルを常駐させず、1通貨ずつ走査する¶
12通貨でFast EMAとSlow EMAを使うと、必要な指標ハンドルは単純計算で24本です。
最初は24本を同時に作る構成も試しました。しかし、配布インジケーターと独立検証側が同時に同数を持つと、実機で途中の指標を追加できない状態になりました。
そこで、現在の配布版は次の順で処理します。
- 基準となるH1確定時刻を固定する
- 1通貨分のEMA20・EMA50ハンドルだけ作る
- 履歴と指標の準備を待つ
- 同一時刻の2値を取得する
- 2本のハンドルを解放する
- 次の通貨へ進む
- 12通貨が終わってから集計値を公開する
常駐するMAハンドルは最大2本です。
途中経過を完成値として公開せず、12通貨の走査が終わった時点で強気数、弱気数、欠損数、比率をまとめて更新します。
新しいH1確定足ができたときに次の走査を始めます。欠損が残った場合は、履歴同期を待って再試行します。
欠損を分母から外すだけでは足りない¶
たとえば、11通貨が未取得で、1通貨だけBULLだったとします。
有効銘柄だけを分母にすれば、強気比率は100%です。しかし、1通貨だけで「12通貨の合意」と扱うのは危険です。
そこで、2つの条件を分けました。
初期設定は次のとおりです。
| パラメーター | 初期値 | 役割 |
|---|---|---|
InpMinimumValidSymbols | 8 | 判定に必要な最低有効数 |
InpBullishThresholdPct | 80.0 | 強気合意とみなす比率 |
原典の例にある「12通貨中8通貨」を単純な件数比率へ置き換えると66.7%です。その条件を試す場合は比率を調整できます。
ただし、原典の各通貨に表示された「80%」と、今回の「全体に占めるBULL比率」は別の数値です。混同しないでください。
銘柄の接頭辞・接尾辞と欠損¶
配布版は、まず入力した銘柄名をそのままSymbolSelect()へ渡します。
見つからない場合は、現在のチャート銘柄から接頭辞・接尾辞を推定し、最後に利用可能な銘柄一覧から通貨ペア部分を探します。
たとえば、現在のチャートがEURUSD.aなら、GBPUSD.aのような候補を試します。
それでも見つからない銘柄はNO DATAです。別のCFDや独自シンボルを、似た名前だからという理由だけでFX通貨として採用しません。
12バッファと18表示部品を独立検証した¶
画面表示だけでなく、配布インジケーターは12本の診断バッファを持ちます。
| # | 診断値 |
|---|---|
| 1 | 最低有効数を満たしたか |
| 2 | 入力銘柄数 |
| 3 | 有効銘柄数 |
| 4 | 強気数 |
| 5 | 弱気数 |
| 6 | 中立数 |
| 7 | 欠損数 |
| 8 | 強気比率 |
| 9 | 閾値到達 |
| 10 | 基準バー時刻 |
| 11 | ダッシュボード部品数 |
| 12 | 完了した走査回数 |
専用の検証EAは、配布インジケーターの集計値をそのまま信用しません。
12通貨を1通貨ずつ走査し、別に作成したEMA20・EMA50ハンドルから、同じ確定時刻の値を読み直しました。その結果を12バッファ、各通貨の表示行、見出し、基準時刻、閾値、注文なし表示と照合してから画面を保存しています。
実行条件¶
| 項目 | 値 |
|---|---|
| MT5 Build | 6061 |
| 表示チャート | EURUSD・H1 |
| 基準バー | 2026.07.24 23:00 |
| 対象 | 12通貨ペア |
| 方向判定 | EMA20とEMA50 |
| 最低有効数 | 8 |
| 強気閾値 | 80.0% |
検証結果¶
| 確認項目 | 結果 |
|---|---|
| 配布インジケーターのコンパイル | 0エラー・0警告 |
| 独立検証EAのコンパイル | 0エラー・0警告 |
| 同一H1確定時刻 | 12通貨一致 |
| 有効銘柄 | 12 |
| 強気 / 弱気 / 中立 | 8 / 4 / 0 |
| 欠損 | 0 |
| 強気比率 | 66.7% |
| 80%到達 | 未到達 |
| 診断バッファ | 12本一致 |
| 表示オブジェクト | 18 |
| 実画面キャプチャー | 成功 |
| 注文・ポジション変更 | なし |
ここで確認したのは、同一時刻の指標取得、集計、欠損管理、表示です。将来の値動きや収益性を検証したバックテストではありません。
ダウンロードと使い方¶
50_Multi_Symbol_Trend_Consensus_v1_00.mq5 をダウンロード
- ファイルをMT5のカスタムインジケーターフォルダーへ保存します
- MetaEditorでコンパイルします
- 観測したいチャートへ適用します
InpSymbolsを利用中の銘柄構成に合わせます- 時間足、EMA期間、最低有効数、強気閾値を確認します
主な入力値は次のとおりです。
| パラメーター | 初期値 | 役割 |
|---|---|---|
InpSymbols | 12通貨 | カンマ区切りの対象銘柄 |
InpTimeframe | PERIOD_H1 | 比較する時間足 |
InpFastMAPeriod | 20 | Fast EMA期間 |
InpSlowMAPeriod | 50 | Slow EMA期間 |
InpMAMethod | MODE_EMA | MA方式 |
InpAppliedPrice | PRICE_CLOSE | 適用価格 |
InpBullishThresholdPct | 80.0 | 強気合意の閾値 |
InpMinimumValidSymbols | 8 | 最低有効銘柄数 |
InpRefreshSeconds | 2 | 逐次走査の確認間隔 |
InpShowMAValues | true | Fast / Slow値を表示 |
最初の表示には、各銘柄の履歴とEMAの準備時間が必要です。12通貨を順番に確認するため、適用直後に全行がそろうまで待ってください。
使えないこと・注意点¶
- EMA20がEMA50より上でも、将来の上昇や利益を保証しません。
- 12通貨ペアは独立した12標本ではありません。USDやJPYなど同じ通貨を共有しています。
- 強気比率66.7%を「上昇確率66.7%」とは読めません。
- 原典に登場した非公開インジケーターの80%表示を再現するものではありません。
- バー開始時刻が完全一致しない銘柄は、近い時刻で代用せず
NO DATAになります。 - 対象銘柄が増えるほど、最初の逐次走査に時間がかかります。
- 接頭辞・接尾辞の自動補正は、すべてのブローカー固有名を保証しません。
- 独自インジケーターへ置き換える場合は、バッファ番号、入力値、
EMPTY_VALUE、再描画の有無を確認してください。 - このインジケーターは注文、変更、取消、ポジション管理を行いません。
ロジック評価の結論¶
原典の質問は、複数チャートに表示された結果を、別のチャートからまとめて判断したいというものでした。
今のMQL5では、画面の文字を読む必要はありません。対象銘柄ごとに指標ハンドルを作り、バッファを取得できます。
一方、関数を12回呼べば終わりでもありません。
- どの時刻の値か
- 欠損をどう扱うか
- 何通貨そろえば判定してよいか
- ハンドルをいくつ常駐させるか
- 途中経過を完成値として見せていないか
この境界を決めて、初めて比較できる数字になります。
今回の実測では、12通貨中8通貨がEMA20優位でした。しかし、初期設定の80%には届いていません。そして、届いたとしても売買の正しさを意味しません。
複数通貨の数字を1枚に集める価値は、結論を強く言うことではなく、同じ時刻・同じルール・同じ欠損基準で観測できることにあります。
前後の記事¶
前: 【移植#49】DLL共有メモリをやめて共通ファイルへ — 2つのMT5価格を鮮度付きで比較する