コンテンツにスキップ

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

EURUSDのH1チャート上で12通貨のEMA方向、強気比率66.7%、80%閾値、同一確定時刻の検証合格を表示したMT5画面

この記事の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通貨ペアを対象にします。

Text Only
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 銘柄、履歴、指標値、同一時刻のどれかを取得できない

強気比率は、次の式です。

Text Only
強気比率 = BULLの銘柄数 / 有効銘柄数 × 100

画像の実測値は、強気8、弱気4、有効12です。

Text Only
8 / 12 × 100 = 66.7%

初期閾値は80%なので、この時点の表示はBELOW TARGETです。

これは売買シグナルではありません。12通貨のうち何通貨が、同じ単純ルールで強気状態かをまとめた観測値です。


「各銘柄の1本前」ではなく同じ時刻を探す

マルチシンボル処理で気をつけたいのは、バー番号だけを合わせても、時刻が同じとは限らないことです。

銘柄ごとに履歴の開始位置や欠損が違うと、すべての銘柄で単純にshift=1を読むだけでは、別時刻の値を混ぜる可能性があります。

今回の基準は、表示中チャートのH1直近確定足です。

MQL
datetime anchor_time = iTime(_Symbol, PERIOD_H1, 1);

対象銘柄ごとに、iBarShift()exact=trueで、その時刻と完全一致するバーを探します。

MQL
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()は、移動平均の数値そのものではなく、指標ハンドルを返します。

MQL
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個ずつ読みます。

MQL
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]を比較
}

独自インジケーターへ置き換える場合も流れは同じです。

MQL
int custom_handle =
   iCustom(symbol, PERIOD_H1, "YourIndicator", /* inputs */);

対象インジケーターをコンパイルし、入力値の型と順番、読みたいバッファ番号を合わせたうえで、同じCopyBuffer()へ渡します。

原典の「別通貨で動くインジケーター値を再計算して取る」という考え方は、MQL5でもハンドル方式として引き継げます。


24本のハンドルを常駐させず、1通貨ずつ走査する

12通貨でFast EMAとSlow EMAを使うと、必要な指標ハンドルは単純計算で24本です。

最初は24本を同時に作る構成も試しました。しかし、配布インジケーターと独立検証側が同時に同数を持つと、実機で途中の指標を追加できない状態になりました。

そこで、現在の配布版は次の順で処理します。

  1. 基準となるH1確定時刻を固定する
  2. 1通貨分のEMA20・EMA50ハンドルだけ作る
  3. 履歴と指標の準備を待つ
  4. 同一時刻の2値を取得する
  5. 2本のハンドルを解放する
  6. 次の通貨へ進む
  7. 12通貨が終わってから集計値を公開する

常駐するMAハンドルは最大2本です。

途中経過を完成値として公開せず、12通貨の走査が終わった時点で強気数、弱気数、欠損数、比率をまとめて更新します。

新しいH1確定足ができたときに次の走査を始めます。欠損が残った場合は、履歴同期を待って再試行します。


欠損を分母から外すだけでは足りない

たとえば、11通貨が未取得で、1通貨だけBULLだったとします。

有効銘柄だけを分母にすれば、強気比率は100%です。しかし、1通貨だけで「12通貨の合意」と扱うのは危険です。

そこで、2つの条件を分けました。

Text Only
有効銘柄数 >= InpMinimumValidSymbols
かつ
強気比率 >= InpBullishThresholdPct

初期設定は次のとおりです。

パラメーター 初期値 役割
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 をダウンロード

  1. ファイルをMT5のカスタムインジケーターフォルダーへ保存します
  2. MetaEditorでコンパイルします
  3. 観測したいチャートへ適用します
  4. InpSymbolsを利用中の銘柄構成に合わせます
  5. 時間足、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価格を鮮度付きで比較する

— SPONSORED —