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

この記事の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は、移動平均期間を比べて自動的に短期・長期を選ぶ機能ではありません。
順番を逆にして30・20・10・5LWMAと置けば、Firstは30LWMA、Previousは5LWMAになります。同じパラメータでも配置順を変えると計算元が変わるため、テンプレートへ保存したチャートや複数人で共有する手順では特に注意が必要です。
また、First/Previousを指定したインジケータは単独で完結していません。参照元との依存関係があるので、元のインジケータを外したり構成を変えたりすると、後段も維持できなくなります。
MQL5では「ハンドルを適用データにする」¶
MQL5のiMA()は、最後のapplied_priceへPRICE_CLOSEなどの価格定数だけでなく、別のインジケーターハンドルも渡せます。
今回の構成は次の2段階です。
- 終値から5・10・20・30LWMAの4ハンドルを作る
- 5LWMAと30LWMAの各ハンドルを、期間1の確認用MAへ渡す
概念上は次の形になります。
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本で測った¶
重なって見えるだけでは、数ポイントの差を見落とす可能性があります。そこで次の値をチャート上へ表示します。
初期値は直近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へ定期連携