English Deutsch
preview
チャート同期でテクニカル分析を簡単にする

チャート同期でテクニカル分析を簡単にする

MetaTrader 5 |
96 0
Hlomohang John Borotho
Hlomohang John Borotho

テクニカル分析中にトレーダーが直面する一般的な課題の1つは、異なる時間足にわたるチャート注釈の不一致です。 多くの取引プラットフォームでは、トレーダーが時間足間を移動するときにトレンドラインやゾーンなどのグラフィックオブジェクトを複数の時間足に表示できますが、複数の時間足を並べて分析するのは依然として効率的とは言えません。トレーダーはより広範な技術的視点を得るために、同じ銘柄に対して異なる時間足に設定された複数のチャートウィンドウを開くことがよくあります。しかし同期されていない場合、各チャートは独立して動作します。つまり、スクロール、ズーム、銘柄の切り替えなどの変更を各チャートで繰り返す必要があり、分析が分断され、作業負荷が増加し、重要な合流点を見逃すリスクが高まります。

「Chart Synchronization」は、異なる時間足にわたる同じ銘柄の複数のチャートウィンドウをリンクすることで、この問題を解決します。パン、ズーム、銘柄変更などの操作はすべての同期したチャートに反映されるため、トレーダーは複数の時間足で同じプライスアクションの文脈をシームレスに確認し、比較できます。この統合された操作により、分析ワークフローが合理化され、手作業が削減され、より一貫性と精度の高い多時間足分析が可能になり、最終的には迅速かつ情報に基づいた取引判断をおこなうことができます。



Chart Synchronizationインジケーターの設計とロジック

コア目標

上位の時間足で描画されたオブジェクトが、階層とスタイルを保持したまま、下位時間足に自動表示される、多時間足チャートの同期システムを作成すること。

1. 主な機能要件

  • 基本時間足の選択:ユーザーは入力パラメータからベース時間足を選択します。他のすべてのチャートは同じ銘柄に同期されますが、時間足は異なります。
  • 時間足階層:          
PERIOD_H1 (Highest)
   ↓
PERIOD_M30
   ↓
PERIOD_M15
   ↓
PERIOD_M5 (Lowest)
  • オブジェクトの伝播ルール:任意の時間足で作成されたオブジェクトは、すべての下位時間足に自動的に表示されます(自動下方伝播)。例:H1オブジェクトはM30、M15、M5に表示されます。
  • リセット機能:同期されたチャート上のすべてのオブジェクトをクリアします(価格チャートは保持します)。

2. システムアーキテクチャ

システムアーキテクチャ

3. ワークフローロジック

ワークフローロジック

4. 伝播ロジック

伝播ロジック

5. 開発プロセス

  • チャートの初期化:ベースチャートをユーザー選択の時間足に設定し、残りの時間足(H1/M30/M15/M5)に他のチャートを割り当てます。同期グループのチャートIDを保存します。
  • オブジェクト追跡:オブジェクトに元の時間足を示すメタデータを付与し、クローンID [OriginalName]_clone_[ChartID]を生成します。
  • 階層管理:時間足の優先順位リストを維持します。            
const ENUM_TIMEFRAMES timeframes[4] = {PERIOD_H1, PERIOD_M30, PERIOD_M15, PERIOD_M5};
  • システムのリセット:価格チャート要素とリセットボタン自体を除く、すべてのオブジェクトを削除します。


導入手順

//+------------------------------------------------------------------+
//|                                        ChartSyncIndicator.mq5    |
//|                                  Copyright 2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "GIT under MetaQuotes Ltd."
#property version   "1.01"
#property indicator_chart_window
#property indicator_plots 0

input ENUM_TIMEFRAMES BaseTimeframe = PERIOD_H1;  // Base timeframe for objects
input bool SyncAllTimeframes = false;
input color DefaultObjColor = clrDodgerBlue;
input ENUM_LINE_STYLE DefaultObjStyle = STYLE_SOLID;
input int DefaultObjWidth = 2;
input bool DefaultObjBack = true;
input bool SyncUnlockedObjects = false;
input int   ResetButtonX = 10;
input int   ResetButtonY = 20;

まず、Chart Synchronizationインジケーターのユーザー設定可能な入力パラメータを定義します。BaseTimeFrameでは、ユーザーがグラフィカルオブジェクトを他のチャートに同期させる主要な時間足(例:H1)を選択できます。SyncAllTimeFramesはブール値で、オブジェクトをすべての時間足に同期するか、選択した時間足のみに同期するかを決定します。オブジェクトの視覚プロパティは、明確で一貫した表示のためにカスタマイズ可能です。たとえば、色(DefaultObjColor)、線のスタイル(DefaultObjStyle)、線の幅(DefaultObjWidth)などを設定できます。DefaultObjBackは、オブジェクトをチャートの背景に表示するかどうかを決定します。

SyncUnlockedObjectsは、ロック解除されたオブジェクトのみを同期するかどうかを指定し、編集可能な要素を制御します。最後に、ResetButtonXとResetButtonYは、同期された描画をクリアするためのリセットボタンの画面上の位置を決定します。

#define OBJ_ORIGIN_TF   "OBJ_ORIGIN_TF_"
#define RESET_BUTTON    "resetBtn"

long baseChartID;
string baseSymbol;
string timeframesAssigned[];
ENUM_TIMEFRAMES availableTFs[4] = {PERIOD_H1, PERIOD_M30, PERIOD_M15, PERIOD_M5};
ここでは、チャート同期システムで使用される基本的な定数と変数を設定します。#defineディレクティブは、オブジェクトに元の時間足をタグ付けするための接頭辞として使用する「OBJ_ORIGIN_TF_」と、画面上のリセットボタンを表す「resetBtn」の2つの文字列定数を作成します。baseChartID変数には、同期の基準となるメインチャート(ベースチャート)のIDが格納されます。baseSymbolは、そのチャートの銘柄を保持します。timeframesAssignedは、同期対象としてユーザーが選択した時間足を格納する動的な文字列配列です。最後に、availableTFsはH1、M30、M15、M5の4つの特定の時間足を格納する固定配列です。 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
   baseChartID = ChartID();
   baseSymbol = Symbol();
   
   // Set this chart to user-selected base timeframe
   if(Period() != BaseTimeframe) {
      ChartSetSymbolPeriod(baseChartID, baseSymbol, BaseTimeframe);
   }
   
   AssignTimeframesToCharts();
   CreateResetButtons();
   return INIT_SUCCEEDED;
}

インジケーターが読み込まれると、まず現在のチャートのID (baseChartID)と銘柄(baseSymbol)を取得します。次に、現在のチャートの時間足がユーザー定義のBaseTimeFrameと一致するかを確認します。一致しない場合は、ChartSetSymbolPeriod()を使用してチャートを指定された基本時間足に自動的に切り替えます。正しい時間足が設定されたことを確認した後、同期対象となるチャートと時間足を割り当て、追跡するAssignTimeFramesToChart()と、同期されたオブジェクトをユーザーがリセットまたは更新できるようチャート上にユーザーインターフェースのボタンを描画するCreateResetButtons()の2つのヘルパー関数を呼び出します。

void AssignTimeframesToCharts() {
   // Create a list of timeframes excluding the base TF
   ENUM_TIMEFRAMES timeframes[3];
   int index = 0;
   
   for(int i = 0; i < 4; i++) {
      if(availableTFs[i] != BaseTimeframe) {
         timeframes[index] = availableTFs[i];
         index++;
      }
   }
   
   int tfIndex = 0;
   long currChart = ChartFirst();
   ArrayResize(timeframesAssigned, 0);
   
   while(currChart != -1 && tfIndex < ArraySize(timeframes)) {
      if(currChart != baseChartID) {
         ChartSetSymbolPeriod(currChart, baseSymbol, timeframes[tfIndex]);
         int size = ArraySize(timeframesAssigned);
         ArrayResize(timeframesAssigned, size + 1);
         timeframesAssigned[size] = (string)currChart;
         tfIndex++;
      }
      currChart = ChartNext(currChart);
   }
}

AssignTimeFramesToChart関数は、同期のためにさまざまなチャート時間足(ベース時間足を除く)を準備して割り当てる役割を担います。まず、事前定義されたavailableTFsリストから非ベース時間足を保持するための一時配列timeframesを作成します。availableTFsをループし、ユーザーが選択したBaseTimeFrameと一致しない時間足をtimeframes配列に追加します。これにより、代替時間足(例:H1がベースの場合はM30、M15、M5)のみが同期のために個別のチャートウィンドウに割り当てられます。

次に、この関数はChartFirst()とChartNext()を使用して開いているすべてのチャートウィンドウをループし、同期候補のチャートを検索します。ベースチャート(baseChartIDを使用)をスキップし、ChartSetSymbolPeriod()を使用して、フィルターされた時間足の1つを各利用可能なチャートに割り当てます。各チャートに時間足が割り当てられると、そのチャートIDは文字列に変換され、同期に参加しているチャートを追跡するtimeframesAssigned配列に保存されます。すべての非ベース時間足が割り当てられるか、利用可能なチャートがなくなると、ループは停止します。

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {
   switch(id) {
      case CHARTEVENT_OBJECT_CREATE:
      case CHARTEVENT_OBJECT_DRAG:
         PropagateObject(sparam, (ENUM_TIMEFRAMES)Period());
         break;
      case CHARTEVENT_OBJECT_DELETE:
         DeleteSyncedInstances(sparam);
         break;
      case CHARTEVENT_OBJECT_CLICK:
         if(sparam == RESET_BUTTON) {
            DeleteAllSyncedObjects();
         }
         break;
   }
}

OnChartEvent()関数は、チャートオブジェクトに対するユーザーの操作を処理し、それに応じて同期を維持します。オブジェクトが作成または移動された場合(OBJECT_CREATEまたはOBJECT_DRAG)、PropagateObject()関数が呼び出され、現在の時間足に基づいて同期したすべてのチャートにオブジェクトを複製または更新します。オブジェクトが削除された場合(OBJECT_DELETE)、DeleteSyncedInstances()関数が他のチャート上の同期コピーをすべて削除します。さらに、ユーザーがリセットボタン(OBJECT_CLICKかつsparam == RESET_BUTTON)をクリックした場合、DeleteAllSyncedObjects()が実行され、時間足全体で同期したすべてのグラフィックオブジェクトが削除されます。このイベント駆動型ロジックにより、チャートオブジェクトへの変更は、多時間足設定全体に即座に反映され、適切に処理されます。

void PropagateObject(string objName, ENUM_TIMEFRAMES srcTF) {
   if(StringFind(objName, "_clone_") != -1) return;
   bool isLocked = ObjectGetInteger(ChartID(), objName, OBJPROP_SELECTABLE);
   if(!SyncUnlockedObjects && !isLocked) return;

   for(int i = 0; i < ArraySize(timeframesAssigned); i++) {
      long targetChart = (long)StringToInteger(timeframesAssigned[i]);
      ENUM_TIMEFRAMES targetTF = (ENUM_TIMEFRAMES)ChartPeriod(targetChart);
      bool shouldPropagate = false;
      
      if(SyncAllTimeframes) {
         shouldPropagate = true;
      }
      else {
         // Propagate from base timeframe to all others
         if(srcTF == BaseTimeframe) {
            shouldPropagate = true;
         }
         // Propagate from other timeframes only to lower timeframes
         else if(srcTF > targetTF) {
            shouldPropagate = true;
         }
      }
      
      if(shouldPropagate) {
         CloneObject(objName, ChartID(), targetChart);
      }
   }
}

PropagateObject()関数は、異なるチャートの時間足にわたってトレンドラインや図形などのグラフィックオブジェクトを同期する役割を担います。まず、すでにクローンであるオブジェクト(名前に「clone」と含まれるもの)を除外し、コピーが再帰的に伝播されるのを回避します。次に、オブジェクトがロックされているかどうか(選択可能かどうか)を確認します。SyncUnlockedObjects設定がfalseでオブジェクトがロックされていない場合、関数は早期に終了し、ユーザーが承認したオブジェクトまたは編集可能なオブジェクトのみが伝播されるようにします。これにより、レプリケーションを意図していない非対話型オブジェクトの偶発的な同期が防止されます。

関数の中心処理では、timeframesAssigned配列に格納されたすべての割り当てチャートを順に処理します。各ターゲットチャートについて、現在の同期ルールに基づきオブジェクトを伝播するか評価します。SyncAllTimeframesが有効な場合、オブジェクトはソースやターゲットの時間足に関係なくすべてのチャートに複製されます。それ以外の場合は次の論理ルールに従います。オブジェクトがBaseTimeframeから作成された場合、他のすべての時間足に伝播します。また、オブジェクトが上位時間足(例:H1)から作成され、ターゲットが下位時間足(例:M15)の場合も伝播されます。これらの条件を満たすと、CloneObject()が呼び出され、ソースチャートからターゲットチャートにオブジェクトが複製され、時間足全体で視覚的一貫性が維持されます。

void CloneObject(string objName, long srcChart, long targetChart) {
   int type = (int)ObjectGetInteger(srcChart, objName, OBJPROP_TYPE);
   string newName = objName + "_clone_" + (string)targetChart;
   if(!ObjectCreate(targetChart, newName, (ENUM_OBJECT)type, 0, 0, 0)) return;

   datetime time1 = (datetime)ObjectGetInteger(srcChart, objName, OBJPROP_TIME, 0);
   double price1 = ObjectGetDouble(srcChart, objName, OBJPROP_PRICE, 0);
   ObjectSetInteger(targetChart, newName, OBJPROP_TIME, 0, time1);
   ObjectSetDouble(targetChart, newName, OBJPROP_PRICE, 0, price1);

   datetime time2 = (datetime)ObjectGetInteger(srcChart, objName, OBJPROP_TIME, 1);
   double price2 = ObjectGetDouble(srcChart, objName, OBJPROP_PRICE, 1);
   if(time2 > 0 || price2 > 0) {
      ObjectSetInteger(targetChart, newName, OBJPROP_TIME, 1, time2);
      ObjectSetDouble(targetChart, newName, OBJPROP_PRICE, 1, price2);
   }

   color objColor = ObjectGetInteger(srcChart, objName, OBJPROP_COLOR, 0);
   ENUM_LINE_STYLE objStyle = (ENUM_LINE_STYLE)ObjectGetInteger(srcChart, objName, OBJPROP_STYLE, 0);
   int objWidth = ObjectGetInteger(srcChart, objName, OBJPROP_WIDTH, 0);
   bool objBack = ObjectGetInteger(srcChart, objName, OBJPROP_BACK, 0);

   ObjectSetInteger(targetChart, newName, OBJPROP_COLOR, objColor != clrNONE ? objColor : DefaultObjColor);
   ObjectSetInteger(targetChart, newName, OBJPROP_STYLE, objStyle);
   ObjectSetInteger(targetChart, newName, OBJPROP_WIDTH, objWidth);
   ObjectSetInteger(targetChart, newName, OBJPROP_BACK, objBack);
   ObjectSetInteger(targetChart, newName, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(targetChart, newName, OBJPROP_HIDDEN, true);

   string originTag = OBJ_ORIGIN_TF + EnumToString((ENUM_TIMEFRAMES)Period());
   ObjectSetString(targetChart, newName, OBJPROP_TOOLTIP, originTag);

   if(type == OBJ_TEXT || type == OBJ_LABEL) {
      string txt = ObjectGetString(srcChart, objName, OBJPROP_TEXT);
      ObjectSetString(targetChart, newName, OBJPROP_TEXT, txt);
   }

   if(type == OBJ_FIBO) {
      int levels = (int)ObjectGetInteger(srcChart, objName, OBJPROP_LEVELS);
      ObjectSetInteger(targetChart, newName, OBJPROP_LEVELS, levels);
      for(int i = 0; i < levels; i++) {
         double level = ObjectGetDouble(srcChart, objName, OBJPROP_LEVELVALUE, i);
         ObjectSetDouble(targetChart, newName, OBJPROP_LEVELVALUE, i, level);
      }
   }
}

CloneObject()関数は、ソースチャート(srcChart)からターゲットチャート(targetChart)にグラフィカルオブジェクトを複製する役割を担います。まず、オブジェクトの種類(トレンドライン、長方形、フィボナッチなど)を取得し、元の名前に「_clone_」とターゲットチャートのIDを追加して新しい一意の名前を生成します。ObjectCreate()でターゲットチャートにオブジェクトを作成できない場合、関数は処理を中止します。次に、ソースオブジェクトの最初の座標(時間と価格)をコピーし、複製オブジェクトの同じ位置に割り当てます。2番目の座標が存在する場合(トレンドラインやチャネルなど)、同様に転送されます。

続いて、クローンオブジェクトに視覚的プロパティを適用し外観を保持します。色、線のスタイル(実線、破線など)、幅、背景レイヤー(OBJPROP_BACK)が設定されます。クローンオブジェクトは選択不可(OBJPROP_SELECTABLE = false)かつオブジェクトリストから非表示(OBJPROP_HIDDEN = true)となるため、誤編集を防ぎつつ画面を整理できます。さらにOBJPROP_TOOLTIPでツールチップを追加し、元の時間足の情報をタグとして付与します。これは、複数の同期されたチャートでの作業時に、オブジェクトの出所を判別するのに役立ちます。

最後に、この関数は特殊なオブジェクトタイプを処理します。オブジェクトがテキストラベルまたは単純ラベルの場合、表示されているテキストコンテンツをクローンに転送します。フィボナッチオブジェクト(OBJ_FIBO)の場合は、レベル数とそれぞれの価格レベルをコピーし、ターゲットチャート上でもフィボナッチ構造が正確に保持されるようにします。座標および視覚的、構造的プロパティを完全に複製することで、CloneObject()は同期されたオブジェクトが元のオブジェクトに忠実であることを保証し、すべての選択された時間足で一貫したテクニカル分析を可能にします。

//+------------------------------------------------------------------+
//| Required OnCalculate 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[]) {
   return(rates_total);
}

このインジケーターは、チャートイベントとオブジェクト操作のみで動作するため、コアロジックについてはOnCalculate()に依存しません。しかし、すべてのカスタムインジケーターではOnCalculate()関数が必須であり、省略するとコンパイルエラーが発生します。この要件を満たすため、計算をおこなわずに単にrates_totalを返す最小限のスタブが含まれています。

void DeleteSyncedInstances(string objName) {
   long thisChart = ChartID();
   bool isClone = StringFind(objName, "_clone_") != -1;
   string baseName = isClone ? StringSubstr(objName, 0, StringFind(objName, "_clone_")) : objName;

   // Delete from all charts
   ObjectDelete(thisChart, objName);
   for(int i = 0; i < ArraySize(timeframesAssigned); i++) {
      long chartID = (long)StringToInteger(timeframesAssigned[i]);
      ObjectDelete(chartID, baseName);
      ObjectDelete(chartID, baseName + "_clone_" + (string)thisChart);
   }
}

DeleteSyncedInstances()関数は、1つのチャートからグラフィカルオブジェクトが削除された際に、他のチャート上の同期したすべての対応オブジェクトも削除されることを保証します。まず、削除対象のオブジェクトがクローンかどうか(名前に「_clone_」が含まれているかで判定)を確認し、それに応じて元のベース名を抽出します。次に、現在のチャートからオブジェクトを削除し、timeframesAssignedに登録されているすべてのチャートを順に処理して、ベースオブジェクトおよび当該チャートに関連するクローンの両方を削除します。

void DeleteAllSyncedObjects() {
   long chartIDs[];
   ArrayResize(chartIDs, ArraySize(timeframesAssigned) + 1);
   chartIDs[0] = baseChartID;
   for(int i = 0; i < ArraySize(timeframesAssigned); i++)
      chartIDs[i + 1] = (long)StringToInteger(timeframesAssigned[i]);

   for(int j = 0; j < ArraySize(chartIDs); j++) {
      int total = ObjectsTotal(chartIDs[j]);
      for(int i = total - 1; i >= 0; i--) {
         string name = ObjectName(chartIDs[j], i);
         if(StringFind(name, RESET_BUTTON) == -1)
            ObjectDelete(chartIDs[j], name);
      }
   }
}

DeleteAllSyncedObjects()関数は、リセットボタン自体を除き、同期したすべてのチャート上のすべてのグラフィカルオブジェクトを削除します。まず、ベースチャートIDとtimeframesAssignedリストに含まれるすべてのチャートIDを格納した配列chartIDsを作成します。次に、これらのチャートそれぞれについて、既存のすべてのオブジェクトを逆順に反復処理して削除します。ただし、オブジェクト名に「RESET_BUTTON」が含まれる場合は削除せず、リセット用インターフェースを保持します。この関数により、同期したすべての図形をワークスペースから迅速にクリアすることが可能です。

void CreateResetButtons() {
   CreateResetButtonOnChart(baseChartID);
   for(int i=0; i<ArraySize(timeframesAssigned); i++)
      CreateResetButtonOnChart((long)StringToInteger(timeframesAssigned[i]));
}
CreateResetButtons()関数は、ベースチャートおよびすべての同期チャートにリセットボタンを追加します。割り当てられた各チャートをループ処理し、CreateResetButtonOnChart()を呼び出すことで、ユーザーはベースチャート上のすべての同期オブジェクトをワンクリックでクリアできます。

void CreateResetButtonOnChart(long cid) {
   if(ObjectFind(cid, RESET_BUTTON) >= 0) ObjectDelete(cid, RESET_BUTTON);
   if(!ObjectCreate(cid, RESET_BUTTON, OBJ_BUTTON, 0, 0, 0)) return;
   ObjectSetInteger(cid, RESET_BUTTON, OBJPROP_XDISTANCE, ResetButtonX);
   ObjectSetInteger(cid, RESET_BUTTON, OBJPROP_YDISTANCE, ResetButtonY);
   ObjectSetInteger(cid, RESET_BUTTON, OBJPROP_XSIZE, 80);
   ObjectSetInteger(cid, RESET_BUTTON, OBJPROP_YSIZE, 20);
   ObjectSetInteger(cid, RESET_BUTTON, OBJPROP_BGCOLOR, clrGray);
   ObjectSetInteger(cid, RESET_BUTTON, OBJPROP_COLOR, clrWhite);
   ObjectSetString(cid, RESET_BUTTON, OBJPROP_TEXT, "Reset All");
   ObjectSetInteger(cid, RESET_BUTTON, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(cid, RESET_BUTTON, OBJPROP_HIDDEN, false);
   ChartRedraw(cid);
}

CreateResetButtonOnChart()関数は、指定されたチャート(cid)に[Reset All]ボタンを作成します。まず、同じ名前のボタンが既に存在するか確認し、重複を避けるために削除します。次に、新しいボタン(OBJ_BUTTON)を作成し、ResetButtonXとResetButtonYで位置を設定し、固定サイズおよび背景色、文字色、ラベルのスタイルを適用します。ボタンは選択不可に設定されますが、表示はされる(HIDDEN = false)ため、ユーザーによる操作が可能です。

void OnDeinit(const int reason) {
   DeleteAllSyncedObjects();
}
最後に、インジケーターが削除されるかチャートが閉じられると、OnDeinit()関数が呼び出されます。これによりDeleteAllSyncedObjects()が実行され、同期したすべてのグラフィック要素がクリーンアップされ、残留オブジェクトがないようにします。


デモンストレーション



結論

要約すると、トレンドライン、長方形、フィボナッチレベルなどのグラフィックオブジェクトを選択した時間足にわたって自動的に複製することで、テクニカル分析を強化する多時間足チャート同期インジケーターを開発しました。まず、オブジェクトのスタイル、同期動作、リセットボタンなどのUIコンポーネントを制御するための構成可能な入力を設定しました。チャートウィンドウに時間足を割り当て、オブジェクトイベント(作成、移動、削除)を検出して伝播し、複製と一貫したオブジェクト命名を通じてクリーンな同期を維持する主要な機能を実装しました。さらに、リセットボタン作成や初期化解除時、ユーザー操作時のオブジェクト全削除を処理するユーティリティ関数も追加しています。

結論として、このインジケーターは、チャート間でオブジェクトを手動で再描画したり管理したりする手間を省くことで、トレーダーに多時間足分析のための強力で効率的なツールを提供します。同じ銘柄を複数の視点から確認する際に一貫性と明瞭性を確保し、分析ワークフローを合理化して認知負荷を軽減します。同期されたオブジェクトの可視性と時間足間のシームレスな操作により、トレーダーは合流点の特定や重要な価格レベルの追跡を容易におこない、より情報に基づいた意思決定が可能になります。 

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

添付されたファイル |
MQL5での取引戦略の自動化(第28回):視覚的フィードバックによるプライスアクションバットハーモニックパターンの作成 MQL5での取引戦略の自動化(第28回):視覚的フィードバックによるプライスアクションバットハーモニックパターンの作成
本記事では、MQL5で弱気と強気の両方のバット(Bat)ハーモニックパターンを、ピボットポイントとフィボナッチ比率を用いて識別し、正確なエントリー、ストップロス、テイクプロフィットレベルを用いて取引を自動化するバットパターンシステムを開発し、チャートオブジェクトによる視覚的フィードバックを強化します。
MQL5で自己最適化エキスパートアドバイザーを構築する(第13回):行列分解を用いた制御理論の簡単な入門 MQL5で自己最適化エキスパートアドバイザーを構築する(第13回):行列分解を用いた制御理論の簡単な入門
金融市場は本質的に予測が難しく、過去には利益が出ていたように見える取引戦略でも、実際の市場環境では破綻することが少なくありません。主な原因は、ほとんどの戦略が一度展開されると振る舞いが固定され、失敗から学習したり適応したりできないということです。そこで制御理論の考え方を取り入れることで、フィードバックコントローラを用いて戦略と市場の相互作用を観察し、その挙動を収益性に向けて調整することが可能になります。今回の結果では、単純な移動平均戦略にフィードバックコントローラを導入するだけで、利益の向上、リスクの低減、効率の改善が見られ、このアプローチが取引用途において大きな可能性を持つことが示されました。
MQL5でのデータベースの簡素化(第1回):データベースとSQL入門 MQL5でのデータベースの簡素化(第1回):データベースとSQL入門
MQL5言語のネイティブ関数を用いたデータベース操作について解説します。テーブルの作成、データの挿入、更新、削除から、データのインポートとエクスポートまで、すべてサンプルコード付きで紹介します。本記事は、データアクセスの内部メカニズムを理解するための確固たる基盤を提供し、MQL5でORMを構築する際の土台となります。
MQL5入門(第20回):ハーモニックパターンの基礎 MQL5入門(第20回):ハーモニックパターンの基礎
本記事では、ハーモニックパターンの基本、構造、そして取引での応用方法について解説します。フィボナッチリトレースメントやフィボナッチエクステンションについて学び、MQL5におけるハーモニックパターン検出の実装方法を理解することで、より高度な取引ツールやエキスパートアドバイザー(EA)を構築するための基礎を築くことができます。