English Deutsch
preview
プライスアクション分析ツールキットの開発(第11回):Heikin Ashi Signal EA

プライスアクション分析ツールキットの開発(第11回):Heikin Ashi Signal EA

MetaTrader 5 | 12 6月 2025, 07:44
89 0
Christian Benjamin
Christian Benjamin

はじめに

数式はプライスアクション分析の基礎として機能し、市場データを解読して取引判断を導く客観的な手法を提供します。たとえば、南アフリカの外国為替市場においてZAR/USDペアを分析するトレーダーは、50日間の単純移動平均を用いてトレンドの反転を検出し、標準偏差を適用して市場のボラティリティを測定し、潜在的なブレイクアウトを確認することがあります。設定したリスク率とストップロス幅に基づいて取引サイズを算出するなど、ポジションサイズとリスク管理のための数式を取り入れることで、トレーダーはフィボナッチリトレースメントなどのツールを用いてリスクを効果的に管理し、明確な利益目標を設定することができるようになります。

本記事では、トレンド反転の判定に用いる平均足テクニックを紹介し、定量分析と従来のプライスアクション手法を組み合わせた統合戦略に新たなレイヤーを加えます。平均足の大きな利点の一つは、市場ノイズを除去できる点です。これにより、トレーダーは小さな値動きに惑わされることなく、基礎的なトレンドに集中することができます。このアプローチは、相場の変動を平滑化し、データに基づいた意思決定を可能にする、規律あるフレームワークを提供します。また、世界中の多様な金融市場に応用可能です。

まずは平均足の定義とその起源について解説します。次に、余計な寄り道をせず戦略の中核に迫り、その仕組みを明確に理解していただきます。また、その他の主要な機能についても紹介し、完全なコードを提示したうえで、最終的な結果を検証し、本記事を締めくくります。それでは、目次をご覧ください。


平均足

平均足の手法は、18世紀の日本の米相場師である本間宗久によって考案されました。彼は、テクニカル分析の基本ツールであるローソク足チャートの先駆者としても広く知られています。日本発祥の平均足は、個々のローソク足の形状ではなく平均価格の動きに着目することで、市場のトレンドをより明確に把握するために設計されました。 日本語で「Heikin」は「平均」または「バランス」を意味し、「Ashi」は「バー」あるいは「ローソク足」を指します。この名称は、価格データを平滑化し、バランスの取れた変動の少ない市場動向を視覚化するという、平均足チャートの本質を反映しています。 それでは、以下の図をご覧ください。従来のローソク足チャートが、どのようにしてより滑らかな平均足チャートへと変換されるかを示しています。

平均足チャートと従来のローソク足チャートの比較

図1:平滑化されたチャート

以下の表は、従来のローソク足と平均足を比較し、主な違いを強調しています。

特徴 従来のローソク足 平均足
計算基準
実際の始値、高値、安値、終値を使用
価格データを平均化する修正された式を使用
ボラティリティ表示
実際の価格変動とギャップを表示
価格変動を平滑化し、ノイズを削減
トレンドの明確化
トレンドであっても、赤と緑のローソク足が交互に現れ、不安定になることがある
色の変化を少なくして、よりスムーズなトレンドを実現
ギャップの可視性
ローソク足間の価格差を表示
平均化の式によりギャップが生じることはほとんどない
反転シグナル
急速な反転と実体を表示
反転は遅いが、確認されると強力になる
価格表示
実際の市場価格を反映
価格を平均化する(最終価格は実際の市場価格と一致しない)


戦略

この戦略は、MQL5エキスパートアドバイザー(EA)における4つの主要な機能を軸に構築されています。平均足の計算、トレンドの確認、反転シグナルの識別、RSIを用いたシグナルの最終確認の4つです。以下で、それぞれの機能について詳しく解説します。

平均足の計算

平均足チャートは、各期間における始値・高値・安値・終値という4つの主要な価格データをもとに構築されます。これらの値を処理することで、従来のローソク足とは異なる平均足が生成されます。平均足では、価格の生の動きをそのまま表示するのではなく、始値と終値、さらには高値と安値を平均化して、より滑らかで流動的なトレンドを示すチャートを作成します。 

この平滑化処理により、急激な価格変動の影響が抑えられ、市場ノイズが減少し、トレンドの視認性が高まります。その結果、平均足は一般的に実体が小さく、ヒゲが長くなる傾向があり、市場の勢い(モメンタム)を強調しながら短期的なノイズを排除する効果があります。 平均足戦略を実装するにあたり、以下のフローチャートは、従来のローソク足データがどのようにして滑らかでトレンド重視の平均足チャートに変換されるのかを示しています。このプロセスは、市場のノイズを取り除き、現在のトレンドをより明確に捉えるための手法です。以下に、その仕組みをステップバイステップで解説していきます。

平均足

図2:フローチャート

フローチャートは、従来のOHLCデータ(始値、高値、安値、終値)がどのようにして平均足に変換されるかを示しています。このプロセスは、生の市場データから始まり、まず終値(haClose)を平均化することで平滑化がおこなわれます。始値(haOpen)は、前の足の値を基に計算され、チャート全体の連続性が保たれるようになっています。一方、haHighhaLowは、その足が価格の変動幅全体を正確に反映するように設定されます。その結果、短期的なノイズが抑えられ、全体的なトレンドがより明確に視認できるローソク足が形成されます。 以下は、平均足を計算するためのMQL5コードスニペットです。

void CalculateHeikinAshi()
{
   MqlRates rates[];
   int copied = CopyRates(_Symbol, _Period, 0, Bars(_Symbol, _Period), rates);

   if(copied < TrendCandles + 2)
   {
      Print("Failed to copy rates. Copied: ", copied);
      return;
   }

   ArraySetAsSeries(rates, true);

   // Resize arrays to match the number of copied bars
   ArrayResize(haClose, copied);
   ArrayResize(haOpen, copied);
   ArrayResize(haHigh, copied);
   ArrayResize(haLow, copied);

   // Calculate Heikin-Ashi values for each bar
   for(int i = copied - 1; i >= 0; i--)
   {
      haClose[i] = (rates[i].open + rates[i].high + rates[i].low + rates[i].close) / 4.0;
      haOpen[i] = (i == copied - 1) ? (rates[i].open + rates[i].close) / 2.0
                                   : (haOpen[i + 1] + haClose[i + 1]) / 2.0;
      haHigh[i] = MathMax(rates[i].high, MathMax(haOpen[i], haClose[i]));
      haLow[i] = MathMin(rates[i].low, MathMin(haOpen[i], haClose[i]));
   }

   Print("Heikin-Ashi Calculation Complete");
}

その結果、平均足は市場のノイズの大部分を排除し、基調となるトレンドをより明確に浮き彫りにします。

トレンドの確認

反転シグナルを検出する前に、EAはまず強い方向性のある値動きが存在するかを確認するためのトレンド判定をおこないます。これには、指定された本数の平均足ローソク足を連続して分析するプロセスが含まれます。上昇トレンドの場合、EAは各ローソク足の終値(haClose)が次の足よりも高いことをチェックし、下降トレンドの場合は、終値が連続して低下していることを確認します。トレンド判定に使用するローソク足の本数は、入力パラメータで制御できます。これにより、十分に確立されたトレンドのみを対象とするように設計されています。この厳格なチェックにより、市場が明確なトレンドを形成していると判断されるまでは反転検出に進まないため、誤ったシグナルを検出するリスクを最小限に抑えることができます。

int consecutive = 0;
for(int i = 2; i <= TrendCandles + 1; i++)
{
   if((haClose[i] > haClose[i + 1] && isBullish) || (haClose[i] < haClose[i + 1] && !isBullish))
      consecutive++;
   else
      break;
}
if(consecutive < ConsecutiveCandles)
   return false;

このステップでは、明確なトレンドの存在が確認された場合にのみシグナルが検出されるため、ランダムな価格変動によって生じる騙しシグナルの発生を抑えることができます。

反転シグナルの識別

確立されたトレンドが確認された後、EAは次の平均足ローソク足の構造を詳細に分析することで、反転の可能性があるシグナルを識別します。この段階では、ローソク足の実体を「haCloseとhaOpenの絶対差」として算出し、さらに髭の長さを計測します。上昇反転を検出する場合は下髭、下降反転の場合は上髭に注目します。重要な条件として、髭と実体の比率があらかじめ定められた閾値を超えている必要があります。この髭の比率が高いということは、相対的に実体が小さく、長い髭が現れていることを意味し、現在のトレンドに対する強い拒否反応を市場が示していることを表しています。このようなローソク足のパターンは、トレンドの反転が近いことを示唆する有力なシグナルとして機能します。

// Check for a strong reversal candlestick
double body = MathAbs(haClose[1] - haOpen[1]);
double shadow = (direction > 0) ? MathAbs(haLow[1] - haOpen[1])
                                : MathAbs(haHigh[1] - haOpen[1]);

// Avoid division by zero and confirm shadow-to-body ratio
if(body == 0.0 || (shadow / body) < ShadowToBodyRatio)
   return false;

このステップでは、ローソク足の構造に明確な反転の特徴が見られない限り、次の処理に進まないようにすることで、弱いシグナルや曖昧なサインを排除します。

RSIによるシグナルの確認

戦略の最終ステップでは、相対力指数(RSI)を用いて反転シグナルの信頼性をさらに高めます。平均足の条件によって反転の可能性が検出された後、EAは最新のRSI値を取得し、市場のモメンタムを評価します。上昇反転シグナルの場合は、RSIが指定された買い閾値を下回っていることが条件となります。これは、対象の資産が売られすぎの状態にあることを意味します。逆に、下降反転シグナルでは、RSIが売り閾値を上回っている必要があり、これは資産が買われすぎであることを示唆します。平均足のパターンとRSIの条件の両方が満たされた場合にのみ、EAは売買シグナルを生成します(例:チャート上に買いまたは売りの矢印を表示)。このような二重確認のアプローチにより、誤シグナルの発生が抑えられ、複数のインジケーターが反転を裏付けた場合のみ取引が実行されるようになります。

// Get RSI Value
double rsiValue;
if(!GetRSIValue(rsiValue))
{
   Print("Failed to retrieve RSI value.");
   return;
}

// Detect potential reversals with RSI confirmation
if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)  // Bullish reversal with RSI confirmation
{
   DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
   Print("Bullish Reversal Detected - RSI:", rsiValue);
}
else if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)  // Bearish reversal with RSI confirmation
{
   DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
   Print("Bearish Reversal Detected - RSI:", rsiValue);
}

RSIによる確認は、モメンタム分析の層を追加する役割を果たします。プライスアクション(平均足)とモメンタム(RSI)を組み合わせることで、EAはシグナルの信頼性を向上させ、複数のインジケーターが一致したときにのみ取引を実行するようにします。


その他の機能

入力パラメータ

コアロジックに入る前に、EAの動作を柔軟に調整するための入力パラメータ群を定義する必要があります。これらのパラメータにより、トレンドの判定条件、反転の条件、出来高の閾値、RSIの設定、およびシグナルの視覚的表示方法などを、コードを書き換えることなく制御できるようになります。

input int TrendCandles = 3;                 // Number of candles for trend detection
input double ShadowToBodyRatio = 1.5;       // Shadow-to-body ratio for reversal detection
input int ConsecutiveCandles = 2;           // Consecutive candles to confirm trend
input int RSI_Period = 14;                  // RSI Period
input double RSI_Buy_Threshold = 34.0;      // RSI level for buy confirmation
input double RSI_Sell_Threshold = 65.0;     // RSI level for sell confirmation
input color BuyArrowColor = clrGreen;       // Buy signal color
input color SellArrowColor = clrRed;        // Sell signal color

これらのパラメータは、戦略の主要な側面を柔軟にコントロールするための設定です。TrendCandlesは、トレンド判定時に考慮する平均足の本数を定義します。ShadowToBodyRatioは、強い反転ローソク足のみを対象とするための条件で、髭と実体の比率を制御します。ConsecutiveCandlesは、トレンドの方向性を確認するために必要な連続ローソク足の最小本数を指定し、弱いトレンドを除外します。RSI_Buy_ThresholdおよびRSI_Sell_Thresholdは、RSIを使ってシグナルの妥当性をさらに確認するための基準値です。BuyArrowColorとSellArrowColorによって、チャート上のシグナル表示色をカスタマイズできます。

グローバル変数

計算処理を効率的におこなうために、平均足の値を格納するためのグローバル配列や、RSIインジケーターのハンドルなどをグローバル変数として宣言します。

double haClose[], haOpen[], haHigh[], haLow[];
int rsiHandle;

これらの変数は、計算された平均足の値を保存したり、RSIの値をリアルタイムで取得するために使用されます。EA内での処理において重要な役割を果たします。

初期化(OnInit)

EAをチャートにアタッチすると、最初にOnInit()関数が実行されます。この関数では、平均足の配列を初期化し、RSIインジケーターを設定します。

int OnInit()
{
   ArraySetAsSeries(haClose, true);
   ArraySetAsSeries(haOpen, true);
   ArraySetAsSeries(haHigh, true);
   ArraySetAsSeries(haLow, true);

   if(Bars(_Symbol, _Period) < TrendCandles + 2)
   {
      Print("Not enough bars for initialization.");
      return INIT_FAILED;
   }

   rsiHandle = iRSI(_Symbol, _Period, RSI_Period, PRICE_CLOSE);
   if(rsiHandle == INVALID_HANDLE)
   {
      Print("Failed to create RSI indicator.");
      return INIT_FAILED;
   }

   Print("EA Initialized Successfully");
   return INIT_SUCCEEDED;
}

ここでは、最新のローソク足が常にインデックス0に来るように、配列を逆順で設定します。また、計算を実行する前に、十分なバー数があるかどうかを確認します。さらに、RSIインジケーターを初期化し、取得に失敗した場合はエラーハンドリングをおこないます。すべてが正しく設定された場合、EAは確認メッセージを出力し、処理を開始します。

ティック処理(OnTick)

この関数は、新しい価格ティックが発生するたびに実行され、市場を継続的に分析し、取引シグナルの可能性を検出できるようにします。

void OnTick()
{
   if(Bars(_Symbol, _Period) < TrendCandles + 2)
   {
      Print("Not enough bars for tick processing.");
      return;
   }

   CalculateHeikinAshi();

   double rsiValue;
   if(!GetRSIValue(rsiValue))
   {
      Print("Failed to retrieve RSI value.");
      return;
   }

   if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)
   {
      DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
      Print("Bullish Reversal Detected - RSI:", rsiValue);
   }
   else if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)
   {
      DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
      Print("Bearish Reversal Detected - RSI:", rsiValue);
   }
}

シグナルのタイムスタンプを基に、各矢印オブジェクトに一意の名前を生成します。同じ名前の矢印がすでに存在する場合は、重複やチャートの乱雑さを避けるために削除します。その後、新しい矢印オブジェクトを作成し、色・サイズ・タイプなどのプロパティを設定します。作成が成功した場合は、矢印が配置されたことを示す確認メッセージを出力します。

初期化解除時のクリーンアップ(OnDeinit)

EAをチャートから削除するときには、インジケーターリソースを解放して、メモリの問題を防ぐ必要があります。

void OnDeinit(const int reason)
{
   if(rsiHandle != INVALID_HANDLE)
      IndicatorRelease(rsiHandle);
}

この関数は、EAの動作が停止したときに、RSIインジケーターが適切に解除されることを保証します。


MQL5コード

//+------------------------------------------------------------------+
//|                                        Heikin Ashi Signal EA.mq5 |
//|                              Copyright 2025, Christian Benjamin. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Christian Benjamin."
#property link      "https://www.mql5.com/ja/users/lynnchris"
#property version   "1.00"
#property strict

//--- Input parameters
input int TrendCandles = 3;                 // Number of candles for trend detection
input double ShadowToBodyRatio = 1.5;       // Shadow-to-body ratio for reversal detection
input int ConsecutiveCandles = 2;           // Consecutive candles to confirm trend
input int RSI_Period = 14;                  // RSI Period
input double RSI_Buy_Threshold = 34.0;      // RSI level for buy confirmation
input double RSI_Sell_Threshold = 65.0;     // RSI level for sell confirmation
input color BuyArrowColor = clrGreen;       // Buy signal color
input color SellArrowColor = clrRed;        // Sell signal color

//--- Global variables
double haClose[], haOpen[], haHigh[], haLow[];
int rsiHandle;

//+------------------------------------------------------------------+
//| Expert initialization                                            |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(haClose, true);
   ArraySetAsSeries(haOpen, true);
   ArraySetAsSeries(haHigh, true);
   ArraySetAsSeries(haLow, true);

   if(Bars(_Symbol, _Period) < TrendCandles + 2)
     {
      Print("Not enough bars for initialization.");
      return INIT_FAILED;
     }

// Initialize RSI indicator
   rsiHandle = iRSI(_Symbol, _Period, RSI_Period, PRICE_CLOSE);
   if(rsiHandle == INVALID_HANDLE)
     {
      Print("Failed to create RSI indicator.");
      return INIT_FAILED;
     }

   Print("EA Initialized Successfully");
   return INIT_SUCCEEDED;
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Bars(_Symbol, _Period) < TrendCandles + 2)
     {
      Print("Not enough bars for tick processing.");
      return;
     }

// Calculate Heikin-Ashi
   CalculateHeikinAshi();

// Get RSI Value
   double rsiValue;
   if(!GetRSIValue(rsiValue))
     {
      Print("Failed to retrieve RSI value.");
      return;
     }

// Detect potential reversals with RSI confirmation
   if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)  // Bullish reversal with RSI confirmation
     {
      DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
      Print("Bullish Reversal Detected - RSI:", rsiValue);
     }
   else
      if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)  // Bearish reversal with RSI confirmation
        {
         DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
         Print("Bearish Reversal Detected - RSI:", rsiValue);
        }
  }

//+------------------------------------------------------------------+
//| Calculate Heikin-Ashi                                            |
//+------------------------------------------------------------------+
void CalculateHeikinAshi()
  {
   MqlRates rates[];
   int copied = CopyRates(_Symbol, _Period, 0, Bars(_Symbol, _Period), rates);

   if(copied < TrendCandles + 2)
     {
      Print("Failed to copy rates. Copied: ", copied);
      return;
     }

   ArraySetAsSeries(rates, true);

// Resize arrays to match the number of copied bars
   ArrayResize(haClose, copied);
   ArrayResize(haOpen, copied);
   ArrayResize(haHigh, copied);
   ArrayResize(haLow, copied);

// Calculate Heikin-Ashi
   for(int i = copied - 1; i >= 0; i--)
     {
      haClose[i] = (rates[i].open + rates[i].high + rates[i].low + rates[i].close) / 4.0;
      haOpen[i] = (i == copied - 1) ? (rates[i].open + rates[i].close) / 2.0 : (haOpen[i + 1] + haClose[i + 1]) / 2.0;
      haHigh[i] = MathMax(rates[i].high, MathMax(haOpen[i], haClose[i]));
      haLow[i] = MathMin(rates[i].low, MathMin(haOpen[i], haClose[i]));
     }

   Print("Heikin-Ashi Calculation Complete");
  }

//+------------------------------------------------------------------+
//| Detect Reversals with Trend Confirmation                         |
//+------------------------------------------------------------------+
bool DetectReversal(bool isBullish)
  {
   int direction = isBullish ? 1 : -1;

// Confirm trend location: Check for consecutive candles in the same direction
   int consecutive = 0;
   for(int i = 2; i <= TrendCandles + 1; i++)
     {
      if((haClose[i] > haClose[i + 1] && isBullish) || (haClose[i] < haClose[i + 1] && !isBullish))
         consecutive++;
      else
         break;
     }
   if(consecutive < ConsecutiveCandles)
      return false;

// Check for a strong reversal candlestick
   double body = MathAbs(haClose[1] - haOpen[1]);
   double shadow = (direction > 0) ? MathAbs(haLow[1] - haOpen[1]) : MathAbs(haHigh[1] - haOpen[1]);

// Avoid division by zero and confirm shadow-to-body ratio
   if(body == 0.0 || (shadow / body) < ShadowToBodyRatio)
      return false;

// Confirm the reversal with the next candlestick (opposite direction)
   return ((haClose[0] - haOpen[0]) * direction < 0);
  }

//+------------------------------------------------------------------+
//| Get RSI Value                                                    |
//+------------------------------------------------------------------+
bool GetRSIValue(double &rsiValue)
  {
   double rsiBuffer[];
   if(CopyBuffer(rsiHandle, 0, 0, 1, rsiBuffer) > 0)
     {
      rsiValue = rsiBuffer[0];
      return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Draw Arrow                                                       |
//+------------------------------------------------------------------+
void DrawArrow(string name, datetime time, double price, int code, color clr)
  {
   name += "_" + IntegerToString(time);
   if(ObjectFind(0, name) != -1)
      ObjectDelete(0, name);

   if(ObjectCreate(0, name, OBJ_ARROW, 0, time, price))
     {
      ObjectSetInteger(0, name, OBJPROP_ARROWCODE, code);
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
      Print("Arrow Drawn: ", name, " at ", price);
     }
   else
     {
      Print("Failed to create arrow: ", GetLastError());
     }
  }

//+------------------------------------------------------------------+
//| Expert deinitialization                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(rsiHandle != INVALID_HANDLE)
      IndicatorRelease(rsiHandle);
  }
//+------------------------------------------------------------------+


結果

テスト過程では、バックテストとリアルタイムの実市場テストの両方を用いてEAのパフォーマンスを評価しました。
  • バックテスト

EAを過去のデータに対して実行し、その基本的な有効性を確認するとともに、強みと弱みを明らかにしました。この段階では、既知の市場環境下でアプローチが機能することを確認できますが、スリッページや変動スプレッドなど、実際の取引に影響を与える要素を完全に再現することはできません。下のGIFを見てみましょう。

V100バックテスト

図3:V100 Indexのバックテスト

以下に、3つの異なる通貨ペアについて27日間の追加バックテスト結果を示し、シグナルの精度を評価しました。シグナルは、確認後に市場が方向転換した場合に成功とみなされます。

  • EURUSD

シグナル 合計 True  的中率
買い  20  17 85%
売り   10  8 80%

  • Crash 900 Index

シグナル 合計 True  的中率
買い 18 14 77.8%
売り  25 15 60%

  • Step Index

シグナル 合計 True  的中率
買い 18 15 83.3%
売り  22 14  63.6%

EAは非常に高い効果を示しており、テスト対象の通貨ペアにおいて、買いシグナルで最低77.8%、売りシグナルで少なくとも60%の精度を達成しました。

  • リアルタイム市場テスト
リアルタイムのテストでは、現在の市場環境下でのEAのパフォーマンスを評価しました。この評価により、市場のボラティリティや注文執行の課題に対するEAの対応力が明らかになりました。リスクを考慮し、最初は少額の資金で運用を開始してリスク管理をおこないました。

リアルタイムテスト

図4:V25 Indexのリアルタイム市場テスト

重要なポイント

バックテストは理論上の戦略の有効性を検証し、リアルタイムテストは実際のパフォーマンスを示します。どちらの段階も、EAを改良し、実際の取引に耐えうる堅牢さを確保するために不可欠です。


結論

平均足手法は、市場の変動を効果的にフィルタリングする点で特に有効です。また、市場の反転ポイントを見極めるためにも役立つことが分かりました。ほかのツール同様にテストを重ねた結果、他の戦略と組み合わせて使うことでより効率的に機能することが分かりました。コードの入力パラメータを調整し、デモ口座やバックテストで十分に試験を行いながら、ご自身の好みに合った最適なパフォーマンスを追求することが大切です。ご意見やご提案がありましたら、ぜひお寄せください。

日付 ツール名  詳細 バージョン  アップデート  備考
01/10/24 ChartProjector 前日のプライスアクションをゴースト効果でオーバーレイするスクリプト 1.0 初回リリース Lynnchris Tool Chestの最初のツール
18/11/24 Analytical Comment 前日の情報を表形式で提供し、市場の将来の方向性を予測する 1.0 初回リリース Lynnchris Tool Chestの2番目のツール
27/11/24 Analytics Master 2時間ごとに市場指標を定期的に更新  1.01 v.2 Lynnchris Tool Chestの3番目のツール
02/12/24 Analytics Forecaster  Telegram統合により、2時間ごとに市場指標を定期的に更新 1.1 v.3 ツール番号4
09/12/24 Volatility Navigator ボリンジャーバンド、RSI、ATR指標を使用して市場の状況を分析するEA 1.0 初回リリース ツール番号5
19/12/24 Mean Reversion Signal Reaper  平均回帰戦略を用いて市場を分析し、シグナルを提供する  1.0  初回リリース  ツール番号6 
9/01/25  Signal Pulse  多時間枠分析ツール 1.0  初回リリース  ツール番号7 
17/01/25  Metrics Board  分析用のボタン付きパネル  1.0  初回リリース ツール番号8 
21/01/25 External Flow 外部ライブラリによる分析 1.0  初回リリース ツール番号9 
27/01/25 VWAP 出来高加重平均価格   1.3  初回リリース  ツール番号10 
02/02/25  Heikin Ashi Signal EA トレンドの平滑化と反転シグナルの識別  1.0  初回リリース  ツール番号11 


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

添付されたファイル |
PythonとMQL5を使用した特徴量エンジニアリング(第3回):価格の角度(2)極座標 PythonとMQL5を使用した特徴量エンジニアリング(第3回):価格の角度(2)極座標
この記事では、あらゆる市場における価格レベルの変化を、それに対応する角度の変化へと変換する2回目の試みをおこないます。今回は、前回よりも数学的に洗練されたアプローチを採用しました。得られた結果は、アプローチを変更した判断が正しかった可能性を示唆しています。本日は、どの市場を分析する場合でも、極座標を用いて価格レベルの変化によって形成される角度を意味のある方法で計算する方法についてご説明します。
トレンドフォロー戦略のためのLSTMによるトレンド予測 トレンドフォロー戦略のためのLSTMによるトレンド予測
長・短期記憶(LSTM: Long Short-Term Memory)は、長期的な依存関係を捉える能力に優れ、勾配消失問題にも対処できる、時系列データ処理に特化した再帰型ニューラルネットワーク(RNN: Recurrent Neural Network)の一種です。本記事では、LSTMを活用して将来のトレンドを予測し、トレンドフォロー型戦略のパフォーマンスを向上させる方法について解説します。内容は、主要な概念と開発の背景の紹介、MetaTrader 5からのデータ取得、そのデータを用いたPythonでのモデル学習、学習済みモデルのMQL5への統合、そして統計的なバックテストに基づく結果の分析と今後の展望までを含みます。
MQL5で取引管理者パネルを作成する(第9回):コード編成(I) MQL5で取引管理者パネルを作成する(第9回):コード編成(I)
このディスカッションでは、大規模なコードベースを扱う際に直面する課題について掘り下げます。MQL5におけるコード構成のベストプラクティスを紹介し、取引管理パネルのソースコードの可読性と拡張性を向上させるための実践的なアプローチを実装します。また、他の開発者がアルゴリズム開発で活用できる再利用可能なコードコンポーネントの開発も目指しています。ぜひ最後までお読みいただき、ご意見をお寄せください。
知っておくべきMQL5ウィザードのテクニック(第53回):MFI (Market Facilitation Index) 知っておくべきMQL5ウィザードのテクニック(第53回):MFI (Market Facilitation Index)
MFI(Market Facilitation Index、マーケットファシリテーションインデックス)は、ビル・ウィリアムズによる指標の一つで、出来高と連動した価格変動の効率性を測定することを目的としています。いつものように、本記事では、ウィザードアセンブリシグナルクラスの枠組みにおいて、このインジケーターのさまざまなパターンを検証し、それに基づいたテストレポートおよび分析結果を紹介します。