PDアレイを使いこなす:PDアレイ内のインバランスを活用したトレードの最適化
はじめに
本記事は、プライスアクション内で発生する正しいPDアレイを識別、判断、活用することに難しさを感じているトレーダーを対象としています。PDアレイを利用して高確率トレードを見つけ、実行するためには、価格がこれらのPDアレイ上の異なる位置にある際に、どのようなトレードアクションを選択すべきかを正しく判断する必要があります。また、それぞれのPDアレイ内で発生するインバランスについても取り上げ、それらをどのように活用し、そこからトレードエントリーを実行できるのかについて解説します。
私自身のこれまでの経験や、トレーダーコミュニティでの見聞を通じて感じたことですが、多くのトレーダーはPDアレイを正しく判断、識別、評価、測定する方法を理解していません。また、PDアレイやインバランスを活用する際に必要な経験やスキルが不足しているため、どのPDアレイを使用すべきなのか、また価格がどのインバランスから反応して動く可能性が高いのかを正しく判断できていません。その結果、機能しない誤ったPDアレイやインバランスを選択してしまい、すぐに損失やドローダウンにつながります。そして、そのような経験から、インバランスやPDアレイの概念は機能しないという根拠のない噂や議論が生まれています。
本記事が特に有益となるもう一つの対象は、これらの概念を利用したトレードについて、ある程度のスキルや経験を持っているトレーダーです。このようなトレーダーは、トレードセットアップの選択において成功する場合もありますが、時には大きく失敗してしまい、結果に一貫性がないという状態に陥ることがあります。本記事では、そのようなトレーダーの知識基盤をさらに強化することを目的としています。PDアレイがどのように機能するのか、どのように形成されるのか、どこで発生するのか、なぜ重要なのか、そしてPDアレイ内のインバランスをどのように効果的に最適化して活用するべきなのかを詳細に説明します。さらに、それぞれのPDアレイ内で発生するインバランスから、どのように高確率トレードを識別するのかについても解説します。本記事では、PDアレイとインバランスを最適な方法で使用することで、非常に効果的で利益につながるトレード機会を得られることを明確に示します。また、有効なPDアレイまたは利用価値のあるインバランスを識別する際に使用できる具体的なチェックポイントについても説明します。これにより、トレーダーはそれらのチェックポイントを素早く確認し、自身のトレード判断を評価できるようになります。その結果、冷静な判断が可能となり、衝動的なトレードや執行判断の麻痺を避けることにつながります。
トレーダーとしての私自身の経験から、多くの初心者および中級者のICTコンセプトを使用するトレーダーが、このような課題に直面していることを理解しています。実際には、すべてのトレーダーがトレードキャリアのどこかの段階で、ほぼ同じ、あるいは非常に似た課題に直面します。しかし、その違いを生み出すのは、それぞれのトレーダーがこれらの課題をどのように処理し、反応し、予測するかという点です。そのため、スキル、経験、冷静さ、意思決定能力、そしてテクニックにおいて非常に僅かな差しかない、同等レベルのトレーダー同士であっても、最終的なトレード結果には非常に大きな差が生じることがあります。また、同じ課題であっても、別のトレード概念では異なる名称で説明される場合があります。例えば、ブレイクアウトなどがその一例です。そのため、本記事はICTコンセプトを使用するトレーダーだけでなく、他のトレード戦略を利用しているトレーダーにも有益な内容となります。なぜなら、PDアレイやインバランスは、どのようなトレード戦略を使用していたとしても、プライスアクションの中で常に発生するものだからです。
本記事では、PDアレイを最適に識別し活用する方法を学びたいトレーダー向けに特別に設計されたEAについて詳しく解説します。このEAは、明確に識別されたトレンドや市場のシナリオに沿ってトレードをおこなう際に、優れたトレード機会を提供するPDアレイを効果的に識別し活用することを目的としています。また、トレンド方向に逆らったトレードを避け、安値圏で売って高値圏で買うのではなく、安値圏で買って高値圏で売るという考え方に基づいて設計されています。さらに、このEAは、特定の市場ポイント、例えばトレンドの終了時やHTFにおける主要な反転ポイントで発生するマーケットストラクチャーシフトを、トレードエントリー条件として識別するよう設計されています。また、PDアレイを識別することに特化して最適化されており、価格が安値圏にあるのか高値圏にあるのかを判断した後、それに応じてトレードを実行します。最後に、このEAはPDアレイ内に存在するインバランスを追跡します。これらのインバランスは、価格が反応する非常に重要なエリアとなる可能性があり、トレードセットアップを発見するための十分な機会を提供します。
このEAは、デイトレーダーや短期トレーダーにとっても非常に重要です。なぜなら、その日のトレンド方向に沿って発生する可能性が最も高い価格変動に基づいてトレードすることをサポートするためです。その結果、買いは安値圏でのみ発生し、売りは高値圏でのみ発生するようになり、異なる通貨ペアではほぼ毎日のように、また同じ通貨ペアでも少なくとも週に複数回、高確率のトレード機会を捉えることが可能になります。
定義:PDアレイ、インバランス、市場構造転換、フラクタル構造、OTE
この章では、本記事で使用し活用していく予定の、最も一般的な用語やツールについて定義と説明をおこないます。なぜなら、本記事を利用するすべての方が、これらの概念についてすでに理解しているとは限らず、初めて耳にする方もいると考えているからです。そのため、誰もが公平に学習できるよう、幅広いトレーダーを対象として内容を構成していきます。
1. インバランス/非効率性
インバランス(非効率性)は、価格がいずれかの方向へ急速に動くことで形成されます。これは主に機関投資家による強い買い圧力または売り圧力を示しています。簡単に言えば、このような強い売買圧力が発生すると、市場参加者が平等に注文を出したり約定させたりする機会が失われることがあります。例えば、強い上昇によって価格が勢いよく高値方向へ動いた強気のインバランスでは、売り手は十分な時間や機会を得られずに取り残されます。一方、強い下落によって価格が勢いよく安値方向へ動いた弱気のインバランスでは、買い手は十分な時間や機会を得られません。このように、価格が一方向へ拡大した後、その反対方向への価格移動が存在しない価格帯は、アンバランス(不均衡)な価格帯と呼ばれます。
この現象は、塗装工の作業に例えると最も分かりやすく説明できます。塗装工が壁を塗るとき、均一に仕上げるためには反対方向にも同じように筆を入れる必要があります。この論理は価格にも当てはまります。たとえば、1.3010から1.3030まで強気のローソク足が勢いよく上昇し、その価格帯を突破した場合、本来であれば弱気のローソク足もその価格帯を通過することで価格のバランスが取られます。しかし、その動きが起こらなければ、その価格帯はインバランスとなります。多くの場合、価格は最終的にこのポイントに戻ってきます。この現象は、どの時間足でも発生する可能性があります。

2. 市場構造転換
市場構造転換とは、価格変化において、それまで一方向へ推移していた市場構造が別の方向へ転換する現象を指します。たとえば、価格が上昇トレンドにあり、高値と安値を切り上げ(Higher High、Higher Low)ながら推移していたとします。その後、価格が直近のHigher Lowを勢いよく下抜け、そのまま下落を続け、Lower LowとLower Highを形成し始めた場合、市場構造は強気から弱気へ転換したことになります。市場構造が有効であるためには、このような市場構造のブレイクと、それに伴う勢いと力強さを伴った価格変化が必要です。
また、市場構造転換が高い確率で機能し、単なるダマシの構造転換、Judas Swing、あるいは流動性狩りではないと判断するためには、価格が高い関心を集める価格帯、すなわち私たちが一般に「流動性」と呼ぶポイントから動き出している必要があります。特に、流動性狩りの後に発生する市場構造転換は、成功確率が非常に高いセットアップとなります。さらに、この現象はM1からMNまで、あらゆる時間足で発生します。

3. PDアレイ
PDアレイは、「Premium and Discount Arrays」の略です。基本的に、この概念が市場でおこなうこと、または機能する仕組みは、価格を読むための単純なロジックを利用することです。これは、現実世界のビジネスに置き換えて考えると理解しやすくなります。ビジネスをおこなう人々や買い物をする消費者は、常に安く商品を購入し、高く売ることを好みます。この現象は、トレードにおける価格にも同じように適用できます。トレーダーは常に安いディスカウント領域で買い、高値圏でのみ売るべきです。なぜなら、安値圏で売って高値圏で買うことは、損失を招くことになるためです。
トレードにおけるPDアレイは、理想的なエントリーポイントや、一般的な長い価格変動、トレンド、価格スイング、または価格拡大を避けるべき場所を簡単に識別するのに役立ちます。つまり、急激な価格拡大が発生した後、その動きを測定することで均衡点を見つけ、そこを基準として高値圏と安値圏に分類することができます。

4. フラクタル構造
フラクタル構造とは、同じ通貨ペアにおいて、異なる時間足でも価格が似たようなパターンを形成する性質を指します。そのため、「価格はフラクタルである」とよく言われます。これは、上位足(HTF)で発生したセットアップを、下位足(LTF)へ簡単に追跡し、検証やエントリー判断に利用できることを意味します。また、もしあるパターンやセットアップが1つの時間足だけでしか発生していない場合、それは理想的または正確なものではない可能性があります。
フラクタル構造は、HTFからLTFへトレードセットアップを追跡するために使用できます。また、より下位の足へ移行することで、トレードにおけるリスクエクスポージャーを低減することにも役立ちます。
5. OTE
これはOTE(Optimal Trade Entry、最適なトレードエントリー)を意味します。基本的には、価格における最適なエントリーポイントでトレードを実行することを指します。OTEは、簡単に言えばPDアレイをさらに強化したものです。価格が現在どの位置にあるかに応じて、OTEとなる安値圏または高値圏でトレードを実行することを可能にします。これは、HTFとLTFの両方で利用できる非常に効果的なツールです。特に、価格拡大や市場構造転換の後に発生する短期トレードでは、即時のエントリーポイントを提供できます。また、HTFにおける長期的なトレンドや価格スイングの後に、価格が安値圏にあるのか高値圏にあるのかを判断するためにも役立ちます。
OTEの理想的なゾーンは、通常フィボナッチ比率における62%から約70%付近のレベルです。基本的に、OTEは短期トレードやLTFでも利用できます。LTFのセットアップは、価格が大きく動く直前に、高値圏または安値圏でエントリーする機会を提供します。

PDアレイとインバランスを効果的に活用する方法の詳細
このコンセプトを効果的に活用するための最も重要な最初のステップの一つは、トレンドの方向性と市場のシナリオを判断することです。本記事では、この点について重点的に解説します。これは本コンセプトを成功させるうえで非常に重要なステップであり、市場をどのように分析し、現在どのようなシナリオが展開されているのかを判断するための基礎となります。簡単に言えば、現在のトレンドやシナリオを判断しなければ、この概念全体は機能しません。なぜなら、それによって価格が何を達成しようとしているのかを明確に理解できるからです。
本記事およびこのエキスパートアドバイザー(EA)を使用することで、トレンドに対して適切なPDアレイで実行されるトレードを整合させることができます。これにより、トレンドに逆らう短期トレードや、高値圏での買い、安値圏での売りを避けることができます。これは、発展段階にあるトレーダーがトレードを実行する際の自信と判断力を高めることにつながります。最終的には、成功確率が高く、現在のトレンドやシナリオに沿ったOTEのみを実行する方法を学び、理解できるようになります。そして、トレンド方向とシナリオを判断するという課題を解決できれば、残るのは提示された正しいPDアレイ内で適切なセットアップを見つけることだけです。
トレーダーが利益を生み出す優れた判断をくだすためには、特にデイトレードや長期トレードにおいて、自分自身をトレンド方向、トレンドの強さ、そしてPDアレイに対してどのような位置に置くかが大きく影響します。統計的にも、トレンドに逆らったトレードは、短期的な価格変動をもたらすことが多く、その多くはトレンド方向への大きな動きが発生する直前の単なる押し戻しや戻りであることが、何度も証明されています。もし注意を怠れば、大きな損失を抱える可能性があります。さらに、損失を早い段階で確定できなければ、口座を破綻させる可能性さえあります。なぜなら、トレンド市場では価格が数日、場合によっては数週間にわたって一方向へ動き続けることがあるためです。
一方で、トレンドの強さや方向性に沿ったトレード執行は、たとえエントリーポジションが悪かった場合でも、より許容的な結果になることが多くあります。また、トレーダーが十分な忍耐を持ち、反転、流動性取得、ディスカウント価格から全体的なトレンドが継続するのを待つことができれば、数百ドル、場合によっては数千ドルの追加利益につながることもあります。
さらに、トレンド方向とPDアレイを基準として分析、実行、取引、追跡されたトレードは、より正確で、より速く、そしてドローダウンも非常に少ないことが証明されています。価格はより速くターゲットへ向かって動き、少ないドローダウンで進行する傾向があります。加えて、価格のスイングはより強力であるため、仮に一時的に含み損を抱えた場合でも、最終的にはトレンドの方向と強さに従って価格が再び動き、ドローダウンから回復する可能性が高くなります。
シナリオ、トレンド、そしてPDアレイを判断する最も効果的な方法は、主にW1(週足)とD1(日足)といったHTFを使用し、明確に分析することです。EAが最初におこなう処理(これは手動でもおこなえます)は、単純移動平均線(SMA)と指数平滑移動平均線(EMA)を利用し、市場がトレンド相場なのか、それともレンジ相場なのかを明確に把握することです。トレンド相場は、より安全で質の高いトレード機会を提供します。トレンド相場は、9期間単純移動平均線が21期間移動平均線より上または下に位置し、なおかつ明確な上昇または下降の並びを形成している場合に判断できます。次に重要なのは、この2つのHTFにおける価格変化を確認し、価格がどこへ向かおうとしているのかを分析することです。これらの手順によって、現在のトレンドが強気なのか弱気なのかを比較的容易に判断することができます。
トレンドが確認され、価格がレンジ相場ではないことも確認できたら、次のステップは現在のシナリオ、すなわち価格が何を目指して動いているのかを把握することです。価格は常に、流動性、PDアレイ、またはインバランスのいずれかを目指して動いており、多くの場合、一つの流動性ポイントから次の流動性ポイントへ向かって推移します。ここでHTFにおいて、EAは明確に確認できる大きな価格スイングや価格拡大を素早く識別します。そして、その価格変動の範囲を分割し、安値圏と高値圏を設定します。上側が高値圏、下側が安値圏となります。これによってPDアレイが簡単に識別され、形成されます。そして、トレード判断は、「高値圏で売り安値圏で買う」という前提に基づいておこなわれます。これにより、HTFにおける価格の長期的な状態が、安値圏にあるのか高値圏にあるのかを判断できます。同じ方法と考え方は、LTFでのトレード実行にも利用できます。
これが、このEAがそれぞれのPDアレイを追跡し、予測し、そこからトレードをおこなう方法です。次に、PDアレイ内で発見されるインバランスについてですが、ICTモデルに基づけば、インバランスを利用してエントリーやトレードをおこなう方法は広く知られています。価格拡大または価格変動レッグを発見し、それをPDアレイへ分割した後、次のステップは、実際にトレードをおこなう予定のPDアレイ内に存在するインバランスを探すことです。そのインバランスがトレンドとシナリオを支持している限り、トレードセットアップにおいて非常に有効なツールとなります。このインバランスは、より正確で詳細な分析をおこない、HTFよりもリスクエクスポージャーを低減するために、さらにLTFへ分解することができます。これは、価格がフラクタル構造を持つため可能になります。
つまり簡潔に言えば、このEAは市場で発生している全体的な状況を識別し、評価し、トレンドとシナリオに基づいてPDアレイを判断します。そして、それぞれのPDアレイ内に存在するインバランスを探し、そこで発見されたインバランスからトレードを実行しようとします。PDアレイを判断することで、過売りや過買いの状態でエントリーしてしまう可能性を低減することができます。
MQL5のPDアレイEAによるトレード判断の自動化
この戦略を自動化し、その動作を示し、実装するために、私は以下を作成しました。
- トレンド、PDアレイを分析し、正しいPDアレイが存在する場合にのみ、トレンドとシナリオの方向に沿った可能性のあるエントリーポイントでトレードを実行するPDアレイEAです。このEAには、トレーリングストップロス機能と移動平均線を組み込み、トレンド検出を補助します。
意思決定プロセス
このEAによる判断(トレンド検出、PDアレイ検出、インバランス検出、プライスアクション検出、トレード実行)は、以下のロジックによっておこなわれます。
PDアレイEAのソースコード:
このEAは、全体的なトレンド方向とシナリオに一致する可能性のあるトレードシグナルを検出し、現在の価格が過去の価格拡大や値動きに対してどの位置にあるかに応じて、それぞれのPDアレイ内に存在するインバランスから発生するトレードセットアップのみを待機します。これにより、トレンド方向とは反対のポジションや、適切なPDアレイが存在しない状況でのエントリーを回避します。また、指数平滑移動平均線(EMA)と単純移動平均線(SMA)を利用して市場全体のトレンド方向を判断し、それに基づいてトレードを実行します。さらに、トレーリングストップロスのロジックを適用し、価格が有利な方向へ推移した際にストップロス水準を調整して利益を保護するとともに、資金を守ります。加えて、1回のトレードあたり1%のリスクに制限するリスク管理機能も備えています。
入力パラメータ:設定可能なトレード設定
これらのinput宣言は、MetaTraderのEA設定画面で調整可能な変数を公開するものであり、ユーザーはコードを変更することなく、ゴールド市場の変化する値動きに合わせて戦略を調整できます。「LotSize = 0.01」は、初期設定ではマイクロロットを意味します。XMのスタンダード口座では、これは1ポイントあたり約0.10ドルに相当し、値動きが大きいゴールド市場におけるリスクを抑えたスキャルピングに適しています。例外的なケースとして、口座タイプによって契約サイズが異なる場合があります。例えば、マイクロ口座では0.01が1マイクロロットに相当する場合があります。そのため、過剰または不足したロット設定を避けるため、ユーザーは外部からSymbolInfoDouble()などを使用して確認する必要があります。
「RR = 1.3」は、控えめなリスクリワード比を設定します。これは、頻繁な小さな利益を積み重ねることでトレーダーの自信を高める心理的な効果を意図しています。ゴールド市場ではドローダウンが発生しやすく、過度に高いリスクリワード比(例:3:1)を設定すると、急激な往復変動(ダマシ)によってストップロスにかかることが多いため、それを避ける目的があります。「MaxTradesPerDay = 3」は、規律を維持するための設定です。これにより、損失後のリベンジトレードを防ぎます。これは、感情的な値動きが大きいゴールド市場で、多くのトレーダーが陥りやすい心理的な罠です。TradeLong=trueやTradeShort=falseのような方向設定は、バックテストによって確認された傾向を反映しています。ゴールド市場では、安全資産としての心理的要因により、安値を流動性取得した後の反転(下方向の流動性掃討後に生じる強気反転)から、より強い上昇反応が発生することが多くあります。そのため、初期設定ではショート取引を無効化し、上昇傾向に逆らう逆張りトレードを避ける設計になっています。
「MinBodyPercent = 0.6」は、方向性の強さを要求する設定です。つまり、ローソク足の実体が全体の値幅の60%以上であることを条件とし、継続的な動きを伴わないピンバーのような見せかけの動きをフィルタリングします。例外的なケースとして、週末明けのギャップによって大きなローソク足が形成された場合、セッションフィルターがないとシグナルが発生する可能性があります。「MinRangePoints = 0.0」(無効設定)は、小さな値幅を無視する機能です。有効化した場合(例:10ポイント)、アジア時間帯など流動性が低い時間帯に発生する小さな値動きを除外できます。これにより、個人トレーダーによるノイズではなく、機関投資家の意図を示す「強い価格移動」を示すローソク足へ重点を置くことができます。
セッション設定では、GMT+2を基準とした時間帯が固定されています。アジア市場は0時から7時までとし、出来高の少ない保ち合い相場の中でレンジが形成される時間帯、すなわち心理的な蓄積局面として位置付けています。ロンドン市場は9時から12時までとし、欧州市場の開始に伴って流動性が急増する時間帯としています。ニューヨーク市場は15時から18時までとし、米国市場主導のモメンタムが生まれやすい時間帯として設定されています。心理的な観点では、このEAはセッション移行時に発生する市場の動きを利用します。アジア時間で形成されたレンジ内に存在するポジションが、新しい資金流入によって流動性取得されるという、典型的なスマートマネーによる価格操作の動きを利用しています。一方で、サマータイム(DST)の切り替えによってセッション時間が変化する場合は、ユーザー自身で時間設定を調整する必要があります。また、ブローカーのサーバー時刻が設定と一致しない場合には、本来想定していない時間帯でトレードが実行される可能性があります。このように設定を柔軟に変更できることで、トレーダーは自身の取引環境に合わせてEAを最適化でき、市場操作への対応を目的とした、自分専用のトレードツールとして活用することができます。
//+-----------------------------------------------------------------------------------------+ //| PD Arrays Detector EA.mq5 – XM GMT+2 | //| Expert Advisor for MetaTrader 5 | //| Description: Trades based on PD Arrays and imbalances utilizing | //| premium and discount arrays. | //+-----------------------------------------------------------------------------------------+ #property copyright "EUGENE MMENE" #property link "HTTPS://WWW.EMCAPITAL.COM" #property version "7.11" #include <Trade/Trade.mqh> CTrade trade; //+--------------------------------------------------------------------------------+ //| Inputs | //+--------------------------------------------------------------------------------+ input double LotSize = 0.01; input double RR = 1.3; input int MaxTradesPerDay = 3; input bool TradeLong = true; //--- Enable long trades (SweepLow) input bool TradeShort = false; //--- Enable short trades (SweepHigh) - disabled by default for better performance input double MinBodyPercent = 0.6; //--- Minimum body percent for strong displacement input double MinRangePoints = 0.0; //--- Minimum candle range in points to filter small ranges (0 to disable) //--- XM GMT+2 sessions input int AsiaStart = 0; input int AsiaEnd = 7; input int LondonStart = 9; input int LondonEnd = 12; input int NYStart = 15; input int NYEnd = 18;
永続的なグローバル状態変数
これらのグローバル変数は、ティックをまたいでEAの状態を保持するためのものであり、データベースを使用することなく、ゴールド市場におけるセッションごとの市場心理を追跡するうえで重要な役割を果たします。asiaHigh=0およびasiaLow=0は初期状態では未設定となっており、その後、アジア市場で記録された高値と安値に更新されます。これらは、出来高の少ない時間帯に個人トレーダーのストップ注文が集中しやすい心理的なサポート・レジスタンス水準を表しており、機関投資家による流動性取得の対象となりやすい価格帯でもあります。例外的なケースとして、アジア市場でほとんど値動きがなく、高値と安値が同じになる場合があります。このような場合、有効なレンジが形成されないためトレードが無効になる可能性がありますが、このEAではasiaRangeReadyフラグが高値・安値ともに0より大きいことを条件としているため、そのような無効なレンジは自動的に除外されます。
asiaRangeReady=falseは、アジア市場終了後までトレードを開始しないための制御フラグです。心理的な観点では、流動性取得が、事前に形成された流動性プールを基準として発生していることを確認する役割を果たします。tradesToday=0およびcurrentDay=0は、1日のトレード回数を管理し、日付が変わるたびにリセットするために使用されます。これは、利益が続いた後の過信を抑え、ゴールド市場で発生しやすい連続的な相場展開において大きな損失を防ぐという心理的な目的も持っています。例外的には、VPSの再起動などによるサーバー時刻の急な変化によって日付変更を正しく検出できない可能性がありますが、TimeCurrent()を使用しているため、そのような問題が発生する可能性は比較的低く抑えられています。
Price[]配列には、直近のMqlRates構造体(始値、高値、安値、終値、時刻、出来高)が格納されます。この配列はシリーズ形式として設定されているため、インデックスによる参照を直感的におこなうことができます。心理的な観点では、この配列により流動性取得を高精度に検出できるようになります。例えば、レンジの上下にヒゲを伸ばして市場参加者のFOMO(取り残されることへの恐怖)を誘発した後に反転するような、市場参加者の群集心理を利用した「意図的に作られた値動き」を捉えることが可能になります。必要最小限のグローバル変数だけを使用することで処理速度も向上し、ティック数の多いゴールド市場においても高速に動作します。例外的なケースとしては、非常に長い価格履歴による配列のオーバーフローや、通信切断による価格データの欠落が考えられます。しかし、このEAでは直近5本のローソク足のみを対象としており、さらにCopyRates()の戻り値を確認することで、そのような問題にも対応しています。
double asiaHigh =0.0; double asiaLow =0.0; bool asiaRangeReady =false; int tradesToday =0; int currentDay =0; MqlRates Price[];
OnInit:EAの初期化ルーチン(1回限り)
この関数は、EAをチャートへ適用したとき、または再コンパイル時に実行され、ゴールドのスキャルピングに必要な基本設定を初期化します。ArraySetAsSeries(Price,true);は、Price配列を時系列データとして設定し、インデックス0が最新バーとなるようにします。これはMQL4で一般的な設定であり、バーの分析を容易にするとともに、最新データを先頭に扱うというトレーダーの感覚にも合致しています。例外的なケースとして、この関数を配列以外の変数に適用すると失敗します。また、MQL5へ移行する際には、配列の用途によってはArraySetAsSeries(false)を使用する必要がある場合があります。
INIT_SUCCEEDEDを返すことで、EAの初期化が正常に完了し、実行可能な状態であることを示します。迅速に初期化が完了することで、価格変動の激しいゴールド市場でも安心してEAを利用できます。この初期化処理は最小限に抑えられており、実行時の処理へリソースを集中させる設計となっています。ただし、入力値の検証はおこなっていないため、ユーザーは対象銘柄がXAUUSDであり、時間足がM5やM15などスキャルピングに適した設定になっていることを事前に確認する必要があります。
//+-------------------------------------------------------------------------------+ //| Expert Initialization function | //+-------------------------------------------------------------------------------+ int OnInit() { ArraySetAsSeries(Price,true); return(INIT_SUCCEEDED); }
OnTick:メインロジックループ(価格ティックごとに実行)
OnTickは価格ティックが発生するたびに実行されますが、「if(!IsNewBar()) return;」によって新しいバーが形成された場合のみ処理を続行します。これにより、ゴールド市場のように1分間に数千件のティックが発生する環境でも、バー単位で効率的に処理をおこないます。心理的な観点では、未確定のローソク足ではなく確定したローソク足に基づいて判断する裁量トレードの考え方に沿った設計となっています。処理の流れとしては、まず時刻構造体を取得して.dayや.hourへアクセスし、必要に応じて日次情報をリセットします。その後、直近5本のローソク足を取得します。なお、新しいチャートなどで5本未満しか取得できない場合は処理をスキップし、データが揃うと自動的に正常な動作へ戻ります。
続いてアジアレンジを構築し、その後いくつかの条件を確認します。アジアレンジがまだ準備できていない場合は、流動性の基準がないため処理をおこないません。対象セッション外であれば、出来高の少ない時間帯でのトレードを避けます。また、すでにポジションを保有している場合は、新たにエントリーせず、一度に一つのトレードに集中してリスクを管理します。さらに、その日の最大トレード回数に達している場合も、新規エントリーはおこないません。これらの条件をすべて満たした場合にのみ、エントリー条件を確認します。例外的なケースとして、ティック数が非常に多い場合でも、これらのガード条件によってCPU負荷は最小限に抑えられます。また、ブローカーのメンテナンスなどによる時刻のずれについても、TimeCurrent()を使用することで対応しています。このような段階的なロジックにより、ゴールド市場で見られる市場操作を伴う値動きの中でも、十分な根拠があるトレード機会だけを待つ、忍耐強いトレード判断を実現しています。
//+----------------------------------------------------------------------------------------+ //| OnTick | //+----------------------------------------------------------------------------------------+ void OnTick() { if(!IsNewBar()) return; MqlDateTime t; TimeToStruct(TimeCurrent(),t); ResetDaily(t); if(CopyRates(_Symbol,_Period,0,5,Price)<5) return; BuildAsiaRange(t); if(!asiaRangeReady) return; if(!InTradingSession(t)) return; if(PositionSelect(_Symbol)) return; if(tradesToday >= MaxTradesPerDay) return; CheckForSweepEntry(); }
ResetDaily:新しい取引日の初期化
この関数は、t.dayと保存されている日付を比較し、新しい取引日であると判断された場合に、すべての関連変数をリセットします。心理的な観点では、各取引日を独立したものとして扱うことで、ゴールド市場で方向感の乏しいオーバーナイト相場の影響を翌日に持ち越す「直近バイアス」を抑えることを目的としています。例外的なケースとして、月末や年末の切り替わりがありますが、.dayによる判定によって適切に処理されます。また、VPSの時刻のずれについては、ブローカーのサーバー時刻に依存しています。これにより、毎日新たなアジアレンジを基準とした、その日の流動性のシナリオに基づいてトレードを開始できるようになります。
//+----------------------------------------------------------------------------------+ //| Reset daily values when the day changes | //+----------------------------------------------------------------------------------+ void ResetDaily(MqlDateTime &t) { if(t.day != currentDay) { currentDay = t.day; tradesToday = 0.0; asiaHigh = 0.0; asiaLow = 0.0; asiaRangeReady = false; } }
BuildAsiaRange:基準となる流動性ゾーンの構築
アジア市場の時間帯では、確定したローソク足(Price[1])を基に高値と安値を更新し、セッション中の高値・安値を蓄積していきます。心理的な観点では、これは後の流動性取得の対象となる「罠」としてレンジが形成される、静かな時間帯を捉えることを目的としています。アジア市場終了後、高値と安値が正常に設定されていれば、レンジの準備が完了したことを示すフラグが有効になります。例外的なケースとして、値動きがほとんどなく高値・安値が更新されない場合は、レンジが構築されず、準備完了フラグも有効になりません。また、価格ギャップによって一部のバーが欠落した場合でも、取得可能なデータを使用してレンジを構築します。この処理により、活発な市場時間帯で利用される、保ち合い相場の市場心理を捉えることができます。
void BuildAsiaRange(MqlDateTime & t)
{
if(t.hour >= AsiaStart && t.hour <= AsiaEnd)
{
if(asiaHigh == 0 || Price[1].high > asiaHigh)
asiaHigh = Price[1].high;
if(asiaLow == 0 || Price[1].low < asiaLow)
asiaLow = Price[1].low;
}
if(t.hour > AsiaEnd && asiaHigh > 0 && asiaLow > 0)
asiaRangeReady = true;
} InTradingSession:取引時間帯のフィルター
この関数は、現在の時刻がロンドン市場またはニューヨーク市場の時間帯であるかを確認し、流動性の高い時間帯のみでトレードをおこなうよう制限します。心理的な観点では、流動性取得は出来高が多い時間帯に発生しやすく、レンジ相場になりやすいアジア市場でのトレードを避けることを目的としています。例外的なケースとして、8時のようなセッションの切り替わり時間は取引対象外となります。また、DSTの変更がある場合は、ユーザーが時間設定を手動で調整する必要があります。この時間帯フィルターは、機関投資家の資金流入によって反転が発生しやすいという市場心理に基づいて設計されています。
bool InTradingSession(MqlDateTime & t) { if((t.hour >= LondonStart && t.hour <= LondonEnd) || (t.hour >= NYStart && t.hour <= NYEnd)) return (true); return (false); }
CheckForSweepEntry:シグナル検出と注文実行の中核
この関数では、まず直前のローソク足について、実体と値幅の比率を計算します。値幅が0の場合(例:価格がまったく動かなかったティック)は処理せず、小さすぎる値幅のローソク足も除外します。心理的な観点では、市場ノイズを避けることが目的です。また、実体の割合を確認することで、長いヒゲではなく、強い終値による方向性の確信を持ったローソク足のみを対象とします。
売りシグナルでは、ローソク足のヒゲがアジアレンジの高値を上抜けたにもかかわらず、終値がその高値より下で確定した場合を条件とします。心理的には、これは強気トレーダーを誘い込むダマシのブレイクアウトであり、その後に機関投資家が価格を反転させる状況を表しています。ローソク足の50%付近でエントリーし、これは押し戻しを利用することを目的としています。ストップロスは高値の上に配置し、テイクプロフィットは設定したリスクリワード比率(RR)に基づいて決定されます。例外的なケースとして、終値が高値と同じでヒゲが存在しない場合はシグナルは無効となります。また、TradeShortが無効になっている場合は、売りシグナルは実行されません。
買いシグナルはこれと対称的な条件で、アジアレンジの安値を下抜けた後に価格が回復するパターンを利用します。売りシグナル成立後にreturnすることで、同一バーで買い条件まで評価しないようにしています心理的には、弱気トレーダーを誘い込む下方向へのダマシからの反転を狙っています。また、売りシグナルを検出した後は関数を終了するため、まれに両方のシグナルが同時に成立することを防いでいます。例外的なケースとして、ニュースなどによる価格ギャップによって無効な終値が形成される場合がありますが、バー単位で処理することでその影響を軽減しています。また、RRの調整により、平均回帰トレードにおいて非対称なリターンを確保します。
//+-----------------------------------------------------------------------------------------------+ //| Checks conditions for liquidity sweep entries | //+-----------------------------------------------------------------------------------------------+ void CheckForSweepEntry() { double body = MathAbs(Price[1].close - Price[1].open); double range = Price[1].high - Price[1].low; if(range == 0 || (MinRangePoints > 0 && range < MinRangePoints * _Point)) return; double bodyPercent = body / range; if(bodyPercent < MinBodyPercent) return; //---Bearish Liquidity Sweep (Short Setup) | if(Price[1].high > asiaHigh && Price[1].close < asiaHigh && TradeShort) { double entry = (Price[1].high + Price[1].low)/2.0; double sl = Price[1].high; double risk = sl - entry; double tp = entry - (risk * RR); if(trade.Sell(LotSize,_Symbol,entry,sl,tp,"SweepShort")) { tradesToday++; return; //--- avoid checking long on same bar } } //--- Bullish Liquidity Sweep (Long Setup) | if(Price[1].low < asiaLow && Price[1].close > asiaLow && TradeLong) { double entry = (Price[1].high + Price[1].low)/2.0; double sl = Price[1].low; double risk = entry - sl; double tp = entry + (risk * RR); if(trade.Buy(LotSize,_Symbol,entry,sl,tp,"SweepLong")) tradesToday++; } }
IsNewBar:新しいローソク足の検出
static lastBarを保持し、現在のバーを取得して時間を比較することで、新しいローソク足が形成されたかを確認します。心理的な観点では、これは確定したデータのみを使用することを保証し、未確定バー内で発生する市場心理の錯覚を避ける役割を果たします。例外的なケースとして、データ取得の遅延によって誤って新しいバーではないと判断される場合がありますが、次のティックで正しく修正されます。また、週末明けの開始時には大きな時間差が発生するため、新しいバーとして検出されます。これは、ゴールドのようなボラティリティの高い市場で一般的に使用される標準的な処理です。
bool IsNewBar() { static datetime lastBar=0; MqlRates tmp[]; ArraySetAsSeries(tmp,true); if(CopyRates(_Symbol,_Period,0,1,tmp)!= 1) return (false); if(tmp[0].time != lastBar) { lastBar = tmp[0].time; return (true); } return (false); }
戦略テスト
PDアレイEAの戦略テスト
この戦略は、その中核となるロジック、ゴールド特有の速い値動きへの素早い適応性、急激な価格スイング、トレンドフォロー、そしてシナリオ追従により、主にゴールドで最も効果を発揮します。このEAは、トレードセットアップの判断にインバランスとPDアレイの概念を使用しており、高いボラティリティは、多くのトレード戦略にとって有益かつ重要な要素となります。この戦略は、2025年1月1日から2026年2月15日まで、60分足(H1)の時間足でGOLDを取引する条件でテストします。以下に、この戦略で使用するパラメータを示します。
GOLD


ストラテジーテスターの結果
ストラテジーテスターで検証をおこなった結果、このEAがどのように機能し、市場をどのように分析し、どのようなパフォーマンスを示すかが明らかになりました。
PDアレイEAの戦略テスター結果
残高/エクイティグラフ
GOLD

バックテスト結果:
GOLD 
まとめ
この記事では、トレンドフォロー、PDアレイの発見、判断、評価、そして検出されたトレードセットアップを活用・最適化することに特化したMetaTrader 5 EAについて説明しました。また、このEAにはトレード管理およびリスク管理の手法も組み込まれており、GOLDにおける高確率なトレードセットアップを識別・実行しながら、リスク、エクスポージャー、人為的ミスを体系的に低減し、同じトレードおよびリスク管理プロトコルを使用して可能な決済ポイントも判断します。
このEAは、非常にシンプルでありながら強力なEAの一つであり、トレンド、インバランスの概念、そしてPDアレイを利用して、可能性のあるトレードエントリーやトレンド転換を捉えます。堅牢で柔軟性の高いリスク・取引管理ロジックにより、ドローダウンや取引の損失を最小化しながら、EAが最適なパフォーマンスを発揮できるよう設計されています。
このEAをGOLDでテストした結果、どの時間足においても可能性のあるトレードエントリーを効率的かつ適切に検出する能力が確認されました。しかし、トレードエントリーポイントの検出は方程式の一部分にすぎません。なぜなら、このEAには、特定の条件が満たされた場合のみエントリーを実行する、最適化されたエントリー検証戦略がコアロジックとして組み込まれているためです。取引が検証されて実行されると、取引およびリスク管理ロジックが即座に適用され、決済時まで適切な管理がおこなわれます。
このEA戦略を実装するには、下記の入力パラメータを設定することで望ましい結果を得られます。このEAは、トレーダーが選択した時間足(M15からD1まで)において、PDアレイ、インバランス、そして可能性のあるトレードエントリーをスキャンするよう設計されています。また、検出されたエントリーポイントがトレンド、移動平均線、そしてトレーリングストップロスに使用されるATRと整合することを確認します。興味のあるトレーダーは、まずデモ口座でこのEAをGOLDに対してバックテストすることを推奨します。このEAはGOLD向けに最適化されていますが、GBPUSD、EURUSD、GBPJPYにも適用可能です。
このEAの主な目的と目標は、それぞれのPDアレイ内に存在するインバランスのみを利用したトレード、シナリオに沿ったトレード、高度なトレードロジックによる高確率なセットアップを、トレーダーが選択した任意の時間足で最適化することでした。さらに、実装されたトレーリングストップを含むリスク管理機能も組み込んでいます。
トレーダーの皆様には、自身の目標、取引対象資産、またはリスク許容度に応じて設定や入力パラメータを調整するため、定期的にパフォーマンスログや指標を確認することを推奨します。免責条項:このEAを使用するすべての方は、まずデモ口座でテストをおこない、このインバランスおよびPDアレイの概念、そしてこのトレード手法を十分に習得し、安定した利益を得られることを確認してから、実資金での取引を開始してください。
結論
この記事では、トレーダーが直面する主な課題である、現在展開されているシナリオ、PDアレイ、インバランス、トレードエントリーを正しく判断すること、リスク管理、トレード管理、そしてドローダウンの回避について取り上げています。そして、これらのプロセスを簡略化し統合するEAをどのように設計し、高確率なトレードのみを実行することで利益を上げる可能性を高めるかについて説明しています。さらにこの記事では、価格のインバランス内に存在する正しいPDアレイを使用してトレードをおこない、現在展開されているシナリオに従い、逆張りとなるトレードアイデアやセットアップを無視することが、どれほどこのプロセスに大きく役立つかについて詳しく説明しています。
多くのトレーダーは、インバランスやPDアレイの概念をトレードで効果的に使用する方法を明確に理解していません。しかし、これらの概念は、適切なリスク管理およびトレード管理と組み合わせることで、トレードパフォーマンスに大きなプラスの影響を与える可能性があります。そして、それは平均的なトレーダーと非常に優れたトレーダーを分ける、非常に大きなゲームチェンジャーとなります。本記事で提案するEAは、規律を維持する支援をおこない、トレーダーが自分の取引アイデアやポジションサイズ、セットアップを検証できるようにします。EAのエントリを直接使用しなくても、管理と検証が可能です。
自動化されたMQL5 EAは以下を提供します。
- 取引対象資産の現在のPDアレイ内に存在するインバランスから発生するセットアップによる高確率トレード
- ニュース時のボラティリティから保護するため、ニュース前後の取引をブロック
- 確認済みシグナルと検証済みエントリーロジックに基づくエントリー、および動的なストップロス(SL)とテイクプロフィット(TP)
- 適応型リスク管理(連敗時のロット削減、連勝時のロット増加)
- 記録管理および継続的な戦略最適化のための結果ログ
- まず現在展開されているシナリオを特定し、さらに価格が現在のPDアレイ内のどこに位置しているかを判断してから、インバランスを探すという厳格な遵守
- 感情的な意思決定、衝動的なトレード、リスクの高いトレード習慣の排除
- 自動取引管理(SL、TP、部分決済)
これらの機能を組み合わせることで、高確率のトレードを一貫して実行し、最適なリスク管理を実現できます。その結果、収益性の高いトレードをおこなえる可能性が向上し、トレーダーのパフォーマンス改善につながります。
記事で参照されているすべてのコードは以下に添付されています。次の表では、この記事に付随するすべてのソースコードファイルについて説明します。
| ファイル名 | 説明 |
|---|---|
| PD Arrays EA.mq5 | PD配列EAの完全なソースコードを含むファイル |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/21246
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
ラリー・ウィリアムズの『市場の秘密』(第14回):カスタムインジケータで隠れスマッシュデー反転を検出する
KnitPkgを用いたMQL5向けパッケージベース開発手法
MQL5取引ツール(第23回):カメラ制御対応DirectX 3Dグラフによる二項分布分析
MQL5取引ツール(第22回):二項分布のヒストグラムと確率質量関数(PMF)の描画
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索