English Русский 中文 Español Deutsch Português
preview
MQL5カスタムシンボル:3Dバー用シンボルの作成

MQL5カスタムシンボル:3Dバー用シンボルの作成

MetaTrader 5インディケータ |
31 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

現代の取引では、データ分析に対する従来とは異なるアプローチが求められています。従来の価格チャートは有用ではありますが、市場ダイナミクスを十分に捉えきれないことがあります。価格はあくまで一つの側面にすぎず、取引量、ボラティリティ、時間的なパターンなどを組み合わせることで、市場に対するより深い洞察を得ることができます。

MetaTrader 5プラットフォームとMQL5言語は、強力な機能であるカスタムシンボルを提供しています。これにより、トレーダーは任意のデータに基づいた合成資産を作成することが可能になります。本記事では、3Dバーを表現するカスタムシンボルを生成するインジケータ「3DBarCustomSymbol.mq5」について詳しく解説します。この3Dバーは、価格、時間、出来高、ボラティリティを独自の分析・可視化ツールへと統合したものです。

3Dバーとは、標準的なチャートに追加の次元を加えるための手法です。これにより、トレーダーは単なる価格変動だけでなく、取引の活発度、市場のボラティリティ、周期的な時間パターンといった要素も確認できるようになります。このアプローチによって、通常のローソク足チャートでは見えない隠れたパターンを発見できる可能性があります。

3DBarCustomSymbolインジケータは、MQL5の機能を利用して、取引戦略に組み込んだり、視覚的な分析に利用したりできるカスタムシンボルを作成する方法を示しています。



市場データ分析の進化

市場分析は、単純な紙のチャートから、高度なコンピュータによる分析手法や市場マイクロストラクチャ研究(出来高、オーダーフロー、取引間隔、ボラティリティのクラスタリングなど)へと進化してきました。しかし、多くの分析手法は依然として個別の要素に分断されたままでした。

3Dバーは、以下の4つの主要な次元を一つのチャート上に統合します。

  • 価格:OHLCデータ、値動きの速度と加速度、分布統計
  • 出来高:総出来高、価格レベルごとの分布、取引の活発度、異常値、積極的な買い・売りの比率
  • 時間:セッション内の周期、形成速度、時間的相関、季節的効果
  • ボラティリティ:局所的および大域的なボラティリティ、ボラティリティのクラスタ化、異常な急上昇、出来高との関係性

これにより、市場を包括的に把握することが可能になり、パターンや異常な動きを迅速に識別することができます。さらに、3Dバーは視覚的な処理が容易であるため、認知的な負荷を軽減し、特に高頻度取引において意思決定の速度を向上させます。このカスタムインジケータはMetaTrader 5に容易に統合でき、スキャルピングから長期的な取引戦略まで、さまざまな戦略に利用できます。



概念の数学的形式化

3Dバーは、多次元空間におけるベクトルとして数学的に表現することができます。

B₃D = (P, V, T, σ)

ここで

  • P:価格ベクトル(open、high、low、close、typical_price)
  • V:出来高ベクトル(volume、volume_profile、volume_acceleration)
  • T:時間ベクトル(time_sin、time_cos、time_acceleration)
  • σ:ボラティリティベクトル(local_volatility、global_volatility、volatility_change)

各構成要素には、静的要素(過去の履歴データ)と動的要素(リアルタイムデータ)の両方が含まれています。



インジケータのアーキテクチャ

このインジケータのアーキテクチャは、関心事の分離に基づいて設計されています。

初期化モジュールは以下の処理を担当します。

  • 元となるシンボルが利用可能かどうかの確認
  • 入力パラメータの検証
  • グローバル変数の設定
  • 必要なデータ構造の作成

シンボル作成モジュールには以下が含まれます。

  • カスタムシンボルを作成するための関数
  • シンボルプロパティの設定
  • 取引セッションの構成
  • メタデータの割り当て

データ処理モジュールには以下が含まれます。

  • 各種指標を計算するアルゴリズム
  • 正規化およびスケーリング関数
  • 統計計算
  • 例外処理

更新モジュールは以下の処理を提供します。

  • 新しいデータの監視
  • 現在の指標値の再計算
  • カスタムシンボルの更新
  • パフォーマンスの最適化



入力パラメータの詳細な分析

このインジケータは、カスタマイズ可能な入力パラメータを通じて柔軟な設定を提供します。以下は、コード内でこれらのパラメータを定義する例です。

input string   SourceSymbol = "EURUSD";        // Source symbol
input string   CustomSymbolName = "EURUSD_3D"; // Custom symbol name
input int      LookbackPeriod = 20;            // Lookback period
input int      HistoryDays = 100;              // Number of history days
input bool     CreateWindow = true;            // Create a chart window
input bool     UpdateInRealTime = true;        // Update in real time
input bool     ShowPrice = true;               // Show a regular price
input double   MinSpreadMultiplier = 45;       // Spread multiplier
input double   VolumeBrick = 500;              // Volume block size
input double   ScaleMin = 3.0;                 // Minimum scale value
input double   ScaleMax = 9.0;                 // Maximum scale value

ここで

  • SourceSymbol:分析対象となる基本金融商品のシンボルです。MetaTrader 5で利用可能なすべてのシンボルに対応しており、通貨ペア、株式、商品、指数、暗号資産などを含みます。
  • CustomSymbolName:作成されるカスタムシンボルの一意の名前です。データ変換の内容を反映した、意味の分かりやすい名前を使用することが推奨されます。
  • LookbackPeriod:統計指標を計算するためのスライディングウィンドウのサイズです。この値は、短期的な変化に対するインジケータの感度に影響します。小さい値(5~10)では高い感度が得られ、大きい値(50~100)ではより平滑化されたシグナルが得られます。
  • HistoryDays:初期化時に使用する過去データの取得期間です。データの読み込み時間や、長期統計の精度に影響します。最適な値は分析目的によって異なりますが、一般的には30~365日が適しています。
  • MinSpreadMultiplierおよびVolumeBrick:それぞれ価格変化と出来高変化に対するアルゴリズムの感度を決定する重要なパラメータです。
  • ScaleMinおよびScaleMax:すべての指標値を正規化するための範囲です。3~9の範囲は数秘的な発想に基づいて選択されており、視覚的な解釈性を向上させます。

OnInit関数は初期設定を実行します。この関数では、元のシンボルの存在を確認し、スプレッドに基づいて価格ブロックサイズを計算し、カスタムシンボルを作成した後、過去データを用いてそのシンボルを初期化します。以下は、その主要なコード部分です。

int OnInit()
{
   if(!SymbolSelect(SourceSymbol, true))
   {
      Print("Error: symbol ", SourceSymbol, " not found!");
      return INIT_FAILED;
   }
   
   double spread = SymbolInfoDouble(SourceSymbol, SYMBOL_ASK) - SymbolInfoDouble(SourceSymbol, SYMBOL_BID);
   double point = SymbolInfoDouble(SourceSymbol, SYMBOL_POINT);
   minPriceBrick = spread * MinSpreadMultiplier * point;
   
   if(!Create3DBarSymbol())
   {
      Print("Error creating custom symbol!");
      return INIT_FAILED;
   }
   
   if(!GenerateHistorical3DBars())
   {
      Print("Error generating historical data!");
      return INIT_FAILED;
   }
   
   if(CreateWindow)
   {
      OpenCustomChart();
   }
   
   if(UpdateInRealTime)
   {
      EventSetTimer(5);
   }
   
   Print("3D bars symbol ", CustomSymbolName, " successfully created!");
   return(INIT_SUCCEEDED);
}

Create3DBarSymbol関数は、カスタムシンボルの各種プロパティを設定します。これには、精度(小数桁数)、ティックサイズ、決済通貨などの設定が含まれます。また、この関数では取引セッションを週7日・24時間で動作するように設定します。以下が例です。

bool Create3DBarSymbol()
{
   if(SymbolSelect(CustomSymbolName, true))
   {
      CustomRatesDelete(CustomSymbolName, 0, 0);
      Print("Symbol ", CustomSymbolName, " already exists. History deleted.");
      return true;
   }
   
   int digits = (int)SymbolInfoInteger(SourceSymbol, SYMBOL_DIGITS);
   double point = SymbolInfoDouble(SourceSymbol, SYMBOL_POINT);
   double tickSize = SymbolInfoDouble(SourceSymbol, SYMBOL_TRADE_TICK_SIZE);
   double contractSize = SymbolInfoDouble(SourceSymbol, SYMBOL_TRADE_CONTRACT_SIZE);
   string baseCurrency = SymbolInfoString(SourceSymbol, SYMBOL_CURRENCY_BASE);
   string profitCurrency = SymbolInfoString(SourceSymbol, SYMBOL_CURRENCY_PROFIT);
   
   if(!CustomSymbolCreate(CustomSymbolName))
   {
      Print("Error creating custom symbol: ", GetLastError());
      return false;
   }
   
   CustomSymbolSetInteger(CustomSymbolName, SYMBOL_DIGITS, digits);
   CustomSymbolSetDouble(CustomSymbolName, SYMBOL_POINT, point);
   CustomSymbolSetDouble(CustomSymbolName, SYMBOL_TRADE_TICK_SIZE, tickSize);
   CustomSymbolSetDouble(CustomSymbolName, SYMBOL_TRADE_CONTRACT_SIZE, contractSize);
   CustomSymbolSetString(CustomSymbolName, SYMBOL_CURRENCY_BASE, baseCurrency);
   CustomSymbolSetString(CustomSymbolName, SYMBOL_CURRENCY_PROFIT, profitCurrency);
   
   string description = "3D bars (price, time, volume, volatility). Lookback: " + IntegerToString(LookbackPeriod);
   CustomSymbolSetString(CustomSymbolName, SYMBOL_DESCRIPTION, description);
   
   for(int day=0; day<7; day++)
   {
      datetime start_time = 0;
      datetime end_time = 24*60*60-1;
      CustomSymbolSetSessionQuote(CustomSymbolName, (ENUM_DAY_OF_WEEK)day, 0, start_time, end_time);
      CustomSymbolSetSessionTrade(CustomSymbolName, (ENUM_DAY_OF_WEEK)day, 0, start_time, end_time);
   }
   
   return true;
}

GenerateHistorical3DBars関数は、過去データを処理し、価格リターン、価格加速度、出来高変化、ボラティリティなどの指標を計算します。この関数では、基本データを取得するためにM15時間足を使用します。以下はコードの一部です。

bool GenerateHistorical3DBars()
{
   datetime endTime = TimeCurrent();
   datetime startTime = endTime - HistoryDays * 24 * 60 * 60;
   
   MqlRates rates[];
   int copiedRates = CopyRates(SourceSymbol, PERIOD_M15, startTime, endTime, rates);
   
   if(copiedRates <= 0)
   {
      Print("Error copying historical data: ", GetLastError());
      return false;
   }
   
   MqlRates threeDBars[];
   ArrayResize(threeDBars, copiedRates);
   int validCount = 0;
   
   double typicalPrices[], priceReturns[], priceAccelerations[], volumeChanges[], volatilities[];
   ArrayResize(typicalPrices, copiedRates);
   ArrayResize(priceReturns, copiedRates);
   ArrayResize(priceAccelerations, copiedRates);
   ArrayResize(volumeChanges, copiedRates);
   ArrayResize(volatilities, copiedRates);
   
   for(int i = 0; i < copiedRates; i++)
   {
      typicalPrices[i] = (rates[i].high + rates[i].low + rates[i].close) / 3.0;
      
      if(i > 0)
      {
         priceReturns[i] = (typicalPrices[i] - typicalPrices[i-1]) / typicalPrices[i-1];
         priceAccelerations[i] = i > 1 ? priceReturns[i] - priceReturns[i-1] : 0;
      }
      else
      {
         priceReturns[i] = 0;
         priceAccelerations[i] = 0;
      }
      
      volumeChanges[i] = i > 0 ? (rates[i].tick_volume - rates[i-1].tick_volume) / (rates[i-1].tick_volume + 1e-10) : 0;
      
      if(i >= LookbackPeriod)
      {
         double returns[];
         ArrayResize(returns, LookbackPeriod);
         for(int j = 0; j < LookbackPeriod; j++)
            returns[j] = priceReturns[i - LookbackPeriod + j + 1];
         volatilities[i] = CalculateStdDev(returns);
      }
      else
      {
         volatilities[i] = 0;
      }
   }
   // Next comes filling the 3D bars and adding them to the history
}

UpdateCurrent3DBar関数は、UpdateInRealTimeパラメータが有効になっている場合、現在のバーを5秒ごとに更新する処理を担当します。この関数では、現在のバーに対しても同じ指標を計算し、その結果をカスタムシンボルに反映します。

double ScaleValue(double value, double &values[], int start, int end)
{
   double minVal = values[start];
   double maxVal = values[start];
   
   for(int i = start; i <= end; i++)
   {
      if(values[i] < minVal) minVal = values[i];
      if(values[i] > maxVal) maxVal = values[i];
   }
   
   if(maxVal == minVal) return ScaleMin;
   
   return ScaleMin + (ScaleMax - ScaleMin) * (value - minVal) / (maxVal - minVal);
}

OpenCustomChart関数は、カスタムシンボルのチャートを開く役割を持ちます。表示形式はShowPriceパラメータによって決まり、ローソク足形式またはライン形式で表示できます。



実用例

このインジケータを使用することで、ボラティリティの分析、出来高や価格加速度における異常の検出、さらにカスタムシンボルを取引システムへ統合することが可能になります。

使用を開始するには、まずMetaEditorでコードをコンパイルし、たとえばEURUSD M15のチャートにインジケータを追加します。その後、CustomSymbolNameやLookbackPeriodなどのパラメータを設定すると、インジケータがカスタムシンボルを作成し、それを別ウィンドウで開くことができます。ShowPriceパラメータを有効にした場合、チャートには通常の価格データと、それに重ね合わせた各種指標が表示されます。無効にした場合は、合成された3Dバーのみが表示されます。

以下は典型的なチャート例です。

トレーダーは3Dバーを利用して、ニュースイベントを示唆するボラティリティ上昇局面を特定したり、出来高急増などの異常な動きを検出したりすることができます。また、このカスタムシンボルは移動平均線などのインジケータと組み合わせたり、自動売買をおこなうエキスパートアドバイザー(EA)で利用したりすることも可能です。

このインジケータは、H1やD1などの他の時間足への対応を追加することで、より大きな値動きを分析できるように改善できます。さらに、他の資産との相関関係などの追加指標を組み込むことで、インジケータの情報量を増やすことができます。パフォーマンスを最適化するためには、特に性能の低いPCを使用している場合、HistoryDaysの値を制限することが推奨されます。可視化機能については、ボリンジャーバンドなどのインジケータを追加したり、極端なボラティリティを示すバーなどの異常値を強調表示するフィルタを追加したりすることで、さらに向上させることができます。

大量の過去データを生成すると、多くのリソースを消費する可能性があります。そのため、最初は小さいHistoryDaysの値から開始してください。M15時間足は多くの金融商品に適していますが、流動性の低い資産では、より長い期間を使用する方が適しています。実際の取引で使用する前に、デモ口座でインジケータをテストし、正常に動作することを確認してください。また、3Dバーの解釈には経験が必要です。そのため、過去データ上での動きを十分に観察し、その特徴を理解してください。



結論

3DBarCustomSymbolインジケータは、MQL5におけるカスタムシンボルの可能性を示すものです。価格、時間、出来高、ボラティリティを組み合わせることで、市場分析のための独自のツールを生成します。3Dバーは、視覚的な分析、取引システムの構築、そして市場に潜むパターンの発見に適しています。自分の目的に合わせてインジケータを調整し、パラメータを変更しながら試行し、デモ口座で検証してください。MQL5は取引分野における革新的なアイデアを実現する無限の可能性を提供しており、3DBarCustomSymbolは、その機能を活用して強力な分析ツールを作成できることを示す代表的な例です。 

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/18681

添付されたファイル |
3D_Bars_EA.mq5 (39.53 KB)
最後のコメント | ディスカッションに移動 (1)
Andy An
Andy An | 17 7月 2025 において 08:34
オンラインではインジケーターが機能しません。
初級から中級まで:オブジェクトイベント(III) 初級から中級まで:オブジェクトイベント(III)
本記事では、次回の記事で扱う内容の土台を準備します。また、OBJ_LABELオブジェクトを、編集と移動の両方ができる完全にインタラクティブなものにする方法についても見ていきます。つまり、OBJ_LABELオブジェクトのテキストと位置の両方を、オブジェクトのプロパティダイアログを開くことなく変更できるようにします。
因果推論とアルゴリズム取引における回帰モデルの活用 因果推論とアルゴリズム取引における回帰モデルの活用
アルゴリズム取引における回帰モデルの活用可能性について考察します。回帰モデルは、二値分類とは異なり、予測される価格変動を定量的に表現できるため、より柔軟な取引戦略を構築できます。
市場シミュレーション(第23回):ポジション表示(I) 市場シミュレーション(第23回):ポジション表示(I)
これから扱う内容は、理論や概念の面で、これまでよりもはるかに複雑になります。できる限り内容を分かりやすく説明していきたいと思います。プログラミングそのものは、非常に単純で分かりやすいものです。しかし、その背後にある理論を理解していなければ、ここで紹介するものとは異なるタスクに対して、リプレイ/シミュレーションシステムを改良したり応用したりするための実践的な基盤を得ることはできません。私が提示するコードを単にコンパイルして利用するだけになってほしくはありません。学び、理解し、可能であれば、さらに優れたものを自分自身で作成できるようになってほしいのです。
市場取引アルゴリズム(EMA) 市場取引アルゴリズム(EMA)
本稿では、株式市場のトレーダーの行動に着想を得た市場取引アルゴリズム(EMA, Exchange Market Algorithm)について詳しく分析します。このアルゴリズムは株式取引をシミュレーションするもので、市場参加者はそれぞれ異なる成功度を持ち、利益を最大化するためにさまざまな戦略を使用します。