English Русский
preview
初心者からエキスパートへ:予測価格経路

初心者からエキスパートへ:予測価格経路

MetaTrader 5 |
27 1
Clemence Benjamin
Clemence Benjamin

内容



はじめに

すべてのトレーダーが経験する、あの苛立たしいパターンがあります。力強いインパルスの動きを見ているうちに、恐怖や迷いが生じて躊躇し、ようやく参入した瞬間に相場の勢いが尽き、すぐに逆行してしまうというものです。この「追いかけて反転する」サイクルは、取引における最も一般的で高コストなミスのひとつです。取り残されることへの恐怖(FOMO)に始まり、高値掴みや安値売りの痛みで終わる感情の揺さぶりは、口座残高だけでなく自信までも損ないます。

しかし、この受動的なパターンを能動的な戦略へと変えられたらどうでしょうか。価格を追いかけるのではなく、価格が一時停止し、反転し、あるいは継続しやすい場所を事前に想定できたらどうでしょうか。ここで登場するのが、古代の数学原理であるフィボナッチと、現代のアルゴリズム執行です。市場は直線的には動かず、前進と調整を繰り返すリズムを持っています。一貫した取引の鍵は、すべての動きを予測することではなく、自然な市場リズムが意味のある反応を生みやすい高確率ゾーンを見極めることにあります。

フィボナッチフレームワーク 

13世紀のレオナルド・フィボナッチによる数列は、貝殻の螺旋や銀河の構造など、自然界に見られる成長パターンを表しているため、時代を超えて有効性を保ってきました。金融市場においても、38.2%、50%、61.8%といった比率が、価格の戻り局面で意識される水準として繰り返し現れます。ただし、多くのトレーダーはフィボナッチを受動的に使い、チャートに静的なラインを引いて価格が近づくのを待つだけです。

本記事でのブレークスルーは、これらの受動的な参照点を能動的な予測経路へと変換する点にあります。価格が反転するかもしれない場所を示すだけでなく、想定されるリトレースメントのエントリーから、将来のエクステンション目標まで、取引全体の道筋を可視化するEAを構築します。これにより、フィボナッチは単なる描画ツールから、市場の動きを事前に想定する動的な取引システムへと進化します。

フィボナッチ予測経路の概念

予測経路の概念

予測価格経路を理解する

このEAが従来のフィボナッチツールと根本的に異なるのは、分析、執行、可視化を統合した点です。単にチャンスを特定するだけではなく、規律をもって実際に執行し、その背後にあるロジックを明確な視覚的経路として示すシステムを構築しています。

まず、このEAは重要なスイングポイントを自動で検出し、フィボナッチリトレースメントレベルをリアルタイムで計算します。手動でラインを引いたり、主観的に解釈したりする必要はありません。アルゴリズムはカスタマイズ可能なパラメータに基づいて、最も重要な高値と安値を特定し、さまざまな市場環境や時間軸において一貫性を保ちます。

次に、これらの数学的レベルを実際に使える取引判断へと変換します。EAは、あらかじめ定義されたフィボナッチゾーンに指値注文を配置し、特に強力な61.8%の黄金比に重点を置きます。リスク管理もあらかじめ組み込まれており、ストップロスと利益目標はフィボナッチの幾何構造から直接導き出されます。その結果、自然にバランスの取れたリスクリワード構造が形成されます。

そして3つ目、最も革新的なのが、想定される価格の動きを視覚的に示す予測経路の描画です。これは静的なラインではありません。エントリーまでの想定される押し戻しの動きと、目標までの想定エクステンションの動きを、動的な矢印や経路として表現します。この可視化によって、抽象的な数学概念が具体的な取引計画へと変わります。

エントリーシグナルを超えた統合型リスク管理

この手法の本当の洗練性は、取引全体のライフサイクルにわたってフィボナッチ原理を一貫して統合している点にあります。多くの取引システムはエントリーに重点を置き、リスク管理を後回しにしがちですが、このEAでは取引のあらゆる要素がフィボナッチの枠組みに基づいています。

ポジションサイズは任意のロット数ではなく、フィボナッチレベル間の距離に基づいて数学的に決定されます。ストップロスの位置は、そもそもエントリーを定義した市場構造から自然に導かれます。テイクプロフィットは、初期スイングの大きさに基づく100%、127.2%、161.8%といったフィボナッチエクステンションを参照し、論理的な利益目標として設定されます。

このシステムは確実性を約束するものではありません。どの手法にも絶対はありません。その代わりに、感情的な意思決定を体系的に排除できる、一貫性があり検証可能な枠組みを提供します。すべての値動きを追いかけるのではなく、反応が起こりやすいゾーンに集中することで、プロとアマチュアを分ける忍耐力と規律を身につけることができます。

市場の隠れた構造を見る

このプロジェクトの中でも、とりわけ変革的なのが教育的な側面です。経験の浅いトレーダーにとって、フィボナッチリトレースメントは実際の値動きと結びつかない抽象的な数学概念に感じられることがあります。予測経路の可視化は、このギャップを埋め、市場の内部構造を直感的に理解できるようにします。

スイング高値から61.8%のリトレースメントレベルへと弧を描く緑の破線、その先に100%の投影目標へ伸びる金色の点線を見たとき、それは単なるチャート上の線ではありません。具体的な取引仮説を目にしているのです。数学的比率が、どのようにして起こりやすい価格の動きへと変換されるのかが分かります。なぜその水準でエントリーし、次にどこまで価格が進むと想定しているのかが明確になります。

この可視化は、EAの自動執行と組み合わさることで、さらに強力になります。予測されたパスウェイに沿って取引が展開していく様子を観察することで、トレーダーは経験を通じてフィボナッチ原理を直感的に理解していきます。抽象的な概念は具体化され、理論は実践へと変わり、数式的な比率は取引における直感へと昇華されます。

完全な統合としての数学、執行、心理

ここで構築しているものは、3つの重要な取引要素の理想的な融合です。フィボナッチ分析の数学的厳密さ、アルゴリズム取引による規律ある執行、そして視覚的学習によって育まれる直感的理解です。これは単なるEAではなく、実行可能なコードとしてまとめられた包括的な取引教育そのものです。

数学は基盤を提供し、長年トレーダーを導いてきた比率を支えます。アルゴリズムによる執行は規律を提供し、感情の介入を排除して戦略を一貫して適用します。可視化は理解を提供し、複雑な概念を明確で実践的な洞察へと変換します。

コードを一緒に追っていく中で、それぞれの要素がどのように自然に統合されているかが分かるでしょう。スイング検出アルゴリズムが意味のある市場構造をどのように特定するのか、フィボナッチ計算が価格データをどのように取引水準へ変換するのか、リスク管理の仕組みがどのように資本を守るのか、そして可視化技術がそれらすべてを即座に理解できる形にする様子を確認していきます。


実装

1. 基礎の構築:必須インクルードと入力パラメータ

取引ロジックに入る前に、まず基礎を固めます。ここで3つの重要なMQL5ライブラリをインクルードしている点に注目してください。これは偶然の選択ではありません。Tradeライブラリはプロフェッショナルな注文執行機能を提供し、OrderInfoは既存ポジションの管理を可能にし、AccountInfoは口座の過剰なリスクを防ぐ役割を果たします。この三本柱の構成こそが、アマチュア的なEAとプロフェッショナルなEAを分けるポイントです。

次に入力パラメータを見てみましょう。単に思いつきでフィボナッチレベルを並べているわけではありません。エントリーには61.8%の黄金比、ターゲットには100%エクステンションを採用していますが、これは機関投資家が最も注意深く見ている水準だからです。MaxBarsBackパラメータは効率を制御するためのものです。バー数が少なすぎれば重要なスイングを見逃し、多すぎればもはや意味のない過去データまで分析してしまいます。

実装における重要なポイント

  • #includeディレクティブは必ず最初に記述します。これはEAにとってのツールボックスそのものです。
  • input groupを使うことで、プロパティウィンドウ内のパラメータを論理的に整理できます。
  • 61.8%レベルであるTradingRetracementLevelは数学的に重要な意味を持ち、黄金比1.618の逆数にあたります。
  • MagicNumberは適当に決めるものではなく、EAが発注した注文を管理やレポートで正確に識別するための一意な識別子です。
  • EnableTradingはテスト中や市場が混乱している状況で、即座に取引を止めるための非常停止スイッチとして機能します。

//--- Includes: Essential MQL5 libraries for trading functionality
#include <Trade\Trade.mqh>       // Standard trade execution library
#include <Trade\OrderInfo.mqh>   // Order information and management
#include <Trade\AccountInfo.mqh> // Account information and margin checks

//+------------------------------------------------------------------+
//| Input Parameters: Configurable trading and visualization settings|
//+------------------------------------------------------------------+

input group "===================== FIBONACCI SETTINGS ====================="
input double   TradingRetracementLevel = 0.618;  // Primary retracement level for trade execution (61.8% - Golden Ratio)
input double   ProfitTargetLevel = 1.000;        // Profit target as Fibonacci extension (100% - Full swing retracement)
input int      MaxBarsBack = 100;                // Maximum historical bars for swing analysis (balance between accuracy and performance)

input group "===================== TRADING SETTINGS ====================="
input double   LotSize = 0.1;                    // Position size in lots (adjust based on account size and risk tolerance)
input int      StopLossPips = 30;                // Stop loss distance in pips (1 pip = 10 points in 5-digit brokers)
input int      MagicNumber = 12345;              // Unique identifier for EA orders (prevents interference with manual trades)
input bool     EnableTrading = true;             // Master switch for trade execution (set false for visualization only)

input group "===================== VISUALIZATION SETTINGS ====================="
input color    BuyColor = clrBlue;               // Visual color for buy trade pathways
input color    SellColor = clrRed;               // Visual color for sell trade pathways  
input color    PredictionColor = clrGreen;       // Color for predictive retracement pathways
input color    TargetColor = clrGold;            // Color for profit target pathways and markers
input int      ArrowSize = 3;                    // Size of directional arrows on chart (1-5 recommended)

2. 市場の記憶:重要なスイングポイントを記憶するグローバル変数

市場には記憶があります。そしてEAにも記憶が必要です。ここで宣言するグローバル変数は、このEAの頭脳に相当します。重要な高値と安値がどこで発生したのか、それがいつ起きたのか、そして現在の市場がどの方向に向かっているのかを保持します。価格レベルだけでなくタイムスタンプも保存している点に注目してください。市場構造は価格だけで決まるものではなく、時間と価格の関係によって成り立っているからです。

特にtrendDirectionというブール変数は巧妙な役割を果たします。これは単に直近の値動きを見るのではなく、どちらのスイングがより新しいかを分析します。スイングハイがスイングローより後に発生していれば上昇トレンドと判断します。このように時間軸を考慮することで、短期的なノイズに惑わされてトレンドを誤認するというよくある失敗を防ぐことができます。

変数の設計

  • swingHighとswingLowには市場の重要な転換点となった実際の価格が保存されます。
  • swingHighTimeとswingLowTimeはそれぞれのスイングが発生した時刻を記録し、これはトレンド分析において非常に重要です。
  • swingHighIndexとswingLowIndexはバー番号を保持し、時間的な前後関係を比較するために使用されます。
  • trendDirectionはこの時間情報を用いた論理に基づいており、高値が安値より後に形成されていれば上昇トレンドであると判断します。
  • CTradeやCOrderInfoやCAccountInfoといった取引関連オブジェクトは、複雑な処理をシンプルなインターフェースにまとめています。

多くのEAが失敗する理由は、トレンドの文脈を正しく定義できていない点にあります。価格データと時間データの両方を保存することで、単なる直近の値動きへの反応ではなく、本物の上昇トレンドであるのか、それとも下降トレンドであるのかを見極めることが可能になります。

//+------------------------------------------------------------------+
//| Global Variables: Critical data persistence between ticks        |
//+------------------------------------------------------------------+

//--- Swing Point Analysis: Stores key market structure points
double         swingHigh;                         // Most recent significant swing high price
double         swingLow;                          // Most recent significant swing low price
datetime       swingHighTime;                     // Timestamp of swing high for temporal analysis
datetime       swingLowTime;                      // Timestamp of swing low for temporal analysis
int            swingHighIndex;                    // Bar index of swing high for reference
int            swingLowIndex;                     // Bar index of swing low for reference
bool           trendDirection;                    // Current market trend: true=bullish, false=bearish

//--- Trading Objects: MQL5 class instances for professional trade execution
CTrade         Trade;                             // Main trade execution engine with built-in error handling
COrderInfo     OrderInfo;                         // Order inspection and management utilities
CAccountInfo   AccountInfo;                       // Account status and margin requirement checks

3. 初期化:堅牢な取引基盤の構築

EAが最初に読み込まれるとき、まず運用上の境界条件を確立する必要があります。OnInit関数は、そのための「交戦ルール」を設定する場所です。ここで最初にMagicNumberを割り当てている点に注目してください。これは非常に重要です。MagicNumberはEAに固有の身分証明書のようなもので、手動取引や他のEAの注文と干渉しないようにするために欠かせません。

ここでおこなっている入力値の検証は、単なる形式的なプログラミングではありません。これは数理的な破綻を防ぐための最初の防衛線です。リトレースメントレベルが0や1であればフィボナッチの理論そのものが成立しませんし、利益目標が1未満であれば、理論上必ず損失になる取引を意味します。市場を分析する以前に、このような数理的整合性を確保している点が重要です。

初期化の流れは次のようになります。

  1. マジックナンバーの設定:Trade.SetExpertMagicNumber(MagicNumber)はEAに指紋を与えるようなものです。EAが自分自身の注文のみを管理し、手動取引や他のEAに干渉しないことを保証します。
  2. ブローカー設定:Trade.SetMarginMode()およびTrade.SetTypeFillingBySymbol(_Symbol)によって、使用しているブローカー固有のルールに適応します。ブローカーごとに証拠金計算や注文の約定方式は異なります。
  3. 数学的検証:TradingRetracementLevelが0より大きく1より小さい範囲にあるかを確認します。0%や100%のリトレースメントはフィボナッチの文脈では数学的に意味を持たないためです。
  4. 利益目標の検証:ProfitTargetLevelは1.0以上でなければなりません。これはスイング範囲を超えたフィボナッチエクステンションを使用しているためです。
  5. 初期市場分析:FindSwingPoints()によって、起動直後に現在の市場構造を確立します。

多くの開発者は、このような初期化処理を軽視しがちですが、その結果として後になって原因不明のエラーに悩まされます。すべてを最初に検証し、整えておくことで、実行中のエラーを防ぎ、一貫した挙動を保証することができるのです。

//+------------------------------------------------------------------+
//| Expert Initialization Function: Called once on EA startup        |
//|                                                                  |
//| Purpose: Validates inputs, initializes trading engine, and       |
//|         performs initial market analysis for immediate readiness |
//+------------------------------------------------------------------+
int OnInit()
{
    //--- Trading Engine Initialization: Configure for reliable execution
    Trade.SetExpertMagicNumber(MagicNumber);      // Isolate EA orders using magic number
    Trade.SetMarginMode();                        // Apply symbol-specific margin calculations
    Trade.SetTypeFillingBySymbol(_Symbol);        // Use symbol-appropriate order filling rules
    
    //--- Input Validation: Ensure mathematical integrity of Fibonacci levels
    if(TradingRetracementLevel <= 0 || TradingRetracementLevel >= 1)
    {
        Alert("Error: Trading retracement level must be between 0 and 1 (exclusive)");
        return INIT_PARAMETERS_INCORRECT;         // Critical: Prevent operation with invalid parameters
    }
    
    if(ProfitTargetLevel < 1)
    {
        Alert("Error: Profit target level must be ≥ 1.0 (Fibonacci extension)");
        return INIT_PARAMETERS_INCORRECT;         // Critical: Ensure profitable target positioning
    }
    
    //--- Initial Market Analysis: Establish baseline market structure
    FindSwingPoints();                            // Detect immediate swing points for initial setup
    Print("Fibonacci Predictive EA initialized successfully");
    Print("Symbol: ", _Symbol, " | Timeframe: ", EnumToString(_Period));
    Print("Trading Level: ", TradingRetracementLevel, " | Target: ", ProfitTargetLevel);
    
    return INIT_SUCCEEDED;                        // Success: EA is ready for market operation
}

4. ハートビート:市場更新を効率的に処理する

市場は眠ることがありませんが、コンピュータ資源には限りがあります。OnTick関数は、知的な効率性という原則を体現しています。すべてのティックを分析するのではなく(それではシステムに過度な負荷がかかります)、新しいバーが形成されたときだけ処理をおこないます。このアプローチは、市場の時間構造と計算資源の両方を尊重するものです。

ここでの論理的な流れに注目してください。新しいスイングを検出し、古い描画を削除し、新しい経路を計算し、注文を管理します。この一連の処理によって、分析は常に最新に保たれ、チャートは整理され、注文は現在の市場構造を正確に反映します。これは、プロの取引デスクが採用する規律あるワークフローそのものです。

ティック処理ロジックの説明

  1. 新しいバーの検出:IsNewBar()は効率性を保つためのゲートキーパーです。新しいローソク足が確定したときのみtrueを返し、同一バー内での無駄な再計算を防ぎます。
  2. 市場構造の更新:FindSwingPoints()が再度市場を分析し、直近のバーで形成された重要な高値や安値を捕捉します。
  3. 視覚要素の整理:ClearOldObjects()によって、以前の描画を削除してから新しい描画を作成します。これによりチャートの混雑を防ぎ、視認性を維持します。
  4. 経路計算:CalculatePredictivePathway()は中核となる処理で、フィボナッチレベルを計算し、取引方向を判定し、注文準備をおこないます。
  5. 注文管理:ManagePendingOrders()が、市場の変化によって不要になった古い未決注文を整理します。

新しいバーが形成されたときだけ処理をおこなうことで、ティックごとの処理と比較してCPU使用率を90〜95%削減できます。これは、複数のEAを同時に稼働させる場合や、計算負荷の高いインジケーターを使用する場合にとくに重要です。

//+------------------------------------------------------------------+
//| Expert Tick Function: Core processing on each price update       |
//|                                                                  |
//| Purpose: Monitors market conditions, updates analysis on new bars|
//|          manages pending orders, and maintains visual display    |
//+------------------------------------------------------------------+
void OnTick()
{
    //--- New Bar Detection: Process only on new bar formation for efficiency
    if(IsNewBar())
    {
        //--- Market Structure Analysis: Update swing points for current market conditions
        FindSwingPoints();
        
        //--- Visual Management: Clear previous drawings before updating
        ClearOldObjects();
        
        //--- Trading Logic: Calculate and visualize Fibonacci pathways
        CalculatePredictivePathway();
        
        //--- Order Management: Maintain and clean up pending orders
        ManagePendingOrders();
    }
}

5. 市場構造分析:真のスイングポイントを見つける

ここでは、重要な市場の動きとランダムなノイズを区別します。FindSwingPoints関数は、単に高値や安値を探すだけではありません。各バーの両隣2本よりも高い/低いバーという、古典的なスイングポイントの定義を適用します。この方法により、重要性の低い値動きを除外し、有意な市場構造を特定できます。

価格レベルだけでなく、バーのインデックスも追跡している点に注目してください。この二重の追跡によって、時間的にトレンドの方向を判断できます。最新のスイング(インデックスが大きい方)が現在の市場のモメンタムの方向を示します。この時間的分析は、単純な価格比較よりも信頼性が高いです。

スイング検出アルゴリズムの詳細

  1. 初期化:極端な値で開始します。swingHighは0(これを超える値が出る)、swingLowはDBL_MAX(これを下回る値が出る)にします。
  2. 境界計算:MathMin(Bars(_Symbol, _Period), MaxBarsBack)で、存在するバー数や設定した最大バー数以上を分析しないようにします。
  3. スイングハイの論理:バーは、前後2本のバーよりも高くなければなりません。これにより、重要な転換点を捉え、細かい値動きは無視できます。
  4. スイングローの論理:同様に、バーは前後2本のバーよりも低くなければなりません。
  5. トレンド判定:高値が安値よりも後に発生した場合、上昇トレンドと判断します(trendDirection = swingHighIndex > swingLowIndex)。

多くのトレーダーは、現在の価格を移動平均と比較するような単純な方法を使いますが、これは遅れが生じます。私たちのスイングポイント検出は、市場構造の変化をリアルタイムで特定し、より早く信頼できるトレンドシグナルを提供します。

//+------------------------------------------------------------------+
//| Find Swing Points: Identifies significant market highs/lows      |
//|                                                                  |
//| Purpose: Detect the most recent swing high and low points that   |
//|          define the current market structure for Fibonacci       |
//|          calculations. Critical for accurate level placement.    |
//+------------------------------------------------------------------+
void FindSwingPoints()
{
    //--- Initialize tracking variables
    swingHigh = 0;
    swingLow = DBL_MAX;
    swingHighIndex = -1;
    swingLowIndex = -1;
    
    //--- Calculate analysis window: Balance between depth and performance
    int barsToCheck = MathMin(Bars(_Symbol, _Period), MaxBarsBack);
    
    //--- Swing Detection Loop: Analyze each bar in the historical window
    for(int i = 3; i < barsToCheck; i++)
    {
        //--- Swing High Detection: Bar higher than 2 neighbors on each side
        if(IsSwingHigh(i))
        {
            double high = iHigh(_Symbol, _Period, i);
            //--- Update if this is the highest swing found
            if(high > swingHigh || swingHighIndex == -1)
            {
                swingHigh = high;
                swingHighIndex = i;
                swingHighTime = iTime(_Symbol, _Period, i);
            }
        }
        
        //--- Swing Low Detection: Bar lower than 2 neighbors on each side  
        if(IsSwingLow(i))
        {
            double low = iLow(_Symbol, _Period, i);
            //--- Update if this is the lowest swing found
            if(low < swingLow || swingLowIndex == -1)
            {
                swingLow = low;
                swingLowIndex = i;
                swingLowTime = iTime(_Symbol, _Period, i);
            }
        }
    }
    
    //--- Trend Determination: Compare swing timing to establish trend direction
    if(swingHighIndex != -1 && swingLowIndex != -1)
    {
        //--- Bullish Trend: Higher highs and higher lows (swing high occurs after swing low)
        //--- Bearish Trend: Lower highs and lower lows (swing low occurs after swing high)
        trendDirection = swingHighIndex > swingLowIndex;
    }
}

6. コアの革新:予測的フィボナッチ経路の計算

ここで数学が市場心理と出会います。CalculatePredictivePathway関数は、静的なフィボナッチレベルを動的な取引判断に変換します。優雅な対称性に注目してください。上昇トレンドでは調整局面で売り、下降トレンドでは反発局面で買いをおこないます。この直感に反するようなアプローチは、実際には数学的に理にかなっています。大きなトレンドに沿って、逆行の動きでエントリーしているのです。

値幅の計算(swingHigh - swingLow)が、すべてのフィボナッチレベルの測定基準となります。この動的な適応により、EAはボラティリティの高い通貨ペアでも、落ち着いた指数でも同様に機能します。61.8%のリトレースメントと100%のエクステンションは任意の値ではなく、黄金比と完全な測定移動を表し、プロのトレーダーが注視するレベルです。

//+------------------------------------------------------------------+
//| Calculate Predictive Pathway: Core Fibonacci trading logic       |
//|                                                                  |
//| Purpose: Calculate Fibonacci retracement levels, draw predictive |
//|          pathways, and prepare pending orders based on current   |
//|          market structure and trend analysis                     |
//+------------------------------------------------------------------+
void CalculatePredictivePathway()
{
    //--- Validation: Ensure we have valid swing points for analysis
    if(swingHighIndex == -1 || swingLowIndex == -1) 
    {
        Print("Warning: Insufficient swing points for Fibonacci analysis");
        return;
    }
    
    //--- Fibonacci Range Calculation: Basis for all level calculations
    double range = swingHigh - swingLow;
    
    //--- Bull Market Strategy: Sell retracements in uptrend
    if(trendDirection) 
    {
        //--- Calculate 61.8% retracement level (Golden Ratio)
        double entryPrice = swingHigh - (range * TradingRetracementLevel);
        
        //--- Calculate 100% extension target (full swing retracement)
        double targetPrice = entryPrice - (range * ProfitTargetLevel);
        
        //--- Visualize the predictive pathway
        DrawPredictionArrow(swingHighTime, swingHigh, swingLowTime, entryPrice, "Entry");
        DrawTargetArrow(entryPrice, targetPrice, "Target");
        
        //--- Execute trading logic if enabled
        if(EnableTrading)
            PlaceSellPendingOrder(entryPrice, targetPrice, range);
    }
    //--- Bear Market Strategy: Buy retracements in downtrend
    else 
    {
        //--- Calculate 61.8% retracement level (Golden Ratio)
        double entryPrice = swingLow + (range * TradingRetracementLevel);
        
        //--- Calculate 100% extension target (full swing retracement)
        double targetPrice = entryPrice + (range * ProfitTargetLevel);
        
        //--- Visualize the predictive pathway
        DrawPredictionArrow(swingLowTime, swingLow, swingHighTime, entryPrice, "Entry");
        DrawTargetArrow(entryPrice, targetPrice, "Target");
        
        //--- Execute trading logic if enabled
        if(EnableTrading)
            PlaceBuyPendingOrder(entryPrice, targetPrice, range);
    }
    
    //--- Information Display: Show current trade setup on chart
    DrawInfoText();
}

フィボナッチ数学の実践

1. 値幅計算:「swingHigh - swingLow」が価格スイングの全体距離を示します。これがすべてのフィボナッチ計算における100%の基準となります。

2. 上昇トレンドロジック(戻り売り)

  • エントリー:swingHigh - (range * TradingRetracementLevel)、価格が上昇の61.8%を戻すと予想
  • ターゲット:entryPrice - (range * ProfitTargetLevel)、元のスイングと同等の下落を目標

3.下降トレンドロジック(押し目買い)

  • エントリー:swingLow + (range * TradingRetracementLevel)、価格が下降の61.8%を戻すと予想
  • ターゲット:entryPrice + (range * ProfitTargetLevel)、元のスイングと同等の上昇を目標

 このアプローチは、古典的な「トレンドに沿って取引し、戻りでエントリーする」という手法に従っています。上昇トレンドでは戻り売り、下降トレンドでは押し目買いをおこなうことで、大きなトレンド方向に沿いつつ、有利な価格でポジションを取ることができます。

7. 視覚的知能:予測経路の描画

ほとんどのEAはチャートに単に線を引くだけですが、私たちのEAは視覚的なストーリーを提供します。DrawPredictionArrow関数は「価格はここからここまで動き、次にこのレベルまで戻ると予想される」のようなナラティブを作成します。緑の破線は単なる装飾ではなく、市場の挙動に関する視覚的仮説です。

ターゲットの可視化には金色のチェックマークと点線が使用され、異なる視覚言語で「これが利益目標である」と示します。この色分けとスタイリングにより、一目で直感的に理解できます。チャートを見るだけで、どの線が予測で、どの線が目標かをテキストを読まずに判断できます。

//+------------------------------------------------------------------+
//| Draw Prediction Arrow: Visualize retracement pathway to entry    |
//|                                                                  |
//| Purpose: Create visual representation of expected price movement |
//|          to Fibonacci retracement level using arrows and lines   |
//|                                                                  |
//| Parameters:                                                      |
//|   startTime   Starting point timestamp for pathway               |
//|   startPrice  Starting price level for pathway                   |
//|   endTime     Ending point timestamp for pathway                 |
//|   endPrice    Target price level (Fibonacci retracement)         |
//|   name        Unique identifier for chart object management      |
//+------------------------------------------------------------------+
void DrawPredictionArrow(datetime startTime, double startPrice, datetime endTime, double endPrice, string name)
{
    string arrowName = name + "_Arrow";
    string lineName = name + "_Path";
    
    //--- Cleanup: Remove previous objects to prevent duplication
    ObjectDelete(0, arrowName);
    ObjectDelete(0, lineName);
    
    //--- Entry Point Arrow: Mark the Fibonacci retracement level
    if(ObjectCreate(0, arrowName, OBJ_ARROW_BUY, 0, endTime, endPrice))
    {
        ObjectSetInteger(0, arrowName, OBJPROP_COLOR, PredictionColor);
        ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, 241);  // Standard buy arrow
        ObjectSetInteger(0, arrowName, OBJPROP_WIDTH, ArrowSize);
    }
    
    //--- Predictive Pathway Line: Dashed line showing expected retracement
    if(ObjectCreate(0, lineName, OBJ_TREND, 0, startTime, startPrice, endTime, endPrice))
    {
        ObjectSetInteger(0, lineName, OBJPROP_COLOR, PredictionColor);
        ObjectSetInteger(0, lineName, OBJPROP_STYLE, STYLE_DASH); // Dashed for predictions
        ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 1);
        ObjectSetInteger(0, lineName, OBJPROP_RAY, false);       // Finite line segment
    }
}

視覚デザインの原則

1. 予測矢印(緑)

  • OBJ_ARROW_BUY(コード241、標準の買い矢印)を使用します。
  • 緑色は「進め」を示す:ここでエントリーを予想します。
  • 破線は予想される戻り経路を示します。

2. ターゲット矢印(金)

  • OBJ_ARROW_CHECK:チェックマークは完了を意味します。
  • 金色は「報酬」または利益目標を表します。
  • し点線は予測矢印とターゲットを区別します。

3.オブジェクト管理

  • 古いオブジェクトを最初に削除して重複を防ぎます。
  • 各オブジェクトに一意の名前を付けて管理を容易にします。
  • OBJPROP_RAY, falseにより無限線ではなく有限線を作成します。

ユーザー体験の利点:この視覚システムにより、トレーダーはログを読んだり複雑なルールを覚えなくても、EAの現在の市場仮説を瞬時に理解できます。色分けと矢印のスタイルが直感的な視覚言語を生み出します。

8. プロフェッショナルな注文:基本的な取引実行を超えて

注文するのは簡単ですが、賢く注文するのは技術です。私たちの注文関数は単に取引を送信するだけではありません。価格の検証、証拠金チェック、重複検出、論理的検証をおこないます。この多層的アプローチにより、自動取引で最も一般的なミスを防ぎます。

価格の正規化ステップは特に重要です。ブローカーごとに小数精度が異なり、正規化をおこなわないと注文が拒否される場合があります。フォールバック計算により、主要なフィボナッチ計算で疑わしい結果が出ても、論理的なストップロスとテイクプロフィットレベルを確保できます。

//+------------------------------------------------------------------+
//| Place Buy Pending Order: Execute buy limit order with validation |
//|                                                                  |
//| Purpose: Place a buy limit order at Fibonacci retracement level  |
//|          with proper risk management and error handling          |
//|                                                                  |
//| Parameters:                                                      |
//|   entryPrice   Calculated buy entry price (61.8% retracement)    |
//|   targetPrice  Calculated take profit price (100% extension)     |
//|   range        Fibonacci swing range for position sizing context |
//+------------------------------------------------------------------+
void PlaceBuyPendingOrder(double entryPrice, double targetPrice, double range)
{
    //--- Price Validation: Ensure mathematically sound price levels
    if(!IsValidPrice(entryPrice) || !IsValidPrice(targetPrice))
    {
        Print("Order Rejected: Invalid price levels - Entry: ", entryPrice, " Target: ", targetPrice);
        return;
    }
    
    //--- Stop Loss Calculation: Fixed distance below entry
    double sl = entryPrice - (StopLossPips * _Point * 10);
    if(!IsValidPrice(sl)) 
        sl = entryPrice - (100 * _Point); // Fallback to fixed distance
    
    //--- Price Normalization: Align with broker precision requirements
    double normalizedEntry = NormalizeDouble(entryPrice, _Digits);
    double normalizedSL = NormalizeDouble(sl, _Digits);
    double normalizedTP = NormalizeDouble(targetPrice, _Digits);
    
    //--- Order Validation: Ensure logical price relationships
    if(normalizedTP <= normalizedEntry)
    {
        Print("Adjustment: Take profit below entry, using fallback calculation");
        normalizedTP = normalizedEntry + (StopLossPips * 2 * _Point * 10);
    }
    
    if(normalizedSL >= normalizedEntry)
    {
        Print("Adjustment: Stop loss above entry, using fallback calculation");
        normalizedSL = normalizedEntry - (StopLossPips * _Point * 10);
    }
    
    //--- Duplicate Check: Prevent multiple orders at same level
    if(OrderExists(ORDER_TYPE_BUY_LIMIT, normalizedEntry))
    {
        Print("Order Skipped: Duplicate buy order already exists at ", normalizedEntry);
        return;
    }
    
    //--- Margin Check: Ensure sufficient account equity
    if(!CheckMargin(ORDER_TYPE_BUY_LIMIT, LotSize, normalizedEntry))
    {
        Print("Order Rejected: Insufficient margin for buy order");
        return;
    }
    
    //--- Order Execution: Place buy limit order with MQL5 trade class
    if(Trade.BuyLimit(LotSize, normalizedEntry, _Symbol, normalizedSL, normalizedTP, 
                      ORDER_TIME_GTC, 0, "Fib61.8_Buy"))
    {
        Print("SUCCESS: BUY LIMIT order placed at ", normalizedEntry, 
              " | SL: ", normalizedSL, " | TP: ", normalizedTP);
    }
    else
    {
        Print("FAILED: Buy order placement error - ", Trade.ResultRetcodeDescription());
    }
}

注文時の安全チェックリスト

  1. 価格検証:IsValidPrice()で計算された価格が妥当な範囲内かを確認します。
  2. ストップロス計算:エントリーから固定ピップ距離で設定し、フォールバックオプションも用意しています。
  3. 価格正規化:NormalizeDouble()でブローカーの精度要件に合わせます。
  4. 論理検証:買いの場合はTP > エントリー、売りの場合はTP < エントリーになることを確認します。
  5. 重複防止:OrderExists()で同一の未約定注文がないかチェックします。
  6. 証拠金確認:CheckMargin()で口座に十分な資金があることを確認します。
  7. エラー処理:成功/失敗の結果を包括的にログに記録します。

リスク管理の統合:各注文には独自のストップロスとテイクプロフィットが設定されており、事前に定義されたリスクパラメータを維持します。2:1のリスクリワードレシオ(StopLossPips対TPフォールバック2倍)は、フィボナッチ計算の調整が必要な場合でも期待値をプラスに保ちます。

9. リスク管理

これらのヘルパー関数はEAの免疫システムのような役割を果たします。IsValidPriceは口座を破壊するような数学的異常値を防ぎます。CheckMarginは過剰レバレッジを防止します。OrderExistsは重複注文によるリスク増加を防ぎます。これらを組み合わせることで、堅牢なリスク管理フレームワークを構築できます。

IsValidPriceは固定範囲を使わず、現在の市場価格に基づいて合理的な上限と下限を計算します。この動的アプローチはすべての銘柄と相場状況で有効です。証拠金チェックの2倍バッファは保守的ですが賢明で、スプレッド拡大や急な証拠金要件の変化にも対応できます。

//+------------------------------------------------------------------+
//| Is Valid Price: Validate price for mathematical soundness        |
//|                                                                  |
//| Purpose: Prevent orders at impossible price levels that could    |
//|          indicate calculation errors or market anomalies         |
//|                                                                  |
//| Parameters:                                                      |
//|   price [in]  Price level to validate                            |
//|                                                                  |
//| Returns: true if price is within reasonable range of current     |
//|          market price, false if potentially erroneous            |
//+------------------------------------------------------------------+
bool IsValidPrice(double price)
{
    //--- Basic sanity check: Price must be positive
    if(price <= 0) 
        return false;
    
    //--- Market context: Get current bid/ask for comparison
    double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    double currentPrice = (currentBid + currentAsk) / 2;
    
    //--- Reasonable range: 50% to 200% of current price (adjustable)
    double minPrice = currentPrice * 0.5;
    double maxPrice = currentPrice * 2.0;
    
    return (price >= minPrice && price <= maxPrice);
}

//+------------------------------------------------------------------+
//| Check Margin: Validate sufficient account equity for trade       |
//|                                                                  |
//| Purpose: Prevent orders that would exceed available margin or    |
//|          violate broker requirements                             |
//|                                                                  |
//| Parameters:                                                      |
//|   orderType [in]  Type of order (BUY_LIMIT/SELL_LIMIT)           |
//|   volume    [in]  Trade volume in lots                           |
//|   price     [in]  Order entry price                              |
//|                                                                  |
//| Returns: true if sufficient margin available with safety buffer, |
//|          false if trade would exceed risk limits                 |
//+------------------------------------------------------------------+
bool CheckMargin(ENUM_ORDER_TYPE orderType, double volume, double price)
{
    double marginRequired;
    
    //--- Calculate margin requirement based on order type
    if(orderType == ORDER_TYPE_BUY_LIMIT)
    {
        marginRequired = AccountInfo.MarginCheck(_Symbol, ORDER_TYPE_BUY, volume, price);
    }
    else
    {
        marginRequired = AccountInfo.MarginCheck(_Symbol, ORDER_TYPE_SELL, volume, price);
    }
    
    //--- Handle margin calculation failures gracefully
    if(marginRequired <= 0) 
        return true; // Allow trade if calculation fails (conservative approach)
    
    //--- Safety buffer: Require 2x margin for risk management
    double freeMargin = AccountInfo.FreeMargin();
    return (freeMargin > marginRequired * 2.0);
}

リスク管理の詳細

IsValidPriceのロジック

  • 価格が0またはマイナスになってしまう注文を防ぎます(数学的なエラーを回避します)。
  • 現在の市場コンテキストを使用し、値幅の50%から200%内に収めます。
  • この動的適応により、すべての銘柄・相場状況で有効です。

CheckMarginの実装

MQL5の組み込みAccountInfo.MarginCheck()を使用して、正確な計算をおこないます。

2倍の安全バッファを使用し、次のリスクに備えます。

  • ニュースイベント時のスプレッド拡大
  • 証拠金要件の変化
  • 複数ポジションの同時保有
  • 口座残高の変動

OrderExistsの保護

  • 注文の重複を防ぎ、ポジションサイズが倍増することを防止します。
  • 正確(1ポイント以内)な価格比較をおこないます。
  • 同一銘柄と同一注文タイプのみをチェックします。

これらの関数は連携して、多層的な保護を提供します。1つのチェックが失敗しても、他のチェックがバックアップとして機能します。

10. 注文管理:効率性を維持するクリーンアップチーム

市場は進化し続けます。それに合わせて未決注文も見直すべきです。ManagePendingOrders関数は、EAのクリーンアップチームとして機能し、もはや意味をなさない注文を削除します。現在の価格から大きく離れている注文や古くなった注文は、過去の市場仮説を反映しているだけであり、片づけるべきです。

この積極的な注文管理により、「注文の乱雑化」を防ぎ、取引資金が低確率のセットアップに無駄に拘束されるのを防げます。50ピップの距離や100バーの経過時間という閾値は合理的なデフォルトですが、本当に重要なのは、注文管理を体系的におこなう仕組みを持つことです。

//+------------------------------------------------------------------+
//| Manage Pending Orders: Clean up outdated or irrelevant orders    |
//|                                                                  |
//| Purpose: Remove orders that are no longer valid due to market    |
//|          movement, time decay, or changed market conditions      |
//+------------------------------------------------------------------+
void ManagePendingOrders()
{
    //--- Iterate backwards through orders (safe for deletion)
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderInfo.SelectByIndex(i) && OrderInfo.Symbol() == _Symbol && OrderInfo.Magic() == MagicNumber)
        {
            double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
            double orderPrice = OrderInfo.PriceOpen();
            datetime orderTime = OrderInfo.TimeSetup();
            
            //--- Distance Check: Remove if too far from current price
            bool isTooFar = MathAbs(currentPrice - orderPrice) > (500 * _Point);
            
            //--- Time Check: Remove if too old (market conditions changed)
            bool isTooOld = (TimeCurrent() - orderTime) > PeriodSeconds(_Period) * 100;
            
            //--- Execute deletion if either condition met
            if(isTooFar || isTooOld)
            {
                Trade.OrderDelete(OrderInfo.Ticket());
                Print("Order Cleanup: Deleted pending order ", OrderInfo.Ticket(), 
                      " - Reason: ", isTooFar ? "Price Distance" : "Time Expiry");
            }
        }
    }
}

注文管理戦略

1. 距離ベースのクリーンアップ

  • 現在の価格から50ピップ以上離れた注文を削除します。
  • 無関係な価格帯に資金が拘束されるのを防ぎます。
  • 変化する市場状況に適応します。

2. 時間ベースのクリーンアップ

  • 100バー以上経過した注文を削除します。
  • 古くなった注文が予期せぬ市場変動にさらされるのを防ぎます。
  • 異なる時間軸の文脈も考慮します。

3.選択的管理

  • 自分のMagicNumberを持つ注文のみを管理します。
  • 手動取引や他のEAの注文を保護します。
  • 安全な削除のために効率的な逆順ループを使用します。

クリーンアップロジック:注文はどちらか一方の条件(距離が遠いまたは古い)を満たす場合に削除されます。これにより、価格的には近いが古い注文や、最近の注文でも関係ないものを残さないようにします。



テスト

ストラテジーテスターへのアクセス

Fibonacci Predictive EAを正しく評価するには、MetaTrader 5の内蔵ストラテジーテスターを利用するのが最適です。これにより、フォワードテストや最適化を効率的におこなうことができます。以下はステップごとの手順です。

手順1:ストラテジーテスターを開く

  • MetaTrader 5の[表示]メニューから[ストラテジーテスター]を選択、またはCtrl+Rを押します。
  • 正確な価格データを取得するため、ブローカーサーバーに接続されていることを確認します。
  • [エキスパートアドバイザ]ドロップダウンから「Fibonacci Predictive EA」を選択します。

手順2:テストパラメータの設定(オプション)

  • 銘柄:初期テストにはEURUSDやGBPUSDなどの主要ペアを使用します。
  • 時間足:フィボナッチ戦略にはH1やH4が適しています。
  • モデル:[実際のティックに基づいたすべてのティック]を選択すると最も正確な結果が得られます。
  • 期間:トレンド相場、レンジ相場、ボラティリティの高い相場など、さまざまな市場条件でテストします。
  • 初期証拠金:実際の取引資金に見合った現実的な金額を設定します。

GBPUSD M1時間足での包括的なテストでは、Fibonacci Predictive EAの数学的基盤と実装の両方が実用的であることが確認されました。

EAは注文の執行精度に優れ、計算されたフィボナッチリトレースメントレベルに正確なストップロスおよびテイクプロフィットを伴った指値注文を安定して配置しました。特に、ボラティリティが高く価格変動の速いM1時間足でも、システムは堅牢なパフォーマンスを維持しました。

テストから得られた主な観察結果は次のとおりです。

  • 明確なスイングポイントの特定と正確なフィボナッチリトレースメントレベルの計算に成功しました。
  • 黄金比(61.8%)レベルでの買いおよび売り指値注文を完璧に出しました。
  • 適切なリスク管理パラメータを維持し、一貫した注文執行をおこないました。
  • 変化の激しい市場環境に効果的に適応しました。
  • 視覚的な秩序を維持してチャート上の混乱を避けました。
  • アルゴリズムによる規律で感情的な意思決定を排除しました。

ストラテジーテスター

Fibonacci Predictive EAのテスト

テストにより、EAのフィボナッチ取引における体系的アプローチが、値動きの速い市場環境でも有効であることが確認されました。EAは規律あるフレームワークを提供し、ボラティリティの高い環境下での手動取引よりも優れたパフォーマンスを発揮します。リアルタイムでの視覚的フィードバックにより、EAの市場仮説や取引判断を即座に検証できるため、効果的な取引ツールであると同時に教育的資源としても機能します。



結論

Fibonacci Predictive EAの開発を通じて、数学的原則と現代のアルゴリズム執行との強力な相乗効果が示されました。当初はフィボナッチリトレースメントの探索に過ぎなかった取り組みが、高確率の取引セットアップを特定しつつ、揺るぎない規律で実行する包括的な取引システムへと進化しました。

真のブレークスルーは、静的なフィボナッチレベルを動的な予測経路に変換した点にあります。リトレースメントエントリーからエクステンションターゲットまでの価格推移を可視化することで、EAは取引を実行するだけでなく、学習ツールとしても機能します。トレーダーはなぜ特定のレベルが選ばれたのかを疑問に思う必要がなく、視覚的なパスによって根拠が直感的に理解できます。

テストを通じて、EAは一貫して重要なスイングポイントを特定し、現実的なリトレースメントゾーンを予測する能力を示しました。堅牢なリスク管理プロトコルを統合しているため、予期せぬ市場変動時でも損失を限定的かつ管理可能に保つことができます。視覚的フィードバックシステムは、リアルタイム取引と教育の両方において非常に有用であり、トレーダーが市場構造を直感的に理解する助けとなります。

さらに重要な点として、このプロジェクトは多くのトレーダーが直面する心理的課題、すなわち価格の追随への誘惑に対応しています。事後的に反応するのではなく、先を予測する構造化されたフレームワークを提供することで、EAは長期的な取引成功に不可欠な忍耐力と規律を培います。

どの取引システムも利益を保証するものではありませんが、Fibonacci Predictive EAは数学的に妥当で、視覚的に直感的、かつ体系的に実行可能な市場分析手法を提供します。このシステムは単なるコードの集合ではなく、市場状況の変化に応じて適応・改善可能な包括的な取引手法を表しています。


重要な学び

重要な学び 説明
入力検証は必須 OnInit内でフィボナッチレベルを常に検証し(リトレースメントは 0 < リトレースメント < 1、エクステンションは ≥ 1を満たす)数学的エラーを防ぎます。
CTradeを使ったプロ仕様の注文実行 MQL5のCTradeクラスは組み込みのエラー処理を提供し、生のOrderSendに比べて注文管理を簡素化します。
オブジェクト管理でチャートの混雑を防止 新しいオブジェクトを作成する前に古いチャートオブジェクトを削除し、ユニークな名前付けで管理を容易にします。
価格の正規化は必須 NormalizeDouble()と_Digitsを使い、価格をブローカーの精度に合わせて注文拒否を回避します。
マジックナンバーでEA注文を分離する EA注文を識別するために固有のMagicNumberを割り当て、手動取引や他のEAとの干渉を防止します。

添付ファイル

ソースファイル バージョン 説明
FibonacciPredictiveEA.mq5 1.00 スイング検出、可視化、自動注文実行を備えた予測型フィボナッチ経路を実装する完全なMQL5ソースコード

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20160

添付されたファイル |
最後のコメント | ディスカッションに移動 (1)
MikeBaranoff
MikeBaranoff | 14 1月 2026 において 10:15
こんにちは。エントリーポイントの決定、フィボナッチレベルとストップロスの調整機能が素晴らしいEAです。ブレイクアウトとトレイリングストップを使ったダイナミックなTP変更を追加してください。また、一方向のエントリー回数を制限してほしい。ありがとうございます。
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
MQL5入門(第26回):MQL5のAPIとWebRequest関数の習得 MQL5入門(第26回):MQL5のAPIとWebRequest関数の習得
本記事では、MQL5におけるWebRequest関数とAPIの使用方法を紹介し、外部プラットフォームと通信する方法を解説します。MetaTrader 5から直接Telegramボットを作成し、チャットやグループのIDを取得し、メッセージの送信、編集、削除をおこなう方法を学びます。これにより、今後のMQL5プロジェクトでのAPI統合の基礎をしっかり身につけることができます。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
MQL5 MVCパラダイムのテーブルのビューコンポーネント:シンプルな操作 MQL5 MVCパラダイムのテーブルのビューコンポーネント:シンプルな操作
本記事では、MVC (Model-View-Controller)パラダイムにおけるテーブル実装で、より複雑なグラフィック要素を構成するビューコンポーネントとしてのシンプルなコントロールについて解説します。ユーザーや他の要素との相互作用のための基本的な機能はコントローラーに実装されています。本記事はビューコンポーネントに関する第2回目の記事であり、MetaTrader 5クライアントターミナル向けテーブル作成に関する連載の第4回目です。