English Deutsch
preview
迅速な取引判断を極める:実行麻痺を克服する

迅速な取引判断を極める:実行麻痺を克服する

MetaTrader 5トレーディング |
11 4
Eugene Mmene
Eugene Mmene

はじめに

本記事は、スキャルパーや、迅速かつ即時の判断と取引執行を必要とするトレーダーの双方を対象としています。また、エントリーを見つけても考えすぎてしまい、最終的にボタンを押せず、取るべき取引全体を逃してしまう「実行麻痺」に陥るトレーダーにとっても非常に有益な内容となるでしょう。私は、ほとんどの場合において、迅速な取引執行と行動こそが、同じスキルと経験を持つトレーダーAとトレーダーBの間に決定的な差を生み出すゲームチェンジャーであり、差別化要因になると考えています。特にスキャルピングや短期取引においては、トレーダーが即断即決をおこなう必要性は非常に重要であり、数秒から数分の遅れが大きな損失を招く一方で、タイミングよく執行できれば数百ドル、場合によっては数千ドルの追加利益を生み出すこともあります。 

私自身もトレーダーとして、取引をおこなうたびに、精神的、技術的な新たな課題や壁に直面することを理解しています。実際、ほとんどのトレーダーは、取引人生のどこかの段階で、ほぼ同じ、あるいは非常に似通った課題に直面します。しかし、それらの課題に対してどのように対処し、反応し、事前に想定するかはトレーダーごとに異なります。その結果、スキル、経験、冷静さ、意思決定力、テクニックといった点で僅差しかないトレーダー同士であっても、最終的な取引結果には非常に大きな差が生まれるのです。 

こうした中でも特に顕著な精神的障壁の一つが、価格を追い続けている多くのトレーダーが直面する、よく知られた心理的障壁です。すなわち、取引機会を追跡し、予測し、分析し、最終的に「これは利益になる」と確信できるエントリーを見つけたにもかかわらず、心の奥で「もし間違っていたらどうしよう?」「お金を失ったらどうしよう?」という声が囁き始めるのです。やがてこの自己疑念と自信の欠如が勝り、トレーダーは実行麻痺に陥り、エントリーできなくなります。そして当然ながら、価格は予想通りの方向に動いていきますが、その中に自分はいません。この結果、後悔や連続した判断ミスが生じることになります。

その後、今度はFOMO(取り残されることへの恐れ)やリベンジトレードによって、根拠の薄い、あるいは不利なエントリーを繰り返すようになります。これがさらなるミスを招き、最終的には資金の損失へとつながっていきます。これらすべての根本原因は、自信の欠如、自己疑念、そして頭の中で否定的な想像を囁き続ける声なのです。

本インジケーターは、これらの問題に対処することを目的として設計されています。このインジケーターは、まさにその「声」として機能し、チャート画面上に視覚的に表示されることで、「あなたの判断は正しい。迷わず取引を実行すべきだ」と確認させてくれます。また、反転やレンジ(持ち合い)を避けるためのエグジット警告として使用することも可能です。

H4(4時間足)チャート上でのUT BOT

図1:H4(4時間足)チャート上でのUT BOT


UT BOTインジケーターの紹介

ここまでで、世界中の多くのトレーダーがほとんど常に直面している共通の問題を紹介し、明確にしてきました。そこで私は、トレーダーはもう過度に悩む必要はなく、これ以上心配する必要もないと断言したいと思います。なぜなら本日、スキャルピングや短期で素早い取引執行を好むトレーダーにとって、最大限の恩恵をもたらす特別なカスタムインジケーターを公開するからです。このカスタムインジケーターは、売買シグナルを生成し、エントリーポイントとエグジットポイントを提示するだけでなく、トレーリングストップロスラインも備えています。このラインは、判断ミスがあった場合の損切りポイントとして、または利益を確定するための出口として機能します。 

この優れたインジケーターのもう一つの恩恵を受ける層は、まだ成長段階にあり、スキルやテクニックを磨いている最中のトレーダーです。このインジケーターは、彼ら自身の手法、トレードスタイル、戦略と組み合わせて使用することができ、エントリーおよびエグジットの確認ツールとして機能します。インジケーターと自身の取引手法が一致し、同じ示唆を与えたときに、取引を実行すればよいのです。やがてトレーダーは、自分自身と自らの手法に対する信頼と自信を築いていくことができるでしょう。またこのインジケーターは、経験豊富なトレーダーにとっても、トレード判断の重圧を和らげるための、鋭く、注意深い「監視役」として機能する一般的な確認ツールとして活用することも可能です。 

M1(1分足)チャート上でのUT BOT

図2:M1(1分足)チャート上でのUT BOT


UT BOTインジケーターの内部の仕組み

本記事の目的は、読者が個人的にカスタマイズ可能なUT Botを理解し、市場と現在価格をスキャンしながら、トレンドおよびATRに基づいた最適な執行判断をおこなえるようにすることです。これにより、分析時間を最小限に抑えながら迅速な取引と素早い執行が可能となり、即時反応が求められるスキャルピングにも対応し、さらにエグジット用のトレーリングストップロスラインを活用することができます。

UT BOTインジケーターは基本的にトレンドフォロー型のインジケーターであり、価格変動に基づき、ボラティリティに応じて調整される動的なトレーリングストップロスを基準として、チャート上の潜在的なエントリーポイントで売買シグナルを生成するよう設計されています。このトレーリングストップロスはATRを用いて調整されます。UT BOTは主要ロジックとして従来の移動平均線には依存しておらず、1期間EMA(実質的には現在価格)を用いてクロス判定をおこないます。インジケーターは以下を用いて潜在的なエントリーポイントでシグナルを生成します。

  • 買いシグナルとしてローソク足の下に表示される緑色の矢印「UT Long」
  • 売りシグナルとしてローソク足の上に表示される赤色の矢印「UT Short」
  • トレーリングストップ水準を示す青色のライン
  • シグナル発生時にリアルタイムで通知するアラート

このインジケーターは金属、為替指数、商品などあらゆる資産クラスで使用可能であり、すべての時間足でシグナルを生成します。このインジケーターの最も重要かつ優れた点は、トレーダーの好みに応じて個別にカスタマイズできる点です。期間、感度、シグナルの平滑化などが調整可能な要素となっています。UT BOTは市場のボラティリティ指標として広く知られるATRを使用してトレーリングストップロスを算出しており、これが本インジケーターの中核となる手法です。ATRを使用するもう一つの利点は、UT BOTが市場の変動性に適応し、値動きが荒い相場における誤ったシグナルを回避できる点にあります。また、そのロジックは単純で信頼性が高く、リペイントをおこなわない構造となっています。

UT BOTの取引ロジックおよびシグナル生成の計算方法は非常に基本的であり、価格がトレーリングストップを上回るか下回るかのみを条件としています。複雑な移動平均同士の相互関係を必要としないため、処理速度が速く、過剰最適化にも陥りにくい構造となっています。 

UT BOTはATRを用いて、現在価格からトレーリングストップまでの距離を動的に調整し、常に変化する市場環境に対応します。その仕組みは以下の通りです。

  1. ATRの計算
    • ATRはトレーダーが設定した期間(c、デフォルト10本)における平均的な価格変動幅高値と安値の差を測定します。
    • これに感度係数(a、デフォルト1.0)を掛けることで、トレーリングストップロスのオフセット(nLoss = a * ATR)を算出します。
    • 例としてATRが0.0010 (10 pips)でaが1.0の場合、トレーリングストップロスは価格から10 pipsの位置に設定されます。
  2. トレーリングストップロスのロジック
    • トレーリングストップロス(trail)は価格の方向性に応じて調整されながら価格に追従します。
      • 上昇トレンド:現在の価格(src)と前の価格(src1)の両方が前回のトレーリングストップロス(trail[i-1])を上回っている場合、ストップロスは「max(trail[i-1], src - nLoss)」に引き上げられます。これにより、価格の下に追従しつつ利益を確保します。
      • 下降トレンド:両方の価格が前回のストップロスを下回っている場合、ストップロスは「min(trail[i-1], src + nLoss)」に引き下げられます。
      • 方向転換
        • 価格が前回のストップを上抜けた場合(src > trail[i-1])、ストップは「src−nLoss」にリセットされます。
        • 価格が前回のストップを下抜けた場合は、「src+nLoss」にリセットされます。
    • これにより、低ボラティリティ市場では価格に近く、高ボラティリティ市場では広くなる「階段状」のラインが形成されます。
  3. 価格情報元
    • デフォルトでは、価格(src)は各バーの終値(close[i])を使用します。
    • 平均足オプションが有効な場合(h = true)は、価格変動を平滑化してよりクリーンなシグナルを得るため、平均足の終値を使用します。
  4. シグナル生成
    • シグナルは、価格とトレーリングストップのクロスに基づいて生成されます。
      • 買いシグナル(UT Long):現在の価格がトレーリングストップを上抜けたとき(src > trail_curr && src1 <= trail1)に発生します。
      • 売りシグナル(UT Short):現在の価格がトレーリングストップを下抜けたとき(trail_curr > src && trail1 <= src1)に発生します。
    • 元のPine Scriptでは、クロス確認のために1期間EMA(ema = src)が使用されていますが、実際には終値と同等であるため、MQL5コードではsrcを直接使用することで簡略化されています。

H1(1時間足)チャート上でのUT BOT

図3:H1(1時間足)チャート上でのUT BOT


MQL5におけるUT BOTを用いた取引判断の自動化

この戦略を自動化し、説明して実装するために、以下を作成しました。

  • トレンドを分析し、潜在的な取引エントリーポイントを検出し、チャート上に買い/売りシグナルを描画するUT BOTインジケーター
  • ATRとEMAをエントリー判定に組み込んだUTインジケーターを用いて取引をおこなう、UTインジケーター + UT BOT EA

意思決定プロセス

このインジケーターの判断(矢印の描画、トレーリングストップラインの表示、アラートの発生)は、以下のロジックに基づいておこなわれます。

  • トレーリングストップの計算
    • 各バーごとに、現在の価格(src)、前の価格(src1)、および前回のトレーリングストップ(trail[i-1])に基づいてtrail[i]を計算します。ATRに基づくオフセット(nLoss)により、ストップはボラティリティに適応し、値動きの荒いレンジ相場における誤ったシグナルを低減します。
// Initialize first trailing stop value
   trail[0] = calculate_ha ? ha_close[0] : close[0];

   // Trailing stop and position calculation
   for (int i = 1; i < rates_total; i++)
   {
      double src = calculate_ha ? ha_close[i] : close[i];
      double src1 = calculate_ha ? ha_close[i - 1] : close[i - 1];
      double nLoss = a * atr[i];

      if (src > trail[i - 1] && src1 > trail[i - 1])
         trail[i] = MathMax(trail[i - 1], src - nLoss);
      else if (src < trail[i - 1] && src1 < trail[i - 1])
         trail[i] = MathMin(trail[i - 1], src + nLoss);
      else if (src > trail[i - 1])
         trail[i] = src - nLoss;
      else
         trail[i] = src + nLoss;

      if (src1 < trail[i - 1] && src > trail[i - 1])
         pos_arr[i] = 1.0;
      else if (src1 > trail[i - 1] && src < trail[i - 1])
         pos_arr[i] = -1.0;
      else
         pos_arr[i] = pos_arr[i - 1];

      Print("Bar ", i, ": src=", src, ", trail=", trail[i], ", pos=", pos_arr[i]);
   }

   ArrayResize(BuyBuffer, rates_total);
   ArrayResize(SellBuffer, rates_total);
   ArrayResize(TrailBuffer, rates_total);
   ArrayInitialize(BuyBuffer, EMPTY_VALUE);
   ArrayInitialize(SellBuffer, EMPTY_VALUE);
   ArrayInitialize(TrailBuffer, EMPTY_VALUE);

   // Signal and trailing stop plotting
   for (int i = 1; i < rates_total; i++)
   {
      double src = calculate_ha ? ha_close[i] : close[i];
      double src1 = calculate_ha ? ha_close[i - 1] : close[i - 1];
      double trail_curr = trail[i];
      double trail1 = trail[i - 1];

      bool above = (src > trail_curr) && (src1 <= trail1);
      bool below = (trail_curr > src) && (trail1 <= src1);

      bool buy_signal = above; // Simplified to ensure signals
      bool sell_signal = below;

      if (buy_signal)
      {
         BuyBuffer[i] = low[i] - Point() * 10; // Offset for visibility
         Print("Buy signal at bar ", i, ", time: ", TimeToString(time[i]), ", low: ", low[i]);
      }
      if (sell_signal)
      {
         SellBuffer[i] = high[i] + Point() * 10; // Offset for visibility
         Print("Sell signal at bar ", i, ", time: ", TimeToString(time[i]), ", high: ", high[i]);
      }

      TrailBuffer[i] = trail[i];
      if (trail[i] != EMPTY_VALUE)
         Print("Trailing stop at bar ", i, ": ", trail[i]);
   }
  • ポジション追跡
    • pos_arr配列はトレンド方向を追跡します。
      • 価格がトレーリングストップを上抜けた場合、pos=1.0(ロング)となります。
      • 価格がトレーリングストップを下抜けた場合、pos=-1.0(ショート)となります。
      • それ以外の場合は、前回のposを維持し、トレンドの連続性を保ちます。
    • このロジックは、MetaTrader 5のプロットが単色に制限されているため、MQL5版では描画用途には使用できませんが、シグナル生成には役立ちます。
   double trail[];
   double pos_arr[];
   ArrayResize(trail, rates_total);
   ArrayResize(pos_arr, rates_total);
   ArraySetAsSeries(trail, false);
   ArraySetAsSeries(pos_arr, false);
   ArrayInitialize(trail, EMPTY_VALUE);
   ArrayInitialize(pos_arr, 0.0);
  • シグナル検出
    • 買いシグナルは、価格がトレーリングストップを下から上へクロスしたときに発生します(above = src > trail_curr && src1 <= trail1)。
    • 売りシグナルは、価格がトレーリングストップを上から下へクロスしたときに発生します(below = trail_curr > src && trail1 <= src1)。
    • これらのクロス条件により、トレンド転換が確認された場合のみシグナルが生成され、ノイズが低減されます。
// Trailing stop and position calculation
   for (int i = 1; i < rates_total; i++)
   {
      double src = calculate_ha ? ha_close[i] : close[i];
      double src1 = calculate_ha ? ha_close[i - 1] : close[i - 1];
      double nLoss = a * atr[i];

      if (src > trail[i - 1] && src1 > trail[i - 1])
         trail[i] = MathMax(trail[i - 1], src - nLoss);
      else if (src < trail[i - 1] && src1 < trail[i - 1])
         trail[i] = MathMin(trail[i - 1], src + nLoss);
      else if (src > trail[i - 1])
         trail[i] = src - nLoss;
      else
         trail[i] = src + nLoss;

      if (src1 < trail[i - 1] && src > trail[i - 1])
         pos_arr[i] = 1.0;
      else if (src1 > trail[i - 1] && src < trail[i - 1])
         pos_arr[i] = -1.0;
      else
         pos_arr[i] = pos_arr[i - 1];

      Print("Bar ", i, ": src=", src, ", trail=", trail[i], ", pos=", pos_arr[i]);
   }

   ArrayResize(BuyBuffer, rates_total);
   ArrayResize(SellBuffer, rates_total);
   ArrayResize(TrailBuffer, rates_total);
   ArrayInitialize(BuyBuffer, EMPTY_VALUE);
   ArrayInitialize(SellBuffer, EMPTY_VALUE);
   ArrayInitialize(TrailBuffer, EMPTY_VALUE);
  • 描画とアラート
    • 買い:買いシグナルが発生した場合、バーの安値の下に緑色の矢印を描画します。
    • 売り:売りシグナルが発生した場合、バーの高値の上に赤色の矢印を描画します。
    • トレーリングストップ:バーごとにtrail[i]の値を青色のラインとして描画します。
  • アラート:新しいシグナルが発生した際、最新のバーで「UT Long」または「UT Short」のアラートを発生させます。重複を防ぐため、バーのタイムスタンプと照合して判定します。
    // Signal and trailing stop plotting
       for (int i = 1; i < rates_total; i++)
       {
          double src = calculate_ha ? ha_close[i] : close[i];
          double src1 = calculate_ha ? ha_close[i - 1] : close[i - 1];
          double trail_curr = trail[i];
          double trail1 = trail[i - 1];
    
          bool above = (src > trail_curr) && (src1 <= trail1);
          bool below = (trail_curr > src) && (trail1 <= src1);
    
          bool buy_signal = above; // Simplified to ensure signals
          bool sell_signal = below;
    
          if (buy_signal)
          {
             BuyBuffer[i] = low[i] - Point() * 10; // Offset for visibility
             Print("Buy signal at bar ", i, ", time: ", TimeToString(time[i]), ", low: ", low[i]);
          }
          if (sell_signal)
          {
             SellBuffer[i] = high[i] + Point() * 10; // Offset for visibility
             Print("Sell signal at bar ", i, ", time: ", TimeToString(time[i]), ", high: ", high[i]);
          }
    
          TrailBuffer[i] = trail[i];
          if (trail[i] != EMPTY_VALUE)
             Print("Trailing stop at bar ", i, ": ", trail[i]);
       }
    
       // Alerts on the latest bar
       if (rates_total > 1)
       {
          int i = rates_total - 1;
          double src = calculate_ha ? ha_close[i] : close[i];
          double src1 = calculate_ha ? ha_close[i - 1] : close[i - 1];
          double trail_curr = trail[i];
          double trail1 = trail[i - 1];
    
          bool above = (src > trail_curr) && (src1 <= trail1);
          bool below = (trail_curr > src) && (trail1 <= src1);
    
          bool buy_signal = above;
          bool sell_signal = below;
    
          static datetime last_time = 0;
          if (time[i] != last_time)
          {
             if (buy_signal)
             {
                Alert("UT Long at ", TimeToString(time[i]));
                Print("UT Long alert triggered at ", TimeToString(time[i]));
             }
             if (sell_signal)
             {
                Alert("UT Short at ", TimeToString(time[i]));
                Print("UT Short alert triggered at ", TimeToString(time[i]));
             }
             last_time = time[i];
          }
       }
    
       return rates_total;
    }

    このインジケーターは、トレンドおよび移動平均のクロスを検出することで、取引エントリーの可能性を分析して判定し、買い/売りの矢印シグナルをチャート上に描画します。また、決済ポイントを示すためのストップロスラインもあわせて表示します。

    #property copyright "UT BOT ATR Trailing System"           
    #property version   "1.00"
    #property description "Converted from Pine Script to MQL5 with Trailing Stop Line"
    #property indicator_chart_window
    #property indicator_buffers 3
    #property indicator_plots   3
    
    #property indicator_label1  "Buy"
    #property indicator_type1   DRAW_ARROW
    #property indicator_color1  clrGreen
    #property indicator_style1  STYLE_SOLID
    #property indicator_width1  2
    
    #property indicator_label2  "Sell"
    #property indicator_type2   DRAW_ARROW
    #property indicator_color2  clrRed
    #property indicator_style2  STYLE_SOLID
    #property indicator_width2  2
    
    #property indicator_label3  "Trailing Stop"
    #property indicator_type3   DRAW_LINE
    #property indicator_color3  clrBlue
    #property indicator_style3  STYLE_SOLID
    #property indicator_width3  2
    
    input double a = 1.0;   // Key Value. 'This changes the sensitivity'
    input int    c = 10;    // ATR Period
    input bool   h = false; // Signals from Heikin Ashi Candles
    
    double BuyBuffer[];
    double SellBuffer[];
    double TrailBuffer[];
    
    int atr_handle;
    double ha_open[], ha_high[], ha_low[], ha_close[];
    bool calculate_ha = false;
    
    int OnInit()
    {
       SetIndexBuffer(0, BuyBuffer, INDICATOR_DATA);
       PlotIndexSetInteger(0, PLOT_ARROW, 233); // Up arrow
       PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
    
       SetIndexBuffer(1, SellBuffer, INDICATOR_DATA);
       PlotIndexSetInteger(1, PLOT_ARROW, 234); // Down arrow
       PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
    
       SetIndexBuffer(2, TrailBuffer, INDICATOR_DATA);
       PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
    
       atr_handle = iATR(_Symbol, PERIOD_CURRENT, c);
       if (atr_handle == INVALID_HANDLE)
       {
          Print("Failed to create ATR handle");
          return INIT_FAILED;
       }
    
       calculate_ha = h;
       ArraySetAsSeries(BuyBuffer, false);
       ArraySetAsSeries(SellBuffer, false);
       ArraySetAsSeries(TrailBuffer, false);
    
       Print("Indicator initialized. Symbol: ", _Symbol, ", Timeframe: ", Period());
    
       return INIT_SUCCEEDED;
    }
    
    void OnDeinit(const int reason)
    {
       if (atr_handle != INVALID_HANDLE)
          IndicatorRelease(atr_handle);
    }
    
    int OnCalculate(const int rates_total,
                    const int prev_calculated,
                    const datetime &time[],
                    const double &open[],
                    const double &high[],
                    const double &low[],
                    const double &close[],
                    const long &tick_volume[],
                    const long &volume[],
                    const int &spread[])
    {
       if (rates_total < c + 2)
       {
          Print("Not enough bars: ", rates_total, " (need ", c + 2, ")");
          return 0;
       }
    
       ArraySetAsSeries(open, false);
       ArraySetAsSeries(high, false);
       ArraySetAsSeries(low, false);
       ArraySetAsSeries(close, false);
       ArraySetAsSeries(time, false);
    
       double atr[];
       ArrayResize(atr, rates_total);
       ArraySetAsSeries(atr, false);
       if (CopyBuffer(atr_handle, 0, 0, rates_total, atr) != rates_total)
       {
          Print("Failed to copy ATR buffer");
          return 0;
       }
      

    インストール:MetaEditorでコンパイルし、チャートに適用します。強気トレンドの取引エントリーには緑色の矢印を、弱気トレンドの取引エントリーには赤色の矢印を描画します。

    使用例:GOLDのM15およびH1では、視覚的な分析と表示のために、メインチャート上に矢印とトレーリングストップラインを描画します。


    UT BOTエキスパートアドバイザー(EA)のソースコード

    このEAは、インジケーターから取引シグナルを検出し、トレンド方向とシグナルポイントに基づいて解釈することでエントリー判断をおこないます。また、ATRを確認してストップロス水準を決定し、取引を実行します。また、リスク管理として、1取引あたり2%のリスク設定を含んでいます。 

    EAのカスタマイズ可能な設定

    この入力パラメータセクションでは、コードを変更することなく、EAの挙動をトレーダーが自由に調整できます。GBP/USDおよびGBP/JPYの通貨ペアでは、1回の取引あたりの損失エクスポージャーを抑え、大きなドローダウンを防ぐために、RiskPctを1.0%に引き下げています。これらのペアは中程度のボラティリティ環境にあるため、この設定が適しています。ATR_Prdは10に設定されており、ゴールドと比較して短期的な値動きが多いGBP/USDおよびGBP/JPYにおいて、ボラティリティをより迅速に計算できるようにしています。

    EMA_Prdは12に短縮されており、M15時間足におけるトレンド検出の反応性を高めています。NewsPauseは20分に延長されており、英国および米国の経済指標発表時にGBPペアで見られがちな長時間の高ボラティリティを回避します。

    MinBrkStrは両通貨ペアで引き上げられており、強いシグナルのみを取引対象とすることでノイズを除去し、勝率の向上を図っています。useHTFはデフォルトで有効化されており、上位時間軸のトレンドに沿った取引をおこなうことで、誤ったシグナルを減らします。MaxSpreadPipsおよびUseDynamicSpreadはスプレッドフィルタリングを制御し、特にアジア時間帯にスプレッドが広がりやすいGBP/JPYにおいて重要な役割を果たします。ドローダウン制限は、日次5%、全体で10%に厳格化されており、これらを超えた場合は取引を停止して資金を保護するよう設計されています。

    次のコードでは入力パラメータを宣言します。 
    //+------------------------------------------------------------------+
    //|                                                    UT BOT EA.mq5 |
    //|                                                     EUGENE MMENE |
    //|                                            https://EMcapital.com |
    //+------------------------------------------------------------------+
    #property copyright "EUGENE MMENE"
    #property link      "https://EMCAPITAL2022"
    #property version   "2.51"
    
    #include <Trade\Trade.mqh>
    #include <Object.mqh>
    #include <StdLibErr.mqh>
    #include <Trade\OrderInfo.mqh>
    #include <Trade\HistoryOrderInfo.mqh>
    #include <Trade\PositionInfo.mqh>
    #include <Trade\DealInfo.mqh>
    
    input double RiskPct = 1.0; // Reduced risk per trade
    input double MaxLossUSD = 100.0;
    input double RecTgt = 7000.0;
    input int ATR_Prd = 10; // Faster ATR for GBPUSD/GBPJPY
    input int Brk_Prd = 10;
    input int EMA_Prd = 12; // Faster EMA for M15
    input string GS_Url = "";
    input bool NewsFilt = true;
    input int NewsPause = 60; // Extended news pause
    input double MinBrkStr_XAUUSD = 0.3; // Not used
    input double MinBrkStr_GBPUSD = 0.07; // Increased for stronger breakouts
    input double MinBrkStr_GBPJPY = 0.1; // Increased for GBPJPY volatility
    input int Vol_Prd = 3; // Increased for volume confirmation
    input bool Bypass = false; // Enforce breakout strength
    input bool useHTF = true; // Enable HTF trend filter
    input string NewsAPI_Url = "https://www.alphavantage.co/query?function=NEWS_SENTIMENT&apikey=";
    input string NewsAPI_Key = "pub_3f54bba977384ac19b6839a744444aba";
    input double DailyDDLimit = 5.0; // Stricter daily drawdown
    input double OverallDDLimit = 10.0; // Stricter overall drawdown
    input double TargetBalanceOrEquity = 9000.0;
    input bool ResetProfitTarget = false;
    input double MaxLotSize = 4.0;
    input double MaxSpreadPips = 30.0; // Adjusted for GBPUSD/GBPJPY
    input bool UseDynamicSpread = true; // Enable dynamic spread
    input int SpreadAvgPeriod = 5; // Shorter spread averaging
    
    

    OnInit関数:セットアップと初期化

    OnInit関数は、EAが読み込まれた際に1度だけ呼び出されます。この関数ではまず、取引対象の通貨ペア(GBPUSDまたはGBPJPY)を検証し、ペアごとに最小ブレイクアウト強度(MinBrkStr)を設定します。これにより、UT BOTは各通貨ペアのボラティリティに動的に適応します。GBP/USDは値動き幅が狭いためより多くの機会を捉えるように設定され、GBP/JPYは鋭い値動きによる誤ブレイクを避けるために強度を高く設定しています。時間足配列はM15に絞られており、M5によるノイズやH1による遅延を減らすことで、これらの通貨ペアにおけるシグナル精度を向上させます。

    ATR(ボラティリティに基づくSL/TP)、ティック出来高(確認用)、EMA(トレンド)の各インジケーターはM15で初期化されます。さらに、D1およびH4の上位時間軸EMAを読み込んでトレンドフィルタリングをおこないます。これはゴールド取引とは異なる適応で、ゴールドでは値動きが大きいため下位時間足のみで十分ですが、GBPペアでは上位時間軸のトレンド確認が重要です。ニュースフィルタリングが有効な場合は、FetchNewsCalendar関数を呼び出して今後の経済指標を読み込み、高ボラティリティ期間中の取引を避けます。この初期化プロセスにより、UT BOTはGBP/USDおよびGBP/JPYの市場特性に合わせて、利益を狙える状態で準備されます。

    int OnInit() {
       // Validate symbol and set breakout strength
       string sym = Symbol();
       if(StringFind(TradeSymbol, "GBPUSD") >= 0) {
          MinBrkStr = MinBrkStr_GBPUSD;
       } else if(StringFind(TradeSymbol, "GBPJPY") >= 0) {
          MinBrkStr = MinBrkStr_GBPJPY;
       }
       dynBrkStr = MinBrkStr;
    
       // Initialize M15 timeframe and indicators
       ArrayResize(tfs, 1); // Focus on M15
       tfs[0].tf = PERIOD_M15;
       tfs[0].h_atr = iATR(TradeSymbol, tfs[0].tf, ATR_Prd);
       tfs[0].h_vol = iVolumes(TradeSymbol, tfs[0].tf, VOLUME_TICK);
       tfs[0].h_vol_ma = iMA(TradeSymbol, tfs[0].tf, Vol_Prd, 0, MODE_SMA, PRICE_CLOSE);
       h_ema_d1 = iMA(TradeSymbol, PERIOD_D1, EMA_Prd, 0, MODE_EMA, PRICE_CLOSE);
       h_ema_h4 = iMA(TradeSymbol, PERIOD_H4, EMA_Prd, 0, MODE_EMA, PRICE_CLOSE);
    
       if(NewsFilt) FetchNewsCalendar();
       return(INIT_SUCCEEDED);
    

    IsTradingTime関数:セッションベースの取引制限

    この関数は、GBP/USDおよびGBP/JPYにおいて最も流動性とボラティリティの高いロンドンおよびニューヨークセッション(GMT 8:00~20:00、月~金)の時間帯に取引を制限します。

    GBP/USDは、ロンドンセッション(8:00~12:00 GMT)およびニューヨークセッション(13:00~20:00 GMT)のオーバーラップ時に出来高(取引量)が大きく増加します。一方、GBP/JPYはロンドン/東京のオーバーラップで恩恵を受けますが、ロンドン/ニューヨークの時間帯ではさらに高いボラティリティが見られます。

    取引をこれらの時間帯に限定することで、低流動性の時間帯(例:アジアセッション)に発生しやすい誤ったブレイクアウトやスプレッドの拡大を回避し、全体の収益性向上およびドローダウンの低減を実現します。MqlDateTime構造体を用いて現在の時間と曜日を取得することで、正確な制御をおこないます。この適応はGBP通貨ペアにおいて特に重要です。

    bool IsTradingTime() {
       MqlDateTime time;
       TimeCurrent(time);
       return (time.hour >= 8 && time.hour <= 20 && time.day_of_week >= 1 && time.day_of_week <= 5);
    }
    

    CalcLots関数:リスク管理を考慮した動的ポジションサイズ計算

    CalcLots関数は、口座残高、リスク割合、ストップロス距離(pips単位)に基づいてポジションサイズを計算し、1回の取引で許容リスクを超えないようにします。GBP/JPYでは、JPYの単位スケールによるpips価値の高さを考慮して、pip値の調整を0.1に設定し、過剰エクスポージャーを防ぎます。GBP/USDでは0.5が使用されます。

    リスク金額はMaxLossUSDで上限が設定されており、これにより大きな損失を防ぎます。さらに、取引数量が利用可能証拠金を超える場合(20%のマージンバッファを考慮)、反復ループでロット数を段階的に減少させ、「資金不足」によるエラーを回避します。これはGBPJPYのようなボラティリティの高い通貨ペアで特に重要です。

    最終的にロットサイズはブローカーの最小/最大ロット規則に合わせて正規化されます。このメソッドにより、GBP/USDおよびGBP/JPYにおいて、ゴールドほど価格変動が大きくない市場でも、一貫したリスク管理を維持し、長期的な収益性を確保できます。

    double CalcLots(double eq, double riskPct, double slPips) {
       double pipVal = SymbolInfoDouble(TradeSymbol, SYMBOL_TRADE_TICK_VALUE);
       double pipValAdjust = StringFind(TradeSymbol, "GBPJPY") >= 0 ? 0.1 : 0.5;
       double riskAmt = MathMin(eq * (riskPct / 100), MaxLossUSD);
       double lots = (riskAmt / (slPips * pipVal)) * pipValAdjust;
       double minLot = SymbolInfoDouble(TradeSymbol, SYMBOL_VOLUME_MIN);
       double maxLot = MathMin(SymbolInfoDouble(TradeSymbol, SYMBOL_VOLUME_MAX), MaxLotSize);
       double freeMarg = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
       while(lots > minLot && freeMarg < (SymbolInfoDouble(TradeSymbol, SYMBOL_MARGIN_INITIAL) * lots * 1.2)) {
          lots *= 0.8; // Reduce lot size iteratively
       }
       lots = NormalizeDouble(MathMax(minLot, MathMin(maxLot, lots)), 2);
       return lots;
    }

    インストールとバックテスト:MetaEditorでコンパイルし、チャートに添付します。GBPUSD/GBPJPY M15 (2025)を2%のリスクでバックテストします。 


    戦略テスト

    このインジケーターは、比較的短期間での値動きを検出して迅速な意思決定を可能にし、高ボラティリティに適応できるため、スキャルパーや小口デイトレーダーに有用であり、あらゆる資産クラスで最適に機能します。2025年1月1日~2025年4月1日まで、60分足(H1)でGOLDを対象に取引をおこない、チャート上にどのようにシグナルやトレーリングストップが描画されるかを確認します。以下は、この戦略で選択したパラメータです。

    入力パラメータ


       入力

    UT BOT EAの戦略テスト

    この戦略は、比較的短期間でトレンドやボラティリティの変化に適応できるため、ほとんどすべての通貨ペアで最も効果的に機能します。特に、デイトレードやスキャルピングなどの個人投資家向けの取引に有利です。今回は、この戦略をGBPJPYとGBPUSDで、2025年1月1日から2025年4月1日まで、15分足(M15)でテストします。以下は、この戦略で選択したパラメータです。 

    GBP/JPY

    GBP/JPYの入力設定

    GBP/USD

    GBP/USDの入力設定

    入力設定


    ストラテジーテスターの結果

    ストラテジーテスターでのテスト結果は、戦略がどのように機能するか、トレードのエントリーポイントを矢印で表示し、ストップロスラインを描画する様子を示しています。

    シグナルとトレーリングストップ

    図4:シグナルとトレーリングストップ


    データウィンドウの結果

    UT BOT EAのストラテジーテスター結果

    残高/資本グラフ:GBP/JPY

    GBP/JPYグラフ

    GBP/USD

    GBP/USDグラフ


    バックテスト結果:GBP/JPY

    GBP/JPYバックテスト結果

    GBP/USD

    GBP/USDバックテスト結果

    まとめ

    この記事は、MetaTrader 5のインジケーターについて説明するために書きました。このインジケーターは、ATRと指数移動平均(EMA)を組み合わせて、GOLDの高確率な取引設定や、利益確定またはストップロスとして使える可能性のあるエグジットポイントを特定するものです。このUT BOTインジケーターは、トレードのエントリーポイントやトレンドの変化を捉えるための、非常に価値の高い画期的な取引およびシグナル生成の概念の一つです。

    私はこのインジケーターをGOLD、GBPUSD、GBPJPYでテストしました。その結果、任意の時間足においても取引の可能性があるエントリーポイントを効率的かつ適切に検出できることが分かりました。しかし、エントリーポイントの検出はあくまで一部の要素に過ぎません。移動平均線のクロスが発生していない場合、インジケーターはそれを取引可能なシナリオとして認識せず、たとえ価格が急上昇した場合でも、取引は実行されるべきではありません。これらの移動平均線のクロスは、ボラティリティの高い相場でトレードの精度と質を向上させるための確認サインとなります。

    このインジケーター戦略を実装するには、以下のように入力パラメーターを設定することで望ましい結果を得られます。インジケーターは、トレーダーが任意に選択した時間足(M1からMNまで)で取引の可能性があるポイントをスキャンするよう設計されており、エントリーポイントがトレンド、移動平均クロス、ATRと整合するようになっています。興味のある方は、任意の資産や通貨ペアで、このインジケーターをデモ口座でバックテストすることをおすすめします。このインジケーターの主な目的は、スキャルパー向けに下位時間軸で発生する高確率なセットアップを素早く選定できるよう最適化すること、そして導入されたトレーリングストップによるリスク管理も組み込むことです。

    また、ユーザーには、定期的にパフォーマンスログを確認し、目標や資産クラス、リスク許容度に応じて設定や入力パラメータを調整することを推奨します。免責条項:このインジケーターを使用する方は、まずデモ口座でテストし、このスキャルピング手法を習得してから、ライブ資金での取引に臨むようにしてください。


    結論

    本記事の主なポイントと強調点は、トレーダーが日々の取引で直面する問題を明確に説明し、解決策を提示することにあります。これらの問題とは、自己疑念、分析麻痺、そして取引が発生する場所やタイミングで迅速かつ的確に取引を実行する必要性などです。本記事では、UT BOTがどのようにこれらの制約を解決し、取引プロセスをより簡単にし、さらに迅速かつ断定的なシグナル生成ツールを活用して取引の分析、理解、確認、さらには取引実行にどのように理想的に利用できるかを明確に説明しています。

    多くの専門家、初心者トレーダー、さらには中級者トレーダーでさえ、スキャルピングの複雑な世界をうまくナビゲートできず、この手法にフラストレーションを感じることがあります。それは、相場の動きを十分に理解できなかったり、価格がどのように常に動き、馴染みのあるパターンや移動平均を使って短期的に実際に利益を生むクラシックな取引や実行をおこなっているのかを見極める目を持っていないためです。これは長期取引やポジショントレーダーに比べて頻繁に発生します。あるいは、たとえインジケーターのシグナルに基づいて取引を実行しなくても、トレーダーは自身の取引アイデア、ポジション、セットアップ、さらにはこの記事で共有したトレンドや方向性を検証することができます。そして、UT BOTがシグナル生成において非常に重要な役割を果たすことに気づき、興味深く感じるでしょう。

    このシグナル生成インジケーターをMQL5で自動化することで、トレーダーは感情的なバイアス、分析麻痺、自己疑念を減らすことができ、スキャルピング戦略で生成された取引シグナルを一貫して実行できるようになります。この戦略は、長期取引やポジショントレーダーにも非常に適しています。

    記事で参照されているすべてのコードは以下に添付されています。次の表では、この記事に付随するすべてのソースコードファイルについて説明します。

    ファイル名 説明
    UT BOT.mq5 UT BOTインジケーターの完全なソースコードを含むファイル
    UT BOT EA.mq5 完全に結合されたUT BOT EAの完全なソースコードを含むファイル 

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

    添付されたファイル |
    Ut_Bot.mq5 (7.55 KB)
    UT_BOT_EA.mq5 (54.54 KB)
    最後のコメント | ディスカッションに移動 (4)
    jack budge
    jack budge | 24 10月 2025 において 10:55
    非常に有用なユージン、素晴らしい適応、プリモ・コンフルエンス
    Eugene Mmene
    Eugene Mmene | 24 10月 2025 において 12:42
    jack budge #:
    非常に有用なユージーン、素晴らしい適応、プリモ・コンフルエンス
    ありがとう。
    Stuart
    Stuart | 6 11月 2025 において 11:52
    私はMQL5がそれほど得意ではありません。XAUSDの1mTFと15mTFでロードしてテストしてみたが、バックテストでは 機能しないようだ。
    Eugene Mmene
    Eugene Mmene | 11 11月 2025 において 21:51
    Stuart バックテストでは 動作しないようです。
    ありがとうございます、
    ああ、非常に良いあなたは、インジケータをテストしてみてください?その主なインジケータは、私はまた、それをバックテストするための挑戦を見つけたが、あなたはチャート上でそれを適用し、生成されたシグナルが実際に実行されたであろう良い、有効な取引の動きであったかどうかを確認することができます。
    プライスアクション分析ツールキットの開発(第47回):MetaTrader 5で外国為替セッションとブレイクアウトを追跡する プライスアクション分析ツールキットの開発(第47回):MetaTrader 5で外国為替セッションとブレイクアウトを追跡する
    世界中の市場セッションは1日の取引のリズムを形成しており、それらの重なりを理解することは、エントリーやエグジットのタイミングを見極めるうえで非常に重要です。本記事では、これらの世界的な取引時間をチャート上で視覚的に再現するインタラクティブな取引セッションEAを構築します。このEAは、アジア、東京、ロンドン、ニューヨークの各セッションを色分けされた矩形として自動的に描画し、各市場の開始と終了に応じてリアルタイムで更新します。また、チャート上のトグルボタン、動的な情報パネル、そしてライブのステータスやブレイクアウトメッセージを表示するスクロール式のティッカーヘッドラインも搭載しています。複数のブローカーでテストされたこのEAは、精度とデザイン性を兼ね備えており、ボラティリティの移行を視覚的に把握し、セッション間のブレイクアウトを特定し、グローバル市場の動きを常に意識したトレードを可能にします。
    機械学習の限界を克服する(第6回):効果的なメモリクロスバリデーション 機械学習の限界を克服する(第6回):効果的なメモリクロスバリデーション
    本記事では、時系列クロスバリデーションにおける従来のアプローチと、その前提に疑問を投げかける新しい考え方を比較します。特に、市場環境が時間とともに変化するという点を十分に扱えていないという、古典的手法の弱点に焦点を当てます。これらの問題を踏まえ、Effective Memory Cross-Validation (EMCV)という、ドメインを意識した検証手法を紹介します。このアプローチは、「過去データは多ければ多いほど良い」という長年の常識を見直すものです。
    共和分株式による統計的裁定取引(第6回):スコアリングシステム 共和分株式による統計的裁定取引(第6回):スコアリングシステム
    本記事では、共和分株式の統計的裁定取引に基づく平均回帰戦略のスコアリングシステムを提案します。流動性や取引コストから、共和分ベクトルの数(ランク)や回帰までの時間に至るまでの基準を示しつつ、時間足やルックバック期間のような戦略的基準も考慮し、スコアランキングを正しく評価する前に検討しています。バックテストの再現に必要なファイルも提供され、その結果についてもコメントしています。
    MQL5入門(第25回):チャートオブジェクトで取引するEAの構築(II) MQL5入門(第25回):チャートオブジェクトで取引するEAの構築(II)
    本記事では、チャートオブジェクト、特にトレンドラインと連携するエキスパートアドバイザー(EA)を構築し、ブレイクアウトおよび反転の取引機会を検出し、実行する方法を解説します。EAが有効なシグナルをどのように判定するのか、取引頻度をどのように制御するのか、そしてユーザーが選択した取引戦略との一貫性をどのように維持するのかを学ぶことができます。