コンテンツにスキップ

【移植#18】FirstとPrevious — インジケータの参照順をMQL5で可視化

FirstとPreviousの参照先を4本のLWMAと2本の点線で比較したEURUSD 1時間足

この記事の3行まとめ

  • First Indicator's Dataは最初に置いたインジケータ、Previous Indicator's Dataは新しく置くインジケータの直前を参照します
  • 5・10・20・30LWMAの順なら、Firstは5LWMA、Previousは30LWMAです。期間の大小ではなく配置順で決まります
  • MQL5では参照元のハンドルをiMA()へ渡して同じ関係を明示でき、直近500本の最大差が両方0になることを実MT5で確認しました

今回の原典は「適用価格」の参照順

投稿日順では2010年1月4日に新年の挨拶記事がありますが、MQLの技術題材ではないため、次の1月5日の記事へ進みます。

元記事を読む

原典の質問は、メインチャートへ5・10・20・30LWMAを順に表示したあと、5本目の移動平均の適用データを選ぶ場面についてでした。

選択肢 5・10・20・30LWMAの順での参照先
First Indicator's Data 最初の5LWMA
Previous Indicator's Data 直前の30LWMA

原典の回答は「その認識でよい。ただし、4本をその順番で表示する必要がある」というものです。今回のMQL5版は、この順番依存を数値でも確かめられる形へ再構成しました。


FirstとPreviousは「短期」と「長期」ではない

ここが最も大切です。FirstとPreviousは、移動平均期間を比べて自動的に短期・長期を選ぶ機能ではありません。

Text Only
配置順: LWMA 5 → LWMA 10 → LWMA 20 → LWMA 30 → 確認用MA
          ↑ First                              ↑ Previous

順番を逆にして30・20・10・5LWMAと置けば、Firstは30LWMA、Previousは5LWMAになります。同じパラメータでも配置順を変えると計算元が変わるため、テンプレートへ保存したチャートや複数人で共有する手順では特に注意が必要です。

また、First/Previousを指定したインジケータは単独で完結していません。参照元との依存関係があるので、元のインジケータを外したり構成を変えたりすると、後段も維持できなくなります。


MQL5では「ハンドルを適用データにする」

MQL5のiMA()は、最後のapplied_pricePRICE_CLOSEなどの価格定数だけでなく、別のインジケーターハンドルも渡せます。

今回の構成は次の2段階です。

  1. 終値から5・10・20・30LWMAの4ハンドルを作る
  2. 5LWMAと30LWMAの各ハンドルを、期間1の確認用MAへ渡す

概念上は次の形になります。

MQL
first_handle    = iMA(_Symbol, _Period, 5,  0, MODE_LWMA, PRICE_CLOSE);
previous_handle = iMA(_Symbol, _Period, 30, 0, MODE_LWMA, PRICE_CLOSE);

first_probe = iMA(
   _Symbol, _Period, 1, 0, MODE_SMA,
   (ENUM_APPLIED_PRICE)first_handle
);
previous_probe = iMA(
   _Symbol, _Period, 1, 0, MODE_SMA,
   (ENUM_APPLIED_PRICE)previous_handle
);

期間1のSMAは入力値をそのまま返します。そのため、First確認線は5LWMAと、Previous確認線は30LWMAと完全に重なるはずです。

GUIのFirst/Previousは表示リスト上の位置から参照先を決めますが、コード版は参照するハンドルを直接指定します。順番の意図がソース上に残り、別のインジケータを途中へ追加しても参照先が勝手に変わらない点が利点です。


実装で押さえた5点

1. 元線4本と確認線2本を同時表示した

元線は5・10・20・30LWMAです。さらにFirst確認線を水色の点線、Previous確認線を黄色の点線で重ねました。

色・形式 意味
LWMA 5 青・実線 Firstの参照元
LWMA 10 オレンジ・実線 中間の2本目
LWMA 20 緑・実線 中間の3本目
LWMA 30 マゼンタ・実線 Previousの参照元
First probe 水色・点線 LWMA 5を期間1で再出力
Previous probe 黄色・点線 LWMA 30を期間1で再出力

点線が元線の上に重なるため、目視でも参照先を追えます。画面左上には、各参照先と最大差も表示します。

2. 計算完了を待ってからコピーした

ハンドルを作成した直後は、すべての履歴がまだ計算されていない場合があります。BarsCalculated()で6ハンドルの計算本数を確認し、チャート本数に届くまで描画を待ちます。

履歴準備中の値を成功扱いせず、後続の確認線も含めて同じ本数が揃ってから比較する設計です。

3. CopyBuffer()の戻り値を検査した

各ハンドルの値はCopyBuffer()で表示バッファへ移します。要求した本数と戻り値が一致しなければ、その計算回は更新しません。

MQL5の公式仕様では、コピー先配列のas_series設定にかかわらず、物理メモリ上は古い要素が先頭へ格納されます。今回は表示バッファを通常順に統一し、元線と確認線の同じ物理位置を比較しています。

4. 最大差を直近N本で測った

重なって見えるだけでは、数ポイントの差を見落とす可能性があります。そこで次の値をチャート上へ表示します。

Text Only
max |LWMA5[i]  - FirstProbe[i]|
max |LWMA30[i] - PreviousProbe[i]|

初期値は直近500本です。確認用MAの期間を1から変えれば再平滑化が入るため、最大差は通常0ではなくなります。

5. 依存先より先に確認線を解放した

終了時は、後段のFirst/Previous確認ハンドルを先に解放し、その後で4本の元LWMAハンドルを解放します。参照関係と逆順に片付けることで、依存先を先に失わないようにしました。


専用MT5での動作確認

売買を行わない専用テストMT5へ適用し、表示とは別に各バッファを読み取って一致を検査しました。

項目 設定・結果
通貨ペア・時間足 EURUSD・1時間足
配置順 LWMA 5 → 10 → 20 → 30 → 確認線
確認用MA 期間1・SMA
比較本数 直近500本
Firstの参照先 LWMA 5
First最大差 0.000000000000
Previousの参照先 LWMA 30
Previous最大差 0.000000000000
読み込み済みバー 10,000本
キャプチャ 成功、エラー0
本体コンパイル 0 errors / 0 warnings
検証用コンパイル 0 errors / 0 warnings

画像はMT5から直接取得したGreen on Blackの実チャートです。水色の点線が5LWMA、黄色の点線が30LWMAへ重なり、数値比較でも両方の最大差が0になりました。


パラメータ

パラメータ 初期値 説明
InpFirstPeriod 5 First参照元として扱うLWMA期間
InpSecondPeriod 10 2本目のLWMA期間
InpThirdPeriod 20 3本目のLWMA期間
InpPreviousPeriod 30 Previous参照元として扱うLWMA期間
InpProbePeriod 1 参照確認用MAの期間
InpProbeMethod SMA 参照確認用MAの方式
InpAppliedPrice Close 4本のLWMAへ使う価格
InpCompareBars 500 最大差を調べる本数

原典と同じ一致確認をするなら、InpProbePeriod=1のまま使ってください。期間を2以上にすると「参照元へさらに移動平均をかける」実験になります。


ダウンロード

18_First_Previous_Data_Lab_v1_00.mq5 をダウンロード

MT5のIndicatorsへ保存してコンパイルし、確認したい通貨・時間足のチャートへ適用してください。これは参照関係を可視化する学習・検証用インジケータであり、注文処理は含みません。


ロジック評価の結論

原典の説明は、5・10・20・30LWMAをその順で置くという条件なら正しいと確認できました。Firstが5LWMA、Previousが30LWMAを参照し、期間1の確認線との最大差は直近500本でどちらも0でした。

ただし、覚えるべき本質は「First=短期、Previous=長期」ではありません。Firstは配置列の先頭、Previousは追加するインジケータの直前です。設定順を変えれば参照先も変わります。

MQL5コードでは、UI上の暗黙の順番へ頼らず、参照元のハンドルを明示する方が安全です。どの計算結果を次段へ渡したのかがコードから分かり、複数段の平滑化、オシレータへの移動平均、独自シグナルの連結にも同じ考え方を応用できます。


前後の記事

前: 【移植#17】CSVスナップショット出力 — MT5の過去バーをExcelへ定期連携

— SPONSORED —