初心者からエキスパートへ: トレンドフィルタによる流動性戦略の拡張
内容
はじめに
流動性に基づく堅牢なトレード戦略を構築したと想像してみてください。戦略は確かに機能しますが、違和感が残ります。市場が強いトレンドを形成すると、システムは上方向・下方向の両方に機械的にシグナルを出し、押し目を信頼すべきなのか、それともトレンド転換を警戒すべきなのか判断に迷ってしまいます。本記事にたどり着いた読者の多くは、方向性の拠り所を欠いた戦略を持ち、価格が大きく動くたびに不安を感じた経験があるかもしれません。
取引ターミナルのチャート上では、機械的に機能する無数のルールが考案され、今もなお新たなルールが生まれ続けています。ある意味で、取引ターミナルは科学実験室に似ています。テクニカル指標、プライスアクションのモデル、統計的な観察結果は絶えず検証・改良・再構成され、新しい戦略が日々生み出されています。しかし、長期間にわたる観察と実践を通じて、ある重要な事実が見えてきます。それは、多くの売買ルールは真に独立したものではないということです。
単独では堅牢に見える戦略でも、時間の経過とともに追加の確認シグナルに依存するようになることが少なくありません。他のインジケータやフィルタ、市場環境に関する条件と組み合わせて初めて安定した性能を発揮するケースが多く見られます。これは戦略そのものの欠点ではなく、市場が本質的に複雑なシステムであることを反映しています。市場は常に変化し続ける動的な環境であり、単一のルールだけに依存したアプローチが、あらゆる相場環境で長期的に通用し続けることはほとんどありません。
前回の記事では、ローソク足の構造と流動性ゾーンに着目した流動性ベースのトレード戦略を構築しました。この戦略では、古典的なトレンド概念を意図的に取り入れず、流動性の挙動そのものに反応することで、上昇相場・レンジ相場・転換局面を問わず機能することを目指しました。この柔軟性は大きな利点ですが、一方で、トレンドフォローを重視するトレーダーにとっては課題も生みます。方向性のバイアスが存在しないため、強いトレンド相場では戦略を信頼して運用し続けることが難しく感じられる場合があります。
本記事の目的は、この制約を解消することです。元の流動性戦略にトレンドフィルタを導入し、流動性シグナルを「いつ」「どの方向で」採用するかを制御できるようにします。これにより、流動性モデルの基本的な仕組みを維持しながら、より確率優位性の高い市場バイアスに整合させます。
本記事は、読者が本連載「初心者からエキスパートへ」のこれまでの記事を読んでおり、前回解説した流動性戦略の基本的な考え方を理解していることを前提としています。次のセクションでは、不利なセットアップを除外するための代表的なフィルタリング手法を紹介し、その中から一つを選択して、MQL5による実装方法を詳しく解説します。
不適切なセットアップを除外する方法
不安をコントロールへと変えるためには、まず、なぜ一見すると有効に見えるセットアップが失敗するのかを理解する必要があります。FXチャートには「悪いセットアップ」は存在するのでしょうか。答えを簡潔に言えば、「存在します」。ただし、より正確には、セットアップごとに置かれている確率的な環境が異なると言うべきでしょう。テクニカル上は正しいセットアップであっても、市場環境が不利であれば統計的な優位性は大きく低下します。だからこそ、フィルタは「あれば便利なもの」ではなく、戦略に不可欠な要素なのです。
強いトレンドが継続している場面を考えてみましょう。その状況で流動性インジケータがトレンドに逆らう供給ゾーン(Supply Zone)を検出したとしても、そのシグナルが意味するのは本格的なトレンド転換ではなく、一時的な勢いの鈍化や小規模な押し戻しに過ぎない可能性があります。このようなセットアップが成功するか失敗するかは、確実性ではなく確率の問題です。支配的なモメンタムに逆らうトレードを繰り返すほど、ドローダウンは大きくなり、期待値も低下していきます。
この問題に対する実践的な解決策は、流動性シグナルを市場全体の方向性と一致させることです。つまり、トレンドに逆らって流動性を取引するのではなく、トレンドの方向へ流動性を利用するという考え方です。そのためには、市場環境を客観的に評価するための制約、すなわち明確なフィルタリングルールを導入する必要があります。
代表的なフィルタには、次のようなものがあります。
- トレンドフィルタ(移動平均線、市場構造など)
- モメンタムやオシレーターによる閾値(RSI、iMACD、ストキャスティクスなど)
- ローソク足のセンチメントや価格挙動
- 時間帯や取引セッションによるフィルタ
これらの考え方は、本記事で扱う戦略だけに限らず、多くのトレードシステムに応用できます。一度理解すれば、さまざまな戦略の一貫性や堅牢性を高めるための有効な手法となるでしょう。
具体例として、本記事では流動性ゾーンインジケータと、最も広く利用されているトレンド指標の一つである50期間指数平滑移動平均線(EMA 50)を組み合わせます。流動性セットアップがEMAの傾きと同じ方向に形成される場合、トレード結果は大幅に改善される傾向があります。

図1:チャートへのインジケータの適用
この考え方は単なる経験則ではありません。市場分析において古くから繰り返し語られてきた基本原則の一つが、「トレンドに従え」です。もちろん、トレンドに沿って取引したからといって成功が保証されるわけではありません。しかし、トレンドに逆らう場合と比べれば、セットアップが想定した利益目標へ到達する確率は大きく向上します。
最後に、前回の記事では十分に触れなかった重要な要素として、利益確定(エグジット)の考え方があります。本記事で紹介する改良版では、利益目標を現在のトレンド方向にある直近のスイング高値またはスイング安値に設定することを基本とします。これらの価格帯は、市場参加者が注目しやすく、価格が反応する可能性の高い自然なポイントです。このような市場構造を尊重することで、戦略全体を価格構造と整合させることができるだけでなく、直近の高値や安値が大きなトレンド転換前の最後の値動きとなる可能性も考慮した、より現実的な利益確定ロジックを構築できます。
実装
このセクションでは、元の流動性戦略にトレンドフィルタを統合することで、戦略を拡張します。前のセクションで説明したさまざまなフィルタリング手法の中から、シンプルで分かりやすく、そして市場で広く受け入れられているEMA 50をトレンド制約として採用します。
実装ルールは意図的にシンプルに設計されています。
- 買い指値注文は、需要流動性ゾーンがEMA 50より上に形成された場合のみ許可されます。
- 売り指値注文は、供給流動性ゾーンがEMA50より下に形成された場合のみ許可されます。
- 流動性ゾーンがEMAの不適切な側に形成された場合、そのセットアップは無視されます。
このロジックにより、システムは実質的にトレンドに整合した押し戻し局面のみを取引するようになります。流動性ゾーンは、もはやトレンド転換ポイントとして扱われるのではなく、トレンド継続のためのエントリーポイントとして扱われます。

図2:トレンド方向と一致した流動性セットアップ
図2:トレンドフィルタを適用した後に形成される、より高確率なセットアップの典型例です。このケースでは、需要ゾーン(Demand Zone)がEMA 50より上に形成されており、強気トレンドとの方向一致が確認できます。そのため、価格が再びゾーンへ戻ってきた際に買い指値注文を待ちます。図に示されているように、価格はEMA 50と一致する形で需要ゾーンまで押し戻されています。つまり、市場構造によるサポートと動的なトレンドサポートが同じ価格帯で重なっている状態です。この一致により、セットアップの有効性は大きく高まります。

図3:無効なトレンド流動性セットアップ
図3:供給ゾーンがEMA 50より上に形成された、無効なセットアップの例です。本戦略のトレンド一致ルールでは、売りエントリーの機会を検討するためには、弱気バイアスを確認する必要があります。そのため、供給ゾーンはEMA 50より下に位置していなければなりません。しかし、この条件を満たしていないため、このセットアップは方向性の一致を欠いており、統計的には低確率のシナリオと判断されます。
トレードロジックの概要(擬似コード)
新しいバーが形成されるたびに:
終値に基づいてEMA(50)を計算します。
もし強気の流動性セットアップ(需要ゾーン)が検出された場合:
基準ローソク足の安値がEMA値を超える場合:
そのゾーンで買い指値注文を出します。
もし弱気の流動性セットアップ(供給ゾーン)が検出された場合:
基準ローソク足の高値がEMA値より小さい場合:
そのゾーンで売り指値注文を出します。
この疑似コードは、フィルタリングロジックの中心的な考え方を表しています。次のセクションでは、エキスパートアドバイザー(EA)をコーディングまたはカスタマイズしたい方向けに、完全なMQL5実装を紹介します。もしトレードの概念や検証結果にのみ関心がある場合は、直接「テスト」のセクションへ進んでも構いません。
コーディングの観点では、EMAはMQL5標準関数であるiMA()を使用して計算されます。実行モデルに応じて、各ティックまたは新しいバーのタイミングで、現在価格および検出された流動性ゾーンの価格レベルがEMA値と比較されます。この比較結果に基づいて、トレードロジックは条件付きで有効化または無効化されます。
このアプローチには、以下のような利点があります。
- レンジ相場やトレンドに逆らう局面での過剰売買を減らすことができる
- 方向性バイアスを強制することで、意思決定を簡素化できる
- 元々の流動性検出ロジックを変更することなく、そのまま維持できる
フィルタを専用モジュールとして設計する
MetaTrader 5で新しいコンポーネントを開発するとき、私は常に最初に、そのコンポーネントがシステム全体の中でどのような役割を担うべきかを明確にします。今回のケースでは、既存の流動性戦略を書き換えることが目的ではありませんでした。目的は、制御された非侵入的な方法で戦略を拡張することでした。つまり、流動性の圧縮やインパルス動作を検出する既存ロジックを変更することなく、トレンド認識機能を追加することが目標でした。この制約が、解決策の構造を自然に決定しました。
トレンド判定処理を直接EA内部へ組み込むのではなく、その責任を専用のフィルタモジュールへ分離する設計を採用しました。この方法により、戦略コードの可読性が維持され、OnTick()関数が大量の条件分岐で複雑化することを防げます。さらに、エントリーモデルが異なる将来のプロジェクトでも、このトレンドロジックを再利用できるという利点があります。
この責任分離をコード上でも明確にするため、専用ヘッダーファイルTrendFilter.mqhを作成しました。このファイルには、売買処理、注文執行、リスク管理に関するコードは一切含めません。唯一の役割は、単純な一つの質問に答えることです。 「現在の市場環境は、買いまたは売りに適した状態なのか?」それだけを判断する責任を持たせます。
//+------------------------------------------------------------------+ //| TrendFilter.mqh | //| Simple EMA-based trend constraint for strategies | //+------------------------------------------------------------------+ #ifndef __TREND_FILTER_MQH__ #define __TREND_FILTER_MQH__
インクルードガードにより、同じファイルが複数のソースファイルから間接的にインクルードされた場合でも、そのファイルが一度だけ処理されることが保証されます。これは小さな構造上の工夫に見えますが、プロジェクトが大規模になるにつれて非常に重要な役割を果たします。
フィルタを状態を持つクラスとして定義する
単純なグローバル関数としてトレンドロジックを公開するのではなく、私はそのロジックをクラス内部にカプセル化しました。この設計により、フィルタ自身が内部状態、特にインジケータハンドルを管理できるようになります。その結果、実装の詳細がEA側へ漏れ出すことを防げます。また、この方法によってインターフェースがより明確になり、将来的な再利用性も向上します。
class CTrendFilter
{
この段階では、クラスは意図的に最小限の構成にしています。注文処理、チャートコンテキスト以外のシンボル情報、または取引執行ロジックへの参照は一切含めていません。これにより、このフィルタは概念的に純粋な役割を維持できます。
内部状態変数の宣言クラスのprivateセクションには、移動平均の計算および状態管理に必要な変数を定義します。これらの変数は、フィルタの設定情報と実行時の内部状態を表します。
private: int m_period; ENUM_MA_METHOD m_method; ENUM_APPLIED_PRICE m_price; int m_handle;
ここで最も重要な変数はm_handleです。このハンドルは、ターミナル内部で実行されているEMAインジケータのインスタンスを表します。もしこのハンドルが無効な状態であれば、フィルタは判断結果を返してはいけません。ハンドルをオブジェクトの状態の一部として管理することで、インジケータの生成から解放までのライフサイクルを正しく制御しやすくなります。
コンストラクタと安全な初期化
私は常に、インジケータハンドルを明示的に初期化するようにしています。ハンドルを未初期化のまま放置すると、テストや最適化の段階でのみ発生するような、発見が難しい不具合につながる可能性があります。コンストラクタの役割は、インジケータを作成することではありません。その役割は、オブジェクトを既知の安全な初期状態へ設定することです。
public: CTrendFilter() { m_handle = INVALID_HANDLE; }
ハンドルをINVALID_HANDLEに設定することで、後で初期化されたかどうかを確実に確認できます。
初期化時のEMAの作成
インジケータの作成は、ティックハンドラ内ではなく、制御された初期化フェーズで行うべきです。そのため、EAがOnInit()関数から呼び出すInit()メソッドを導入しました。
bool Init(int period = 50, ENUM_MA_METHOD method = MODE_EMA, ENUM_APPLIED_PRICE price = PRICE_CLOSE) { m_period = period; m_method = method; m_price = price; m_handle = iMA(_Symbol, _Period, m_period, 0, m_method, m_price); return (m_handle != INVALID_HANDLE); }
ここでは、フィルタが自身の設定情報を保存し、現在表示されているチャートのシンボルと時間足を使用してEMAインジケータを作成します。もしインジケータの作成に失敗した場合、関数はfalseを返します。これにより、EAは安全に起動処理を中止できます。この仕組みによって、必要な依存関係が不足した状態で戦略が実行されることを防止できます。
EMA値を安全に取得する
インジケータが正常に作成された後、フィルタには、その値を安全かつ一貫した方法で取得する仕組みが必要になります。そのため、インジケータバッファから値を読み取る専用メソッドとしてValue()を実装しました。
double Value(int shift = 1) { if(m_handle == INVALID_HANDLE) return 0.0; double buffer[]; if(CopyBuffer(m_handle, 0, shift, 1, buffer) <= 0) return 0.0; return buffer[0]; }
デフォルトのshift値を1に設定することで、取得される値は確定済みのローソク足から取得されます。これにより、現在形成中のバーから得られる不完全なデータに基づいて判断することを防ぎ、ライブトレードおよびバックテストの両方において、フィルタの動作を安定させることができます。
トレンドロジックを許可判定として表現する
単純にEMAの数値そのものを戦略側へ公開するのではなく、フィルタのロジックを取引許可という形で表現する設計にしました。この設計により、EAのコードを読みやすく保つことができ、さらにインジケータ計算のロジックを売買条件の中へ直接埋め込む必要がなくなります。
bool AllowBuy(double price) { return (price > Value(1)); }
買いセットアップでは、ロジックは意図的にシンプルにしています。価格がEMAより上にある場合、強気の流動性セットアップが許可されます。
bool AllowSell(double price) { return (price < Value(1)); }
同様に、売りセットアップは価格がEMAより下にある場合のみ許可されます。このフィルタは、価格がどのように選択されたのか、またどの種類の注文が発注されるのかについては関与しません。フィルタが評価するのは、方向性のコンテキストのみです。
インジケータリソースの解放
適切なリソース解放処理は、見落とされがちですが、プロフェッショナルなMQL5開発において重要な要素です。EAが削除された場合、または再コンパイルされた場合、EAが作成したすべてのインジケータハンドルは直ちに解放される必要があります。void Release() { if(m_handle != INVALID_HANDLE) { IndicatorRelease(m_handle); m_handle = INVALID_HANDLE; } }
このメソッドは、EAのOnDeinit()関数から呼び出されることを想定しています。これにより、プラットフォームはリソースを安全かつ予測可能な形で回収できます。
フィルタをEAへ統合する
統合は依存関係の定義から始まります。ここでEAは、トレード実行エンジンとトレンドフィルタモジュールの両方に依存していることを明示します。これは単なるコンパイル上の処理ではありません。実行フローにおいて、トレンドロジックが重要な制約条件として扱われることを明確にします。TrendFilter.mqhをインクルードすることで、EAは移動平均ロジックを直接埋め込むのではなく、再利用可能でカプセル化されたコンポーネントへ方向性判断の責任を正式に委譲します。
#include <Trade/Trade.mqh> #include <TrendFilter.mqh>
依存関係が定義されると、EAはそのライフサイクル全体で使用されるオブジェクトを生成します。CTradeのインスタンスは注文執行と発注処理を担当し、CTrendFilterはインジケータハンドルの管理とトレンド判定を担当する、状態を保持した永続的なオブジェクトになります。この分離により、トレンド判定が毎ティック無計画に再計算されることを防ぎ、より一貫性のある形で管理できます。
CTrade trade; CTrendFilter trend;
トレンドフィルタを使用するには設定情報が必要です。 このシステムでは、その設定をユーザー入力として意図的に公開しています。移動平均期間はコード内に固定値として埋め込むのではなく、初期化時にEAからフィルタへ渡されます。この設計により、トレードロジック自体の安定性を維持しながら、トレーダーはトレンドバイアスをどの程度厳格に、または緩やかに設定するかを制御できます。
input int TrendMAPeriod = 50;
初期化フェーズで、トレンドフィルタが実際に動作可能な状態になります。OnInit()の中で、EAは選択された移動平均期間を渡してtrend.Init()を明示的に呼び出します。内部では、このタイミングで移動平均のハンドルが作成され、有効性が確認されます。もしこの処理に失敗した場合、EAは起動を拒否します。これは非常に重要です。なぜなら、有効なトレンドフィルタなしで取引を開始することは、戦略の基本ルールに反するためです。
int OnInit() { if(!trend.Init(TrendMAPeriod)) { Print("Failed to initialize trend filter"); return INIT_FAILED; } return INIT_SUCCEEDED; }
同様に重要なのが、適切なリソース管理です。EAが削除された場合、または再コンパイルされた場合、トレンドフィルタは自身が保持しているインジケータハンドルを解放する必要があります。これにより、不要なリソースが残ることを防ぎ、特に頻繁に戦略テストや最適化を実行する環境において、ターミナルの安定性を維持できます。EAは、この責任をフィルタ側へ明確に委譲します。
void OnDeinit(const int reason) { trend.Release(); }
トレンドフィルタが初期化され、正常に動作している状態になると、EAは通常の実行サイクルへ移行します。OnTick()関数にはガード処理を設け、すべてのロジックが新しいバーの形成時にのみ実行されるようにします。これにより、ローソク足ベースのロジックとトレンド評価の一貫性が保たれます。これは重要な点です。なぜなら、トレンドフィルタで使用している移動平均もティック単位ではなく、バー単位で計算されるものだからです。
void OnTick() { if(!IsNewBar()) return;
トレードロジックを評価する前に、スプレッドなどの市場条件を確認します。これにより、トレンドフィルタが参照されるのは、約定環境が許容範囲内にある場合だけになります。トレンド方向が一致しているだけでは十分ではありません。実際の取引環境における制約条件とも共存する必要があります。
if(SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) > MaxSpreadPoints) return;
EAが流動性圧縮セットアップを構築する際、インパルス足(A)とベース足(B)を識別し、それぞれの値幅を計算して圧縮率を検証します。この段階では、まだトレンドロジックは適用されません。まず、セットアップ自体が構造的に有効である必要があります。
int A = 1; // Impulse candle int B = 2; // Base candle double rangeA = CandleRange(A); double rangeB = CandleRange(B); if(rangeB > rangeA / RatioMultiplier) return;
構造的な条件が確認されると、EAは方向性が重要になる段階へ進みます。強気セットアップの場合、価格変動だけでは十分ではありません。たとえ両方のローソク足が陽線で終了していたとしても、EAは最終的な判断をトレンドフィルタへ委ねます。trend.AllowBuy(lowB)の呼び出しは、「現在の価格は、支配的なトレンドに対して正しい位置にあるか?」という、単純でありながら重要な問いを投げかけています。
if(AllowBuy && closeA > openA && closeB > openB) { if(trend.AllowBuy(lowB)) // trend constraint { double sl = lowB - offset; double tp = highA; PlaceBuyLimits(highB, lowB, sl, tp, expiry); } }
弱気セットアップについても、同じ委譲処理が対称的に適用されます。弱気のモメンタムが存在し、圧縮条件が有効であったとしても、売り側の流動性トラップは、トレンドフィルタが価格が移動平均線より下に位置していることを確認した場合にのみ許可されます。これにより、戦略は逆張り的な投機ではなく、トレンド継続ロジックに沿った動作を維持できます。
if(AllowSell && closeA < openA && closeB < openB) { if(trend.AllowSell(highB)) // trend constraint { double sl = highB + offset; double tp = lowA; PlaceSellLimits(highB, lowB, sl, tp, expiry); } } }
この統合によって実現されるのは、明確な責任分離です。
EAは、市場構造・注文執行・リスク管理を担当します。
トレンドフィルタは、方向性に基づく取引許可を担当します。
移動平均のロジックが戦略内部へ漏れ込むことはありません。重複した計算も存在しません。EAは単純に、「この場所で、この方向に取引してよいのか?」と問いかけるだけであり、フィルタが明確な判断を返します。
これで概念的な基盤が整いました。次の段階では、体系的なテストを通じて、この戦略を評価する準備ができました。
テストと結果
テストは、制御された条件下でMetaTrader 5ストラテジーテスターを使用して実施しました。元の戦略とフィルタ適用後の戦略を公平に比較できるよう、前回の記事で使用したものと同じ銘柄、時間足、履歴期間を維持しました。
テスト手順は以下の通りです。
- ビジュアルモードを有効化し、トレード動作およびゾーンとの相互作用を確認する。
- 元の流動性戦略を使用してベースラインテストを実行する。
- EMA 50フィルタを適用し、同一パラメータで再度テストを実行する。
- 取引頻度、ドローダウン、エクイティカーブの動きを比較する。

図4:ストラテジーテスターのビジュアル表示
結果は、ロジックから予想された内容を裏付けるものでした。フィルタ適用版では、テスト期間中の取引回数が減少しました。具体的には、元の戦略と比較して約35%少ない取引数となりました。しかし、それぞれの取引はより明確な市場コンテキストの中で実行されるようになりました。ドローダウンはより滑らかな推移を示し、フィルタなしのバージョンと比較して、より速く回復しました。連敗は依然として発生しましたが、その期間は短くなり、損失規模も小さくなりました。
最も重要な点は、取引がより一貫して大きな市場の方向性と一致するようになったことです。以前の問題であった、「押し目を信頼するべきか、それとも反転を警戒するべきか」という迷いは、フィルタによって明確な判断基準が与えられたことで解消されました。価格がEMAより上にある場合は、買いのみを検討します。価格がEMAより下にある場合は、売りのみを検討します。この結果、戦略はもはやトレンドに逆らうことなく動作するようになりました。
結論
本記事では、方向性バイアスを持たない流動性ベースの戦略を取引する際に生じる不安を、シンプルなトレンドフィルタによってどのように解決できるかを示しました。EMA 50を方向性の制約条件として導入することで、あらゆるゾーンに対して状況を問わず反応する中立的な流動性モデルから、トレンド方向に沿った制御されたフレームワークへとシステムを変化させました。この戦略は、もはや市場と戦うのではなく、資金を投入する前に現在のトレンド方向との一致を確認するようになります。
しかし、ここで重要なのは移動平均そのものではありません。EMA 50は単なる一例であり、より深い原則である制約駆動型設計を実践的に示すための例にすぎません。戦略が堅牢になる理由は、あらゆる可能性のあるセットアップを捉えようとすることではありません。市場構造を反映した明確な境界条件の中で動作することによって、戦略の信頼性は高まります。フィルタは単なる追加機能ではありません。それは、単にシグナルを生成するシステムと、高確率な取引機会を提供するシステムを分ける重要な要素です。
今回説明した主要なポイントを簡潔にまとめたものについては、以下の重要な学びの表、および本記事全体で使用したソースコードを含む添付資料セクションを参照してください。
重要な点として、今回の拡張は元の戦略が持つ柔軟性を維持しながら、より高い確信度と一貫性を提供します。流動性の基本メカニズムは変更されていません。ゾーンの検出はそのまま維持され、圧縮状態の測定も継続され、注文もこれまで通り正確に配置されます。変化したのは、これらのメカニズムが動作するフレームワークです。それは、市場の支配的な方向性を尊重する構造へと進化しました。
次回の記事では、ボラティリティフィルタ、セッションベースのルール、マルチタイムフレーム確認など、追加の制約条件を導入することで、戦略の中核ロジックを損なうことなく、さらに精度を高める方法について探ります。初心者からエキスパートへ進む道とは、完璧なインジケータを見つけることではありません。それは、構造・規律・効率性を備えたシステムを設計する能力を身につけることなのです。
重要な学び
| 重要な学び | 説明 |
|---|---|
| フィルタの重要性 | 生のエントリー条件だけでは、通常十分ではありません。フィルタを導入することで、戦略に市場状況への認識が加わり、単一パターンが発生するたびに機械的にシグナルを出すのではなく、より広い市場環境の中でシグナルを評価できるようになります。 |
| トレンドとの一致: | 取引方向を現在の主要トレンドと一致させることで、逆張り的な反応よりもトレンド継続を優先でき、トレード期待値が向上します。実際には、これにより誤ったブレイクアウトや質の低い反転シグナルへのエクスポージャーを減らすことができます。 |
| 制約設計: | 適切に設計された制約条件は、トレード実行前に満たす必要がある論理ゲートとして機能します。このアプローチにより、戦略の焦点が維持され、過剰取引を防ぎ、判断経路の理解やデバッグが容易になります。 |
| モジュール型戦略: | 戦略の拡張は、コアロジックを変更することなく動作を追加できる独立したモジュールとして実装するべきです。これにより安定性を維持しながら、段階的な改善と将来的な保守性を高められます。 |
| ライフサイクル管理 | MQL5のインジケータやリソースは、明示的な初期化と解放が必要です。正しいライフサイクル管理により、メモリリーク、無効なハンドル、長時間稼働時の予期しない動作を防止できます。 |
| 状態認識 | 特にOnTickのようなイベント駆動環境では、戦略は自身の実行状態を認識する必要があります。バーの切り替わりを追跡することで、1本のローソク足につき1回だけシグナルを処理し、重複注文やロジック競合を防止できます。 |
| カプセル化 | インジケータロジックを専用クラス内部にカプセル化することで、EAのコードを整理し、可読性を向上できます。この分離によりコードの重複が減り、実行ロジックに影響を与えずにインジケータを再利用または交換できます。 |
| 早期失敗 | 初期化エラーは、システムを不完全な状態で動作させるのではなく、直ちに実行を停止すべきです。早期停止により問題解決が容易になり、意図しない取引動作を防げます。 |
| データタイミング | リアルタイムのティックではなく、確定済みローソク足で計算をおこなことで、より安定し再現性の高いシグナルを生成できます。この方法はノイズへの過敏な反応を減らし、バックテストやビジュアル分析との整合性を高めます。 |
| 許可ロジック | 取引実行は、許可ベースの判断として扱うべきです。フィルタや制約条件が取引許可または禁止を明示的に与えることで、戦略の意図が明確になり、実行動作も予測可能になります。 |
| 役割分離 | 堅牢な戦略では、市場分析、取引適格性判断、注文執行をそれぞれ異なる責任として分離します。これにより複雑性が低下し、開発やテスト時にエラー箇所を特定しやすくなります。 |
| 入力の柔軟性 | 重要なパラメータを入力項目として公開することで、ソースコードを変更せずに、異なる銘柄・時間足・市場環境へ戦略を適応できます。 |
| 市場構造に基づくリスク設定 | ストップロスやテイクプロフィットの設定は、任意の距離ではなく市場構造を基準に決定すべきです。構造に基づいたリスク管理は、トレードシグナルを生成したロジックと整合します。 |
| コンテキスト優先 | 方向性バイアスを適用する前に、市場環境を検証する必要があります。市場構造、ボラティリティ、トレンド条件によって、そのセットアップが意味を持つのか、完全に無視すべきなのかが決まります。 |
| 整然とした統合 | 新しいコンポーネントは、実行フローへの変更を最小限に抑えながら既存システムへ統合するべきです。これにより回帰リスクを低減し、元の戦略動作を維持できます。 |
| 実行規律 | 厳格な実行ルールにより、事前に定義されたすべての条件が満たされた場合のみ取引が実行されます。この規律は、一貫性、バックテストの信頼性、そして長期的な戦略評価に不可欠です。 |
添付ファイル
| ソースファイル名 | 種別 | バージョン | 説明 |
|---|---|---|---|
| TrendFilter.mqh | ヘッダーモジュール | 1.00 | 優勢な市場方向に沿って取引実行を制限する、再利用可能なEMAベースのトレンドフィルタクラスを提供します。このモジュールは、インジケータハンドルの作成、バッファアクセス、方向性に基づく許可ロジックをカプセル化しており、EA内部へ直接インジケータロジックを組み込むことなく、戦略側からトレンド方向との一致を確認できます。 |
| Single_Candle_Liquidity_Trader_Filtered.mq5 | EA | 1.10 | 高時間足EMAによるトレンド制約を追加した、流動性圧縮およびインパルス継続型戦略を実装したEAです。ベース足・インパルス足構造を検出し、流動性ゾーン内へ複数段階の指値注文を配置します。また、バー単位で実行タイミングを管理し、方向性の検証処理をTrendFilterモジュールに方向性検証を委譲することで、取引の質を改善します。 |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/21133
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
MQL5でのスイング極値とプルバック(第2回):EAによる戦略の自動化
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
MQL5入門(第42回):MQL5におけるファイル処理入門(IV)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索