English Deutsch
preview
Candlestick Trend Constraintモデルの構築(第3回):使用中のトレンド変化の検出

Candlestick Trend Constraintモデルの構築(第3回):使用中のトレンド変化の検出

MetaTrader 5トレーディング | 27 6月 2024, 11:29
57 0
Clemence Benjamin
Clemence Benjamin

内容


はじめに

一般的に、市場は静止しているわけではありません。上昇トレンドであろうと下降トレンドであろうと、市場が軌道を変えるときには予期せぬ変動が起こりうるのです。システムには、このような変化を見極め、それに適応していくことが不可欠です。D1の弱気ローソク足が長引いたとしても、下位の時間枠で反転が起これば、トレンドの変化を示すことがあります。この記事では、プライスアクションのトレンドの変化を認識するために採用されている様々な方法を掘り下げます。トレーダーが複雑な金融市場を渡り歩くには、変化する状況に素早く適応する能力が最も重要になります。値動きのニュアンスを認識し、主要指標の重要性を理解し、市場のセンチメントを解釈することは、すべて先手を打つための重要な要素です。トレンドの移り変わりを見極めるスキルを磨くことで、トレーダーは、刻々と変化する金融界の情勢の中で生じるチャンスを活かすために、戦略的なポジションを取ることができます。

さまざまな要因が市場トレンドの変化に影響し、後押ししています。以下でいくつか挙げてみます。

  • 投資家の行動(売買)
  • GDPや非農業部門雇用者数などの経済ニュースリリース
  • 金融政策
  • 自然災害などの世界的な出来事
  • 戦争などの政治的出来事

さまざまな学習リソースを通じて、トレンドの変化を手作業で検出する方法について幅広い知識を得ました。これには、トレンドライン分析という概念が含まれます。トレンドライン分析では、トレーダーは、価格チャートに資産の値動きの高値または安値を結ぶ線を引くことで、価格がこれらの線を上回ったり下回ったりしたときに、潜在的なトレンドの変化を洞察することができます。この記事の後半では、市場トレンドの変化を検出する方法を1つ選び、MQL5を使用してTrend Constraint指標に統合します。まず、移動平均線、ローソク足パターン、相対力指数(第2部参照)、トレンドライン(図1参照)など、さまざまなテクニカル分析ツールを使用して、トレンド反転の可能性を探ります。この新機能を取り入れるために、MQL5のTrend Constraint指標を修正します。 

免責条項:この記事で概説されている戦略やテクニックは、あくまでも教育的な目的のためのものです。あなたの取引は、あなた自身の行動の結果です。私は、ここで提供される情報またはツールの使用から生じるいかなる損失に対しても責任を負いません

トレンドの図解

図1:トレンドの図解

注:上の画像は学習用に手描きしたものであり、実際の資産は提示されていません。

上の図は典型的な上昇トレンドを表しています。安値Aと安値Bは青いトレンドラインで結ばれています。以下の例では、トレンドをさらに理解するために、実際のチャートの例を調べてみます。主な目的は、市場トレンドの変化を認識し、MQL5コードを使用して適切な方法をシステムに組み込むことです。 


市場トレンドの変化を検知する方法

まず、市場トレンドの定義から始めましょう。

市場トレンドは、買い手と売り手の行動を反映し、時間の経過とともに市場が動く全体的な方向を意味します。トレンドには、上昇(強気)、下降(弱気)、横ばい(保ち合い)があります。はじめにの図1を参照してください。

ここで、トレンドの反転を次のように定義してみましょう。

トレンドの反転は、値動きが上昇トレンドから下降トレンドに移行するとき、またはその逆のときに起こります。このシフトは、移動平均線、トレンドライン、ローソク足パターン、支持線/抵抗線といった主要テクニカル指標を分析することで特定できます。トレーダーや投資家は、このような市場トレンドの変化を注意深く観察し、十分な情報に基づいた判断を下し、それに応じて戦略を調整します。


移動平均線を使用してトレンドの反転を見極める

本連載第1回では、クロスオーバーが発生したときにトレンド継続のシグナルを提供する、高速移動平均クロスオーバー指標を作成しました。しかし、上位期間の移動平均線は、クロスオーバーの際に大幅なトレンドの変化を示すことがあります。この記事では、市場が方向転換したときに移動平均線がどのように反応するかを検証します。以下がイメージです。

USDJPYmicroM5:移動平均線が反転のシグナルとなることを示す

図2:トレンド反転シグナルとしての移動平均線のクロスオーバー

ローソク足の形を使用してトレンドの反転を見抜く

ローソク足のパターンは、反転の可能性を見つけるために効果的に使用することができます。ローソク足のパターンは、市場心理を大きく変化させる能力があるとして、歴史を通じて分析されてきました。本間宗久のような先見者たちは、ローソク足Candlestick Bibleの生みの親であり、私たちのローソク足についての理解を深めてきました。ここでは、相場の反転を示す最も一般的なローソク足のパターンをいくつか紹介します。

ローソク足の名前 詳細
たくり線 
実体が小さく下髭が長い
逆たくり線
実体が小さく上髭が長い
陽の包み足
陽線が前の陰線を完全に呑み込む
陰の包み足
陰線が前の陽線を完全に呑み込む
童子 実体が小さく上下の影が長い
流れ星線 実体が小さく上影が長い
首吊り線 実体が小さく下髭が長い
明星 長い陰線の後に、安値と高値を示す小さなローソク足が続く
宵の明星 長い陽線の後に、高値と安値を更新する小さなローソク足が続く
これらのローソク足の特性はすべてMQL5を使用してプログラム可能です。なぜなら、プログラミング時に非常に重要な、すべての価格レベルの始値、終値、高値、安値が揃っているからです。


トレンドラインを使用してトレンドの反転を見極める

MT5プラットフォームのチャートでは、トレンドラインオブジェクトツールを使用して、デジタル資産の価格シリーズの連続する谷を結ぶことによってトレンドをプロットすることができます。トレンドラインはトレンドの変化を示します。トレンドラインを引くには、ツールバーのトレンドラインツールをクリックし、最初の谷をクリックして次の谷まで線をドラッグするだけです。トレンドラインは自動的にチャートの右側に伸びます。

B300指数トレンドライン割れ

図3:トレンドの反転を検知するツールとしてのトレンドライン

支持線/抵抗線を利用してトレンドの反転を見極める

MT5チャートの水平ラインツールは、価格のピークに置くことで、トレンドにおける支持と抵抗のレベルをプロットするために利用することができます。これらの水準を割ったときの価格が観察されたら、トレンドが転換するかもしれません。以下の説明ビデオをご覧ください。

現在のシステムの問題点

第2回では、シグナルをD1トレンドの形に合わせ、SMA 400などの指標を組み込むようにシステムを正常に構成しました。ただし、過去のデータには大きな課題があります。下位時間枠での変動を考慮する必要があります。これは、1日の初めの感情を逆転させる可能性があります。たとえば、1日が弱気な見通しで始まっても、ピンバーまたは強気な感情で終わる可能性があります。反転シグナルはしばしば下位時間枠で出現するため、当初は日足に限定されていたとしても、トレンドの変化を考慮するためにシステムのシグナル伝達メカニズムを適応させる必要があります。


MQL5にトレンド変化検出機能を組み込む

SMA200を低速移動平均線、EMA100を高速移動平均線として使用することにしました。一般的に、これらの移動平均線は強いトレンドのときには離れていますが、市場の勢いが弱いときや価格が横ばいで推移しているときには接近しています。2つの平均の交差ははしばしば方向転換のシグナルとなります。システムがこれを検知し、警告を発してくれることは非常に有益です。私たちの目標は、システムが私たちにシグナルを提供し、Constraintシグナルがそれに応じて調整できるようにすることです。このアプローチにより、潜在的なトレンドの反転を捉え、有益な取引機会を活用することを目指します。いくつかの主要な機能について説明し、その後にメインコードを記載します。

MAハンドラは次のように宣言されています。

MA_handle3 = iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_EMA, PRICE_CLOSE); // For EMA 100

MA_handle4 = iMA(NULL, PERIOD_CURRENT, 200, 0, MODE_SMA, PRICE_CLOSE); // For SMA 200

以下のコードは、MQL5における反復関数のクロスオーバー条件を示しています。

//Indicator Buffer 3
      if(MA3[i] > MA4[i]
      && MA3[i+1] < MA4[i+1] //Moving Average crosses above Moving Average
      )
        {
         Buffer3[i] = Low[i]; //Set indicator value at Candlestick Low
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Buy Reversal"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer3[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 4
      if(MA3[i] < MA4[i]
      && MA3[i+1] > MA4[i+1] //Moving Average crosses below Moving Average
      )
        {
         Buffer4[i] = High[i]; //Set indicator value at Candlestick High
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Sell Reversal"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer4[i] = EMPTY_VALUE;
        }

前回のTrend Constraintでは、トレンド継続のための買いシグナル用と売りシグナル用の2つのバッファがありました。目標を達成するために、売りと買いの2つのバッファを追加します。これらはすべて、クロスオーバーが発生したときの反転シグナルを表します。プログラムでは、これらは連続してBuffer3とBuffer4と命名されています。この機能のために新しい表示スタイルを最適化しました。指標の表示は、mql5オブジェクトのWingdingsから選択することでカスタマイズできます。ここでは、買い反転シグナルにオブジェクト番号236を、売り反転シグナルにオブジェクト番号238を利用しました。

// under OnInit() function. The wingding objects can be customized by altering those highlighted values choosing from wingding listing.
  SetIndexBuffer(2, Buffer3);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(2, PLOT_ARROW, 236);
   SetIndexBuffer(3, Buffer4);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(3, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(3, PLOT_ARROW, 238);

もう1つは、MQL5を使ったカラーコードです。これらの色は、MetaTrader 5の入力設定で最適化できます。各色はプログラム内でユニークなコードで表されます。C'0,0,0は黒を表します。下のコードスニペットをご覧ください。

#property indicator_type3 DRAW_ARROW
#property indicator_width3 1  // with can be adjusted up to 5 times.
#property indicator_color3 0x04CC04 //color for buy reversal
#property indicator_label3 "buy reversal"

#property indicator_type4 DRAW_ARROW
#property indicator_width4 1              //with can be adjusted up to 5 times.
#property indicator_color4 0xE81AC6  // Color code for sell reversal
#property indicator_label4 "sell reversal"

詳細とコメントは、以下のすべてのピースとアイデアを組み合わせたメインコードにあります。

///Indicator Name: Trend Constraint
#property copyright "Clemence Benjamin"
#property link      "https://mql5.com"
#property version   "1.03"
#property description "A model that seek to produce sell signal when D1 candle is Bearish only and  buy signal when it is Bullish"

//+------------------------------------------------------------------------------------------------------------------------------+
//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 4

#property indicator_type1 DRAW_ARROW
#property indicator_width1 5
#property indicator_color1 0xFF3C00
#property indicator_label1 "Buy"

#property indicator_type2 DRAW_ARROW
#property indicator_width2 5
#property indicator_color2 0x0000FF
#property indicator_label2 "Sell"

#property indicator_type3 DRAW_ARROW
#property indicator_width3 1
#property indicator_color3 0x04CC04
#property indicator_label3 "Buy Reversal"

#property indicator_type4 DRAW_ARROW
#property indicator_width4 1
#property indicator_color4 0xE81AC6
#property indicator_label4 "Sell Reversal"

#define PLOT_MAXIMUM_BARS_BACK 5000
#define OMIT_OLDEST_BARS 50

//--- indicator buffers
double Buffer1[];
double Buffer2[];
double Buffer3[];
double Buffer4[];

input double Oversold = 30;
input double Overbought = 70;
datetime time_alert; //used when sending alert
input bool Audible_Alerts = true;
input bool Push_Notifications = true;
double myPoint; //initialized in OnInit
int RSI_handle;
double RSI[];
double Open[];
double Close[];
int MA_handle;
double MA[];
int MA_handle2;
double MA2[];
int MA_handle3;
double MA3[];
int MA_handle4;
double MA4[];
double Low[];
double High[];

void myAlert(string type, string message)
  {
   if(type == "print")
      Print(message);
   else if(type == "error")
     {
      Print(type+" | Trend Constraint V1.03 @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
     }
   else if(type == "order")
     {
     }
   else if(type == "modify")
     {
     }
   else if(type == "indicator")
     {
      if(Audible_Alerts) Alert(type+" | Trend Constraint V1.03 @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
      if(Push_Notifications) SendNotification(type+" | Trend Constraint V1.03 @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
     }
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {   
   SetIndexBuffer(0, Buffer1);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(0, PLOT_ARROW, 241);
   SetIndexBuffer(1, Buffer2);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(1, PLOT_ARROW, 242);
   SetIndexBuffer(2, Buffer3);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(2, PLOT_ARROW, 236);
   SetIndexBuffer(3, Buffer4);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(3, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1));
   PlotIndexSetInteger(3, PLOT_ARROW, 238);
   //initialize myPoint
   myPoint = Point();
   if(Digits() == 5 || Digits() == 3)
     {
      myPoint *= 10;
     }
   RSI_handle = iRSI(NULL, PERIOD_CURRENT, 14, PRICE_CLOSE);
   if(RSI_handle < 0)
     {
      Print("The creation of iRSI has failed: RSI_handle=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle = iMA(NULL, PERIOD_CURRENT, 7, 0, MODE_SMMA, PRICE_CLOSE);
   if(MA_handle < 0)
     {
      Print("The creation of iMA has failed: MA_handle=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle2 = iMA(NULL, PERIOD_CURRENT, 400, 0, MODE_SMA, PRICE_CLOSE);
   if(MA_handle2 < 0)
     {
      Print("The creation of iMA has failed: MA_handle2=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle3 = iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_EMA, PRICE_CLOSE);
   if(MA_handle3 < 0)
     {
      Print("The creation of iMA has failed: MA_handle3=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle4 = iMA(NULL, PERIOD_CURRENT, 200, 0, MODE_SMA, PRICE_CLOSE);
   if(MA_handle4 < 0)
     {
      Print("The creation of iMA has failed: MA_handle4=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   int limit = rates_total - prev_calculated;
   //--- counting from 0 to rates_total
   ArraySetAsSeries(Buffer1, true);
   ArraySetAsSeries(Buffer2, true);
   ArraySetAsSeries(Buffer3, true);
   ArraySetAsSeries(Buffer4, true);
   //--- initial zero
   if(prev_calculated < 1)
     {
      ArrayInitialize(Buffer1, EMPTY_VALUE);
      ArrayInitialize(Buffer2, EMPTY_VALUE);
      ArrayInitialize(Buffer3, EMPTY_VALUE);
      ArrayInitialize(Buffer4, EMPTY_VALUE);
     }
   else
      limit++;
   datetime Time[];
   
   datetime TimeShift[];
   if(CopyTime(Symbol(), PERIOD_CURRENT, 0, rates_total, TimeShift) <= 0) return(rates_total);
   ArraySetAsSeries(TimeShift, true);
   int barshift_M1[];
   ArrayResize(barshift_M1, rates_total);
   int barshift_D1[];
   ArrayResize(barshift_D1, rates_total);
   for(int i = 0; i < rates_total; i++)
     {
      barshift_M1[i] = iBarShift(Symbol(), PERIOD_M1, TimeShift[i]);
      barshift_D1[i] = iBarShift(Symbol(), PERIOD_D1, TimeShift[i]);
   }
   if(BarsCalculated(RSI_handle) <= 0) 
      return(0);
   if(CopyBuffer(RSI_handle, 0, 0, rates_total, RSI) <= 0) return(rates_total);
   ArraySetAsSeries(RSI, true);
   if(CopyOpen(Symbol(), PERIOD_M1, 0, rates_total, Open) <= 0) return(rates_total);
   ArraySetAsSeries(Open, true);
   if(CopyClose(Symbol(), PERIOD_D1, 0, rates_total, Close) <= 0) return(rates_total);
   ArraySetAsSeries(Close, true);
   if(BarsCalculated(MA_handle) <= 0) 
      return(0);
   if(CopyBuffer(MA_handle, 0, 0, rates_total, MA) <= 0) return(rates_total);
   ArraySetAsSeries(MA, true);
   if(BarsCalculated(MA_handle2) <= 0) 
      return(0);
   if(CopyBuffer(MA_handle2, 0, 0, rates_total, MA2) <= 0) return(rates_total);
   ArraySetAsSeries(MA2, true);
   if(BarsCalculated(MA_handle3) <= 0) 
      return(0);
   if(CopyBuffer(MA_handle3, 0, 0, rates_total, MA3) <= 0) return(rates_total);
   ArraySetAsSeries(MA3, true);
   if(BarsCalculated(MA_handle4) <= 0) 
      return(0);
   if(CopyBuffer(MA_handle4, 0, 0, rates_total, MA4) <= 0) return(rates_total);
   ArraySetAsSeries(MA4, true);
   if(CopyLow(Symbol(), PERIOD_CURRENT, 0, rates_total, Low) <= 0) return(rates_total);
   ArraySetAsSeries(Low, true);
   if(CopyHigh(Symbol(), PERIOD_CURRENT, 0, rates_total, High) <= 0) return(rates_total);
   ArraySetAsSeries(High, true);
   if(CopyTime(Symbol(), Period(), 0, rates_total, Time) <= 0) return(rates_total);
   ArraySetAsSeries(Time, true);
   //--- main loop
   for(int i = limit-1; i >= 0; i--)
     {
      if (i >= MathMin(PLOT_MAXIMUM_BARS_BACK-1, rates_total-1-OMIT_OLDEST_BARS)) continue; //omit some old rates to prevent "Array out of range" or slow calculation   
      
      if(barshift_M1[i] < 0 || barshift_M1[i] >= rates_total) continue;
      if(barshift_D1[i] < 0 || barshift_D1[i] >= rates_total) continue;
      
      //Indicator Buffer 1
      if(RSI[i] < Oversold
      && RSI[i+1] > Oversold //Relative Strength Index crosses below fixed value
      && Open[barshift_M1[i]] >= Close[1+barshift_D1[i]] //Candlestick Open >= Candlestick Close
      && MA[i] > MA2[i] //Moving Average > Moving Average
      && MA3[i] > MA4[i] //Moving Average > Moving Average
      )
        {
         Buffer1[i] = Low[i]; //Set indicator value at Candlestick Low
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Buy"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer1[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 2
      if(RSI[i] > Overbought
      && RSI[i+1] < Overbought //Relative Strength Index crosses above fixed value
      && Open[barshift_M1[i]] <= Close[1+barshift_D1[i]] //Candlestick Open <= Candlestick Close
      && MA[i] < MA2[i] //Moving Average < Moving Average
      && MA3[i] < MA4[i] //Moving Average < Moving Average
      )
        {
         Buffer2[i] = High[i]; //Set indicator value at Candlestick High
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Sell"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer2[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 3
      if(MA3[i] > MA4[i]
      && MA3[i+1] < MA4[i+1] //Moving Average crosses above Moving Average
      )
        {
         Buffer3[i] = Low[i]; //Set indicator value at Candlestick Low
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Buy Reversal"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer3[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 4
      if(MA3[i] < MA4[i]
      && MA3[i+1] > MA4[i+1] //Moving Average crosses below Moving Average
      )
        {
         Buffer4[i] = High[i]; //Set indicator value at Candlestick High
         if(i == 1 && Time[1] != time_alert) myAlert("indicator", "Sell Reversal"); //Alert on next bar open
         time_alert = Time[1];
        }
      else
        {
         Buffer4[i] = EMPTY_VALUE;
        }
     }
   return(rates_total);
  }
//Thank you for getting this far, you are amazing.
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+


最終システムの結果を探る

このシステムの結果は印象的です。シグナルシステムをD1市場センチメントに限定し、EMA(100)とSMA(200)のクロスオーバーを通じて反転インパルスが起こったときにシグナルを受信することもできるようになりました。以下は、実際のチャート履歴で指標の出力を示した画像です。このシステムは、市場心理の変化をとらえ、反転の可能性のあるポイントを特定する上で、非常に優れた性能を発揮しているようです。D1市場のセンチメントに注目し、EMA(100)とSMA(200)のクロスオーバーシグナルを活用することで、取引戦略を強化し、より多くの情報に基づいた意思決定をおこなうことができます。過去のチャートデータの指標出力は、市場の動きを予測する上で、これらのシグナルが有効であることを明確に示しています。

USDJPYM1とTrend Constraint v1.03

図4:USDJPYmicroM1におけるTrend Constraint V1.03の結果

注:指標を追加した後、チャートにシグナル矢印が表示されないという問題が発生した場合は、MT5チャート上でマウスの右ボタンを右クリックし、表示されるメニューから[更新]を選択して更新してみてください。

ここでおこなっている開発から収集されたデータは、後に機械学習や人工知能システムに組み込んで、さらに改良を加えることができます。これらのシステムは、高度な分析をおこなうように訓練することができ、現在のモデルで直面している課題を克服するのに有益になるでしょう。上の結果画像のシグナルはその考えに沿ったものですが、誤解を招くようなシグナルもありました。これはどのようなシステムにとっても典型的なことであり、現在のシステムを改善するための新たな方法を模索する動機となります。Deriv Limitedが提供するこのシステムを利用すると、シンセティックはさまざまな結果をもたらします。


ビデオ結果説明

新バージョン開発のパフォーマンスについては、以下のビデオをご覧ください。




結論

トレンドの変化を検出する機能をシステムに取り入れることで、システムは大幅に強化されました。ここではシグナルを現在の市場トレンドに限定していますが、D1センチメントがトレンドを支持しているにもかかわらず、無効となったトレンドを裏付けるシグナルから発生する可能性のある損失を軽減することに成功しています。トレンドが持続している間、このシステムが提供する反転シグナルに問題が発生したことがあります。これに対処するため、移動平均の利用期間を延長することにしました。次回以降、このトピックを再び取り上げ、この調整がどのように展開されたかを掘り下げていきたいです。読者がこの会話に価値を見いだしたことを信じます。以下のコメント欄で考えを歓迎します。今後の記事では、汎用性の高いMQL5言語を使用した、私たちの指標システムの高度な視覚化を取り入れる予定です。




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

EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
MQL5における修正グリッドヘッジEA(第4部):シンプルなグリッド戦略の最適化(I) MQL5における修正グリッドヘッジEA(第4部):シンプルなグリッド戦略の最適化(I)
この第4部では、以前に開発したシンプルヘッジとシンプルグリッドエキスパートアドバイザー(EA)を再考します。最適な戦略の使用を目指し、数学的分析と総当り攻撃アプローチを通じてシンプルグリッドEAを改良することに焦点を移します。戦略の数学的最適化について深く掘り下げ、後の回でコーディングに基づく最適化を探求するための舞台を整えます。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
Pythonでの見せかけの回帰 Pythonでの見せかけの回帰
見せかけの回帰は、2つの時系列がまったくの偶然で高い相関を示し、回帰分析で誤解を招く結果をもたらす場合に発生します。このような場合、変数が関連しているように見えても、その相関関係は偶然であり、モデルの信頼性は低くなります。