English Русский Español Deutsch 日本語 Português
preview
威廉·江恩(William Gann)方法(第二部分):创建江恩宫格指标

威廉·江恩(William Gann)方法(第二部分):创建江恩宫格指标

MetaTrader 5示例 |
835 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

引言

威廉·德尔伯特·江恩(William Delbert Gann)是 20 世纪初的传奇交易员和技术分析师,他留下了一系列丰富的市场分析工具和技术。在他的众多发明中,“九宫格”占据着特殊的地位。这是一个神秘且多元化的工具,结合了几何学、数字学和占星术的元素。

江恩的“九宫格”是一个螺旋式的数字序列,排列在一个 9×9 的方格中。该工具用于预测金融市场中的重要价格水平和时间周期。尽管其具有深奥的性质,但“九宫格”仍然吸引着现代交易者,他们正在寻找非传统的市场分析方法。

在本文中,我们将深入探索江恩的“九宫格”,并尝试将其概念带入数字时代,通过使用 MQL5 编程语言为 MetaTrader 5 平台创建一个指标。我们的目标是开发一个工具,使交易者能够在其交易中可视化并应用“九宫格”的原理,将江恩的智慧与现代技术相结合。

我们将回顾“九宫格”的理论基础,逐步介绍创建指标的过程,并讨论其实际应用和潜在局限性。无论您是经验丰富的交易系统开发者,还是对非传统市场分析方法感兴趣的初学者,本文都将为您提供有价值的信息和实用技能,以扩展您的分析工具箱。

让我们踏上一段迷人的旅程,追随威廉·江恩的足迹,搭建一座桥梁,连接他卓越的思想与现代算法交易的世界。


江恩“九宫格”的理论基础


江恩“九宫格”是一个独特的技术分析工具,结合了几何学、数字学和占星术的元素。该方法基于这样一个观点:金融市场中的价格和时间以螺旋模式移动,可以表示为位于 9×9 方格中的数字序列。

“九宫格”的构建从中心单元格开始,该单元格被赋予数字 1。然后,数字以逆时针螺旋的方式排列,填充方格直至 81(9×9)。在这个序列中,每第九个数字形成一个“基点十字”——这是江恩认为对市场分析特别重要的关键点。

根据江恩理论,“九宫格”中的数字对应于价格水平和时间间隔。他相信市场倾向于对这些位置做出反应,从而形成转折点、支撑位或阻力位。特别重要的是那些在同一行或彼此之间存在和谐关系的数字。

江恩还将“九宫格”与占星术概念联系起来,声称方格中数字之间的角度对应于某些行星相位。这为分析增添了时间维度,使我们不仅可以预测价格水平,还可以预测重大市场事件的潜在日期。

需要注意的是,“九宫格”的解释往往具有主观性,并且需要经验。交易者以不同的方式使用这个工具:有些人专注于价格水平,另一些人关注时间周期,还有些人将这两种方法结合起来。

尽管其具有深奥的性质,江恩“九宫格”仍然吸引着现代交易者的关注。它的价值在于能够提供一个独特的视角来观察市场动态,这可以补充传统技术分析方法。

在创建 MetaTrader 5 指标的情境中,我们的任务是将这些理论概念转化为能够生成具体交易信号和视觉表示的算法。这将使交易者能够将江恩的思想整合到现代数字交易环境中。


江恩“九宫格”的数学表达

尽管其具有深奥的根源,江恩“九宫格”具有清晰的数学结构。理解这种结构对于创建准确高效的指标至关重要。让我们来看看支撑“九宫格”的基本数学原理:

  • 方格的构建——“九宫格”是一个从 1 到 81 的螺旋数字序列,排列在一个 9×9 的矩阵中。从数学上讲,这可以表示为(x,y)坐标的平方函数。
  • 螺旋序列——数字以逆时针螺旋的方式排列。这可以通过离散形式的螺旋参数方程来描述。
  • 角度关系——江恩特别强调数字之间的角度关系。这些关系可以通过考虑平方数字位置的三角函数来表达。
  • 价格投影——通常使用涉及对数或平方根的各种数学变换,将方格数字转换为价格水平。
  • 时间周期——“九宫格”的时间方面可以通过模运算来表达,其中螺旋的每一次完整旋转对应于某个周期。
  • 基点十字——形成基点十字(每第九个数字)的数字可以表示为步长为 9 的等差数列。
  • 和谐关系——方格中数字之间的和谐关系可以用简单的数字比例或角度(以度为单位)来描述。
  • 价格的平方根——江恩在他的计算中经常使用价格的平方根,这增加了另一层的数学运算操作。
  • 模运算——“九宫格”中的许多计算都基于模运算的原理,尤其是模 9。

为了在 MQL5 中创建一个指标,我们需要将这些数学概念转化为具体的算法。这包括开发用于生成“九宫格”、计算角度关系、将数字投影到价格尺度上以及确定时间周期的函数。

需要注意的是,尽管“九宫格”的数学原理是准确的,但其对市场的解释和应用仍然在很大程度上是主观的。我们创建指标的目标是为用户提供一个灵活的工具,使他们能够基于精确的数学计算,尝试江恩理论的各个方面。


准备创建指标

让我们先定义江恩“九宫格”指标的基本功能。我们需要在图表上绘制方格本身,计算重要的价格水平,并显示时间周期。然后我们将考虑提供给用户的参数。这些可以包括:“九宫格”的起始数字、转换为价格的尺度,以及线条和文本颜色的选择。

重要的是我们要计划如何存储数据。我们需要一个数组来存储“九宫格”数字,以及列表来存储计算出的价格和日期。

下一步是开发基本算法。我们需要创建用于生成“九宫格”、将其数字转换为价格水平以及计算时间周期日期的函数。让我们思考一下如何在图表上最佳地显示所有这些信息。我们需要决定如何显示“九宫格”本身,以及在哪里放置价格水平和日期。

别忘了测试。让我们准备用于检查我们计算准确性的方法,并在不同时间框架上测试该指标。研究 MQL5 运作特点也很重要,特别是与创建图形元素和可用的数学函数有关的内容。

这些准备工作将为创建高效且用户友好的江恩九宫格指标奠定坚实的基础。

江恩九宫格指标代码结构

在为 MetaTrader 5 开发江恩九宫格指标时,创建清晰且逻辑性强的代码结构至关重要。这将使我们更容易理解、调试并进一步改进该指标。让我们来看看我们的代码中需要包含的主要组成部分。

首先,我们需要声明并初始化变量。让我们定义全局变量来存储指标设置,并创建数组来存储“九宫格”数据和计算值。

  • OnInit() 函数将用于初始化指标参数并创建必要的图形对象。
  • OnDeinit() 函数将在删除指标时清除所有创建的图形对象。
  • OnCalculate() 函数是该指标的主函数,每出现一个新报价时都会被调用。这就是将要执行主要计算并更新显示的地方。

指标关键组件的实现

让我们看看“九宫格”的“空白”代码:

//+------------------------------------------------------------------+
//|                                                      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_");
  }
//+------------------------------------------------------------------+

这个指标是对威廉·江恩(William Gann)“九宫格”概念的现代诠释,专为 MetaTrader 5 平台进行了适配。它根据江恩原则可视化价格和时间水平,为交易者提供了一种独特的市场分析和交易决策工具。

指标输入:

  • StartNumber — 构建“九宫格”的起始数字,
  • PriceLevelColor 和 TimeLevelColor — 分别用于显示价格和时间水平的颜色,
  • LevelsToShow — 要显示的水平数量,
  • EndDate — 用于历史数据计算和测试的结束日期,
  • PriceStepDivisor — 价格水平的频率。

全局变量用于存储和处理数据。price_levels[] 和 time_levels[] 数组分别存储计算出的价格和时间水平。price_scale 和 time_scale 变量用于缩放价格和时间值。

CalculateScales() 函数会根据当前交易对象的价格和指定的结束日期,自动确定价格和时间的缩放比例。CalculateLevels() 执行价格和时间水平的计算。价格水平通过二次函数和一个额外的除数来计算,以增加水平的频率,而时间水平则基于数字的平方,这与江恩理论一致。DrawLevels() 负责通过在图表上绘制水平线表示价格水平,以及绘制垂直线表示时间水平来可视化数据。 

该指标为交易者提供了一种基于江恩“九宫格”原则的价格和时间水平的视觉表示。这尤其适合对非传统技术分析方法感兴趣的交易者,以及那些正在寻找额外工具来确认其交易想法的人。

此实现的特点包括能够自定义价格水平的频率以进行更详细的分析,灵活选择历史分析的结束日期,以及在单个图表上结合价格和时间水平。

对指标的可能改进包括:当价格或时间达到关键水平时添加警报,当价格显著变化时自动更新水平,与其他江恩分析方法集成以创建一个全面的交易系统,以及优化性能以在更大的时间框架和大量水平上运行。


在图表上可视化“九宫格”

价格水平在图表上显示为水平线。每条线代表一个基于江恩“九宫格”原则计算出的潜在支撑位或阻力位。这些线的颜色由自定义的 PriceLevelColor 参数决定,允许交易者根据自己的偏好和图表风格自定义显示。水平线沿着图表的垂直轴分布,其密度由 PriceStepDivisor 参数控制。这使得交易者可以调整显示的价格水平数量,在细节和图表可读性之间找到平衡。


时间水平在图表上显示为垂直线。这些线基于江恩数字的二次序列表示关键时间点。时间线的颜色由 TimeLevelColor 参数设置,这使得它们与价格水平容易区分。垂直线沿着图表的水平轴分布,从指定的结束日期(EndDate 参数)开始,向后延伸至过去的时间。这使交易者能够看到未来的潜在反转点或重要日期,同时也能分析历史数据。


时间平方数与时间周期

时间平方数与时间周期是江恩理论中的关键概念,这些概念在“九宫格”中得到了体现。这些观点基于这样的假设:市场走势遵循某些可预测的时间模式,这些模式可以用于做出交易决策。

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

时间平方数的概念表明,重要的市场事件通常发生在整数平方的时间间隔上。例如,主要的市场转折点可能出现在 4、9、16、25、36、49、64、81 天或更长的周期,这些周期基于这些数字。在“九宫格”的背景下,这些数字对应于螺旋的关键点。

该公式是计算江恩“九宫格”指标时间尺度的关键要素。让我们来看看它的组成部分及其含义:

  1. EndDate − current_time:这是指定的结束日期与当前时间之间的差值。结果以秒为单位。
  2. 86400:这是一天(24 小时 × 60 分钟 × 60 秒)的秒数。
  3. StartNumber * StartNumber:这是起始数字的平方,用于缩放时间线。
  4. (EndDate − current_time) / (86400 * StartNumber * StartNumber):这个公式将时间差从秒转换为天,然后除以起始数字的平方。这创建了一个与江恩“九宫格”原则一致的非线性时间尺度。
  5. MathMax(1, ...):这个函数确保结果至少为 1。这可以防止除以零或负值。
  6. (int):将结果强制转换为整数类型,因为时间线应该以整天为单位表示。

这个公式背后的想法是创建一个随着时间接近当前日期而逐渐缩短的时间线。这反映了江恩关于时间和市场周期加速的概念。

起始数字 StartNumber 越大,时间线就越紧凑。这使得交易者可以根据不同的交易时间范围自定义指标。

在分母中使用起始数字的平方(StartNumber * StartNumber)创建了一个非线性的时间水平分布,这与江恩“九宫格”的原则一致,在该原则中,数字的重要性呈二次方增加。


时间周期的加速与市场周期的加速

该指标的一个有趣特点是,基于江恩“九宫格”原则的时间周期在接近当前日期时彼此之间的距离越来越近。这种现象可以被解释为现代金融市场中观察到的市场周期加速的反映。

在过去的几十年里,我们确实看到了市场进程的显著加速。曾经每隔几年甚至几十年才会发生一次的股市崩盘,现在发生的频率要高得多。这可以归因于许多因素,包括金融市场的全球化、信息技术和算法交易的发展,以及信息传播速度的加快。也许,这可以归因于我们逐渐走向技术奇点。 

江恩“九宫格”指标通过显示向当前时间压缩的时间周期,间接反映了这种加速。这种视觉表示可以帮助交易者更好地理解和适应当今快节奏的市场环境,在这种环境中,周期的发生速度越来越快。

这种加速可以被视为技术发展和金融市场进化的标志。随着高频交易的出现、社交媒体上即时新闻的传播以及零售投资者交易平台的普及,市场对事件的反应比以往任何时候都要迅速。趋势曾经持续时间更长且更可预测。 

需要注意的是,尽管该指标反映了这种加速,但它并不直接预测这种加速。相反,它提供了一个视觉工具,可以帮助交易者理解并将加速的市场周期概念整合到他们的分析中。


指标测试

让我们来看看该指标在历史数据上的结果。我们选择了 EURUSD 作为资产,并将 1.00 作为计算水平的起始点。

另一段:

还有:

2008:

2010 年,我们再次看到对这些水平的反应:

2011:

2012:

2020:

当前时期:目前,EURUSD 正处于江恩“九宫格”的水平上。

至于通过时间平方数计算的时间周期,我没有注意到价格对它们有任何统计意义上的反应。

可能的改进

一个有趣的选择似乎是添加价格触及“九宫格”水平时的警报。也可以添加在价格更新时自动重新计算方格水平的功能。 

将江恩方格和江恩网格以指标的形式实现,并将所有这些开发成果整合成一个复杂系统,这似乎也很有意思。

基于“九宫格”创建 EA 的前景

也可以基于从方格位置的反弹来创建一个 EA。我将其视为一个可能与图表对象相关的半自动 EA。这样的 EA 可以通过遵循交易者从一个水平到另一个水平的交易指令,使交易者的工作变得更加轻松。

结论

为 MetaTrader 5 平台开发江恩九宫格指标是一个将经典技术分析理念与现代交易技术相结合的有趣且雄心勃勃的项目。该指标为交易者提供了一种独特的市场分析工具,结合了价格分析和时间分析的元素。

以数字指标的形式实现“九宫格”概念,使这一复杂的理论更易于被广大交易者理解和应用。能够在单个图表上可视化价格和时间水平,使得对市场动态的综合分析成为可能,这在当今快速变化的市场环境中尤其有用。

需要注意的是,尽管江恩九宫格基于数学原理,但对其信号的解读仍然在很大程度上是主观的。 

总体而言,这个项目展示了如何将经典技术分析方法适应于现代交易技术,为交易者创造新的工具。这凸显了经典理念的持久价值以及它们在现代金融市场中的潜力。

本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/15566

附加的文件 |
Gann_Square9.mq5 (10.58 KB)
最近评论 | 前往讨论 (1)
Weite Yu
Weite Yu | 27 3月 2025 在 09:31
How to show time calculator on chart?
交易中的神经网络:一种复杂的轨迹预测方法(Traj-LLM) 交易中的神经网络:一种复杂的轨迹预测方法(Traj-LLM)
在本文中,我想向您介绍一种为解决自动驾驶领域问题而开发的有趣的轨迹预测方法。该方法的作者结合了各种架构解决方案的最佳元素。
使用 SMA 和 EMA 自动优化止盈和指标参数的示例 使用 SMA 和 EMA 自动优化止盈和指标参数的示例
本文介绍了一种用于外汇交易的复杂 EA 交易,它能够将机器学习与技术分析相结合。它专注于交易苹果股票,具有自适应优化、风险管理和多策略的特点。回溯测试显示出良好的结果,盈利能力较高,但也有显著的回撤,表明还有进一步改进的潜力。
数据科学和机器学习(第 26 部分):时间序列预测的终极之战 — LSTM 对比 GRU 神经网络 数据科学和机器学习(第 26 部分):时间序列预测的终极之战 — LSTM 对比 GRU 神经网络
在上一篇文章中,我们讨论了一个简单的 RNN,尽管它对理解数据中的长期依赖关系无能为力,却仍能制定可盈利策略。在本文中,我们将讨论长-短期记忆(LSTM)、门控递归单元(GRU)。引入这两个是为了克服简单 RNN 的缺点,并令其更聪慧。
创建 MQL5-Telegram 集成 EA 交易 (第二部分):从 MQL5 发送信号到 Telegram 创建 MQL5-Telegram 集成 EA 交易 (第二部分):从 MQL5 发送信号到 Telegram
在本文中,我们创建了一个 MQL5-Telegram 集成 EA 交易,将移动平均线交叉信号发送到 Telegram。我们详细介绍了从移动平均线交叉生成交易信号的过程,在 MQL5 中实现必要的代码,并确保集成无缝工作。结果是系统可以直接向您的 Telegram 群聊提供实时交易提醒。