English Русский 中文 Español Deutsch Português
preview
ウィリアム・ギャンの手法(第2回):ギャンスクエアインジケーターの作成

ウィリアム・ギャンの手法(第2回):ギャンスクエアインジケーターの作成

MetaTrader 5 | 25 3月 2025, 08:51
87 0
Yevgeniy Koshtenko
Yevgeniy Koshtenko

はじめに

20世紀初頭の伝説的トレーダーでありテクニカルアナリストであったウィリアム・デルバート・ギャンは、市場分析ツールとテクニックの豊かな遺産を残しました。数ある彼の作品の中でも、Square of 9は特別な位置を占めています。これは、幾何学、数秘術、占星術の要素を組み合わせた神秘的で多面的なツールです。

ギャンのSquare of 9は、9x9の正方形に配置された螺旋状の数列です。このツールは、金融市場における重要な価格水準や時間サイクルを予測するために使用されます。その難解な性質にもかかわらず、Square of 9は、市場分析への型破りなアプローチを求める現代のトレーダーたちの注目を集め続けています。

この記事では、MQL5プログラミング言語を使用してMetaTrader 5プラットフォーム用のインジケーターを作成することで、ギャンのSquare of 9の世界に飛び込み、そのコンセプトをデジタル時代に持ち込むことを試みます。私たちの目標は、ギャンの知恵と現代のテクノロジーを組み合わせることで、トレーダーがSquare of 9の原則を視覚化し、取引に応用できるツールを開発することです。

Square of 9の理論的根拠を確認し、このインジケーターを作成するプロセスを順を追って説明し、その実際的な応用と潜在的な限界について議論します。あなたが経験豊富な取引システム開発者であろうと、型にはまらない市場分析手法に興味があるだけであろうと、この記事はあなたの分析ツールボックスを拡大するための貴重な情報と実践的なスキルを提供します。

ウィリアム・ギャンの足跡をたどる魅力的な旅に出かけ、彼の素晴らしいアイデアと現代のアルゴリズム取引の世界をつなぐ架け橋を作りましょう。


ギャンのSquare of 9の理論的基礎


ギャンのSquare of 9は、幾何学、数秘術、占星術の要素を組み合わせたユニークなテクニカル分析ツールです。この方法は、金融市場における価格と時間は、9x9の正方形に位置する数列として表すことができる螺旋状のパターンで動くという考えに基づいています。

Square of 9の構成は中央のセルから始まり、そのセルには数字1が割り当てられます。そして、反時計回りの螺旋状に数字を並べ、81(9x9)までマスを埋めていきます。この数列の9番目の数ごとに「カーディナルクロス」が形成されます。これは、ギャンが市場分析にとって特に重要であると考えた重要なポイントです。

ギャン理論によれば、Square of 9の数字は価格水準と時間間隔に対応します。彼は、市場はこれらの水準に反応し、転換点や支持線、抵抗線を形成すると考えました。特に重要視されるのは、同じ線上にある数字、あるいは互いに調和のとれた関係にある数字です。

ギャンはまた、Square of 9を占星術の概念と結びつけ、正方形の数字と数字の間の角度が特定の惑星の角度関係に対応すると述べています。これにより、分析に時間的な側面が加わり、価格水準だけでなく、重要な市場イベントが発生する可能性のある日を予測することができます。

Square of 9の解釈はしばしば主観的であり、経験を必要とすることに注意することが重要です。あるトレーダーは価格水準に注目し、あるトレーダーは時間サイクルに注目し、またあるトレーダーは両方のアプローチを組み合わせます。

その難解な性質にもかかわらず、ギャンのSquare of 9は現代のトレーダーの注目を集め続けています。その価値は、伝統的なテクニカル分析手法を補完する、市場の動きに対する独自の視点を提供する能力にあります。

MetaTrader 5のインジケーターを作成する場合、私たちの仕事は、これらの理論的概念を、特定の取引シグナルと視覚的表現を生成できるアルゴリズムに変換することです。これにより、トレーダーはギャン氏のアイデアを現代のデジタル・トレーディング環境に統合することができます。


ギャンのSquare of 9の数学的装置

その複雑な起源にもかかわらず、ギャンのSquare of 9には明確な数学的構造があります。この構造を理解することは、正確で効率的なインジケーターを作る上で非常に重要です。Square of 9の基礎となる数学の基本原理を見てみましょう。

  • 正方形の構成:Square of 9は、9x9の行列に配置された1から81までの数字の螺旋配列です。数学的には、これは(x,y)座標の2乗の関数として表すことができます。
  • 螺旋数列:数字が反時計回りの螺旋状に並んでいます。これは、離散形式のスパイラルのパラメトリック方程式で記述することができます。
  • 角度の関係:ギャンは数字間の角度の関係を特に重視しました。これらの関係は、二乗数の位置を考慮した三角関数で表すことができます。
  • 価格予測:多くの場合、対数や平方根を含む様々な数学的変換は、平方数を価格水準に変換するために使用されます。
  • 時間サイクル:Square of 9の時間的側面は、モジュラー算術で表現することができ、螺旋の1回転が一定のサイクルに相当します。
  • カーディナルクロス:カーディナルクロス(9番目の数)を形成する数は、9のステップを持つ等差数列として表すことができます。
  • 調和的関係:正方形内の数値間の調和的関係は、単純な数値比または度単位の角度で記述することができます。
  • 価格の平方根:ギャンはしばしば価格の平方根を計算に使っていたが、これは数学的操作のレベルをもう一段階上げることになります。
  • モジュラー算術:Square of 9の多くの計算は、モジュラー算術、特に9モジュロの原理に基づいています。

MQL5でインジケーターを作成するには、これらの数学的概念を特定のアルゴリズムに変換する必要があります。これには、Square of 9の生成、角度関係の計算、数値の価格スケールへの投影、時間サイクルの決定などの関数の開発が含まれます。

Square of 9の数学は正確ですが、その解釈と市場への適用は依然として主観的であることに注意することが重要です。このインジケーターを作成した私たちの目標は、正確な数学的計算に基づいて、ギャン理論のさまざまな側面を実験できる柔軟なツールをユーザーに提供することです。


インジケーターの作成準備

まず、ギャンのSquare of 9インジケーターの基本的な機能を定義することから始めましょう。チャート上に正方形そのものをプロットし、重要な価格水準を計算し、時間サイクルを表示する必要があります。次に、ユーザーに提供される設定について考えます。Square of 9の最初の数字、価格に変換するためのスケール、線と文字の色の選択などです。

データをどのように保存するかを計画することが重要です。9つの数字の2乗を格納する配列と、計算された価格と日付を格納するリストが必要です。

次のステップは、基本的なアルゴリズムを開発することです。Square of 9を生成し、その数値を価格水準に変換し、時間サイクルの日付を計算する関数を作成する必要があります。これらの情報をチャート上にどのように表示するのがベストか考えてみましょう。Square of 9そのものをどのように表示するか、価格水準と日付をどこに置くかを決める必要があります。

テストについても忘れてはなりません。計算の精度をチェックする方法を用意し、さまざまな時間枠でインジケーターをテストしてみましょう。また、MQL5での作業の特徴、特にグラフィカルな要素の作成と利用可能な数学関数に関連して勉強することも重要です。

この準備は、効率的で使い勝手の良いギャンのSquare of 9インジケーターを作成するための強固な土台となります。

ギャンのSquare of 9インジケーターコードの構成

MetaTrader 5用のギャンのSquare of 9インジケーターを開発する際には、明確で論理的なコード構造を作成することが重要です。これにより、インジケーターの理解やデバッグが容易になり、さらに改良が加えられます。コードに含める必要のある主なコンポーネントを見てみましょう。

まず、変数を宣言して初期化する必要があります。インジケーターの設定を格納するグローバル変数を定義し、Square of 9 のデータと計算値を格納する配列を作成しましょう。

  • OnInit()関数を使用して、インジケーターのパラメータを初期化し、必要なグラフィカルオブジェクトを作成します。
  • OnDeinit()関数は、インジケーターが削除されると、作成されたすべてのグラフィカルオブジェクトをクリアします。
  • OnCalculate()関数はインジケーターのメイン関数で、ティックごとに呼び出されます。ここで主な計算がおこなわれ、表示が更新されます。

インジケーターの主要構成要素の実装

では、Square of 9の「空白」のコードを見てみましょう。

//+------------------------------------------------------------------+
//|                                                      GannSquare9 |
//|                                          Copyright 2024, Shtenco |
//|                          https://www.mql5.com/ru/users/koshtenko |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, Evgeniy Koshtenko"
#property link      "https://www.mql5.com/ru/users/koshtenko"
#property version   "1.00"
#property description "Gann Square of 9 Price and Time Levels Indicator"
#property indicator_chart_window

// Input parameters
input double StartNumber = 1;  // Starting number for the Gann Square
input color PriceLevelColor = clrDodgerBlue;  // Color of the price levels
input color TimeLevelColor = clrRed;  // Color of the time levels
input int LevelsToShow = 50;  // Number of levels to display
input datetime EndDate = D'2024.08.14 00:00';  // End date for calculations
input double PriceStepDivisor = 10.0;  // Divisor for price step (higher value = more levels)

// Global variables
double price_levels[];
datetime time_levels[];
double price_scale;
int time_scale;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// Validate inputs
   if(StartNumber <= 0 || LevelsToShow <= 0 || EndDate <= 0 || PriceStepDivisor <= 0)
     {
      Print("Invalid input parameters");
      return INIT_PARAMETERS_INCORRECT;
     }

// Calculate scales
   CalculateScales();

// Calculate and draw levels
   CalculateLevels();
   DrawLevels();

   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[])
  {
// No calculations needed for this indicator
   return(rates_total);
  }

//+------------------------------------------------------------------+
//| Calculate price and time scales                                  |
//+------------------------------------------------------------------+
void CalculateScales()
  {
   double current_price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   price_scale = current_price / (StartNumber * StartNumber);

   datetime current_time = TimeCurrent();
   time_scale = (int)MathMax(1, (EndDate - current_time) / (86400 * StartNumber * StartNumber));  // in days
  }

//+------------------------------------------------------------------+
//| Calculate price and time levels                                  |
//+------------------------------------------------------------------+
void CalculateLevels()
  {
   ArrayResize(price_levels, LevelsToShow);
   ArrayResize(time_levels, LevelsToShow);

   for(int i = 0; i < LevelsToShow; i++)
     {
      double price_square = MathPow(StartNumber + i / PriceStepDivisor, 2);
      int time_square = (StartNumber + i) * (StartNumber + i);

      price_levels[i] = price_scale * price_square;
      time_levels[i] = EndDate - time_scale * time_square * 86400;  // Convert days to seconds
     }
  }

//+------------------------------------------------------------------+
//| Draw levels on the chart                                         |
//+------------------------------------------------------------------+
void DrawLevels()
  {
   for(int i = 0; i < LevelsToShow; i++)
     {
      // Draw price level
      string price_name = "GannPriceLevel_" + IntegerToString(i);
      ObjectCreate(0, price_name, OBJ_HLINE, 0, 0, price_levels[i]);
      ObjectSetInteger(0, price_name, OBJPROP_COLOR, PriceLevelColor);
      ObjectSetInteger(0, price_name, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, price_name, OBJPROP_WIDTH, 1);
      ObjectSetString(0, price_name, OBJPROP_TOOLTIP, "Gann Price Level " + DoubleToString(price_levels[i], _Digits));

      // Draw time level
      string time_name = "GannTimeLevel_" + IntegerToString(i);
      ObjectCreate(0, time_name, OBJ_VLINE, 0, time_levels[i], 0);
      ObjectSetInteger(0, time_name, OBJPROP_COLOR, TimeLevelColor);
      ObjectSetInteger(0, time_name, OBJPROP_STYLE, STYLE_DOT);
      ObjectSetInteger(0, time_name, OBJPROP_WIDTH, 1);
      ObjectSetString(0, time_name, OBJPROP_TOOLTIP, "Gann Time Level " + TimeToString(time_levels[i], TIME_DATE|TIME_MINUTES));
     }
  }

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0, "GannPriceLevel_");
   ObjectsDeleteAll(0, "GannTimeLevel_");
  }
//+------------------------------------------------------------------+

このインジケーターは、ウィリアム・ギャンのSquare of 9の概念を現代的に解釈し、MetaTrader 5プラットフォームに適合させたものです。ギャン原理に基づいて価格と時間レベルを視覚化し、トレーダーに市場分析と取引判断のためのユニークなツールを提供します。

以下がインジケーターの入力です。

  • StartNumber:Square of 9を構成するための最初の番号
  • PriceLevelColorとTimeLevelColor:それぞれ価格レベルと時間レベルを表示する色
  • LevelsToShow:表示するレベルの数
  • EndDate:過去データの計算とテストの終了日
  • PriceStepDivisor:価格水準の間隔

グローバル変数は、データの保存と処理に使われます。price_levels[]配列とtime_levels[]配列には、それぞれ計算された価格レベルと時間レベルが格納されます。price_scale変数とtime_scale変数は、価格と時間の値をスケーリングするために使用されます。

CalculateScales()関数は、商品の現在価格と指定された終了日に基づいて、価格と時間のスケールを自動的に決定します。CalculateLevels()は、価格および時間レベルの計算を実行します。価格水準は2次関数と、水準の頻度を高めるための追加の除数を用いて計算され、時間水準はギャン理論に沿った数字の2乗に基づいています。DrawLevels()は、チャート上に価格水準を表す水平線と時間水準を表す垂直線を作成し、データを視覚化する役割を担います。 

このインジケーターは、ギャンのSquare of 9の原則に基づき、価格と時間レベルをトレーダーに視覚的に表示します。これは、伝統的なテクニカル分析以外の手法に興味があり、取引アイデアを確認するための追加ツールを探しているトレーダーにとって特に有用です。

この実装の特徴には、より詳細な分析のために価格水準の間隔をカスタマイズする機能、ヒストリカル分析の終了日を柔軟に選択する機能、1つのチャート上の価格水準と時間水準の組み合わせなどがあります。

インジケーターの改善点としては、価格や時間が重要なレベルに達したときにアラートを出す、価格が大きく変動した際に、レベルを自動で再計算する、他のギャン分析手法と統合して包括的な取引システムを構築する、より大きな時間枠や多数のレベルで動作するようにパフォーマンスを最適化する、などが考えられます。


Square of 9のレベルをチャート上に可視化する

価格水準はチャート上に水平線で表示されます。各線は、ギャンのSquare of 9の原則に基づいて計算された潜在的な支持線または抵抗線を表しています。これらの線の色は、カスタムPriceLevelColorパラメータによって決定され、トレーダーは自分の好みやチャートスタイルに合わせて表示をカスタマイズすることができます。水平線はチャートの縦軸に沿って分布し、その密度はPriceStepDivisorパラメータによって制御されます。これにより、トレーダーは表示される価格レベルの数を調整し、詳細とチャートの見やすさのバランスを見つけることができます。


時間水準はチャート上の垂直線で表示されます。これらの線は、ギャン数の2次関数に基づく重要な時点を表しています。時間軸の色はTimeLevelColorパラメータで設定します。これにより、価格レベルとの区別が容易になります。縦線はチャートの横軸に沿って分布し、指定された終了日(EndDateパラメータ)から始まり、時間をさかのぼっていきます。これにより、トレーダーは、過去のデータを分析するだけでなく、将来の潜在的な反転ポイントや重要な日付を確認することができます。


時間の二乗と時間サイクル

時間の二乗と時間のサイクルは、ウィリアム・ギャン理論の重要な概念であり、Square of 9に反映されています。このような考え方は、市場の動きが一定の時間パターンに従っており、それを予測して取引判断に利用できるという仮定に基づいています。

time_scale = (int)MathMax(1, (EndDate - current_time) / (86400 * StartNumber * StartNumber));  // in days

時間の二乗の概念は、重要な市場イベントがしばしば整数の二乗の間隔で発生することを示唆しています。例えば、大きな相場の転換は、4日、9日、16日、25日、36日、49日、64日、81日、あるいはこれらの数字に基づくそれ以上の期間に起こる可能性があります。Square of 9の構造において、これらの数字は螺旋の重要なポイントを形成します。

この方程式は、ギャンのSquare of 9インジケーターの時間スケールを計算する上で重要な要素です。その構成要素と意味を見てみましょう。

  1. EndDate - current_time:これは、指定された終了日と現在時刻との差です。結果は秒単位で表示されます。
  2. 86400:1日の秒数(24時間×60分×60秒)
  3. StartNumber * StartNumber:タイムラインのスケールに使われる開始数値の2乗
  4. (EndDate − current_time) / (86400 * StartNumber * StartNumber):方程式のこの部分は、時間差を秒から日に変換し、それを開始数の2乗で割ります。これによって、ギャンのSquare of 9の原則と一致する非線形の時間スケールが生まれます。
  5. MathMax(1, ...):この関数は、結果が少なくとも1であることを保証します。これにより、ゼロや負の値による除算を防ぐことができます。
  6. (int):タイムラインは日単位で表現する必要があるため、結果を整数型にキャストします。

この方程式の背後にある考え方は、現在の日付に近づくにつれて短くなるタイムラインを作成することです。これは、ギャンが提唱した市場の時間変動の加速と市場サイクルの概念を反映しています。

StartNumberが大きいほど、タイムラインは圧縮されます。これにより、トレーダーはさまざまな取引期間に合わせてインジケーターをカスタマイズできます。

分母にStartNumberの2乗(StartNumber * StartNumber)を使用すると、時間レベルの非線形分布が作成され、これは数字の重要性が2次関数的に増加するギャンのSquare of 9の原則と一致します。


市場サイクルの加速に伴う時間サイクルの加速

このインジケーターの興味深い特徴のひとつは、ギャンのSquare of 9の原則に基づく時間サイクルが、現在の日付に近づくにつれて互いに近づくように配置されていることです。この現象は、現代の金融環境で見られる市場サイクルの加速化を反映したものと解釈できます。

ここ数十年、私たちは市場プロセスの著しい加速を目の当たりにしてきました。株式市場の暴落は、以前は数年、あるいは数十年ごとに起こっていたが、今でははるかに頻繁に起こっています。この背景には、金融市場のグローバル化、情報技術やアルゴリズム取引の発展、情報伝達のスピードアップなど、さまざまな要因があります。おそらくこれは、技術的特異点(シンギュラリティ)に向けての段階的な動きによるものでしょう。 

ギャンのSquare of 9インジケーターは、現在時刻に近づくほど圧縮される時間サイクルを表示することで、この加速を間接的に反映しています。このような視覚的な表現は、トレーダーが、サイクルが刻々と変化する今日の速いペースの市場環境をよりよく理解し、適応するのに役立ちます。

この加速は、技術発展と金融市場の進化の表れと見ることができます。高頻度取引、ソーシャルメディアを通じた即時のニュース配信、個人投資家向けの取引プラットフォームの利用可能性の増加により、市場は以前にも増して出来事に敏感に反応するようになりました。かつてのトレンドはもっと長続きし、予測可能なものでした。 

このインジケーターは加速を反映していますが、直接的に予測するものではないことに留意する必要があります。むしろ、トレーダーが加速する市場サイクルの概念を理解し、分析に取り入れるのに役立つ視覚的なツールを提供するものです。


インジケーターのテスト

過去のデータからこのインジケーターの結果を見てみましょう。資産としてEURUSDを選び、レベル計算の出発点として1.00を選びました。

別のセグメント:

そしてもうひとつ:

2008年:

2010年、再びレベルに対する反応を見ることになります。

2011年:

2012年:

2020年:

当期:現在、EURUSDはギャンのSquare of 9のレベルにあります。

タイムサイクルに関しては、統計的に有意な価格反応は見られませんでした。

改善の可能性

興味深いオプションは、価格がSquare of 9レベルにタッチしたときにアラートを追加することです。また、価格更新時にスクエアレベルの自動再計算を追加することも可能です。 

また、ギャンボックスとギャングリッドをインジケーターの形で実装し、すべての開発を1つの複雑なシステムにまとめるのも面白いでしょう。

Square of 9に基づくEA作成の見通し

また、スクエアレベルからの反発に基づくEAを作成することも可能です。私は、これをチャートオブジェクトと連動する可能性のある半自動EAと見ています。このようなEAは、トレーダーの取引指示にあるレベルから従うことで、トレーダーの作業を容易にすることができます。

結論

MetaTrader 5プラットフォーム用のギャンのSquare of 9インジケーターの開発は、テクニカル分析の古典的なアイデアと現代の取引技術を組み合わせた興味深く野心的なプロジェクトです。このインジケーターは、価格分析と時間分析の要素を組み合わせたユニークな市場分析ツールをトレーダーに提供します。

Square of 9のコンセプトをデジタルインジケーターの形で実装することで、この複雑な理論がより身近になり、幅広いトレーダーに適用できるようになりました。価格と時間レベルを1つのチャートで視覚化できるため、市場の動きを総合的に分析することができ、特に変化の激しい今日の市場において有用です。

数学的根拠があるにもかかわらず、ギャンのSquare of 9シグナルの解釈は依然として主観的であることに注意することが重要です。 

全体として、このプロジェクトは、テクニカル分析の歴史的手法をいかに現代の取引技術に適応させ、トレーダーのための新しいツールを生み出すことができるかを実証しています。このことは、古典的な考え方の不朽の価値と、現代の金融市場におけるその可能性を浮き彫りにしています。

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

添付されたファイル |
Gann_Square9.mq5 (10.58 KB)
人工藻類アルゴリズム(AAA) 人工藻類アルゴリズム(AAA)
本稿では、微細藻類に特徴的な生物学的プロセスに基づく人工藻類アルゴリズム(AAA)について考察します。このアルゴリズムには、螺旋運動、進化過程、適応過程が含まれており、最適化問題を解くことができます。この記事では、AAAが機能する原理と、数学的モデリングにおけるその可能性について詳しく分析し、自然とアルゴリズムによる解とのつながりを強調しています。
無政府社会最適化(ASO)アルゴリズム 無政府社会最適化(ASO)アルゴリズム
この記事では、無政府社会最適化(ASO)アルゴリズムに触れ、無政府社会(中央集権的な権力や様々な種類のヒエラルキーから解放された社会的相互作用の異常なシステム)の参加者の非合理的で冒険的な行動に基づくアルゴリズムが、解空間を探索し、局所最適の罠を回避できることを議論します。本稿では、連続問題にも離散問題にも適用可能な統一的なASO構造を提示します。
取引におけるニューラルネットワーク:状態空間モデル 取引におけるニューラルネットワーク:状態空間モデル
これまでにレビューしたモデルの多くは、Transformerアーキテクチャに基づいています。ただし、長いシーケンスを処理する場合には非効率的になる可能性があります。この記事では、状態空間モデルに基づく時系列予測の別の方向性について説明します。
ニューラルネットワークの実践:ニューロンのスケッチ ニューラルネットワークの実践:ニューロンのスケッチ
この記事では、基本的なニューロンを作ります。単純に見えるし、多くの人はこのコードをまったくつまらない無意味なものだと考えるかもしれませんが、このニューロンの単純なスケッチを楽しく勉強してほしいと思います。コードを修正することを恐れず、完全に理解することが目標です。