English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
学习如何基于分形(Fractals)设计交易系统

学习如何基于分形(Fractals)设计交易系统

MetaTrader 5交易 | 8 二月 2023, 09:56
2 162 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

这是我们系列中的一篇新文章,其中包含最流行的技术指标之一,即分形(Fractals)指标),我们将学习如何基于它设计交易系统。 我们将通过以下主题详细了解它:

  1. 分形定义
  2. 分形策略
  3. 分形策略蓝图
  4. 分形交易系统
  5. 结束语

我们将学习它是什么,它衡量什么,以及如何手工计算它,从而理解它背后的主要思想。 我们将学习如何基于指标的基本概念,并运用在简单交易策略中,令其为我们谋利。 之后,我们将基于这些策略创建一个交易系统,可在 MetaTrader 5 交易终端生成自动信号。

我们将利用 MQL5(MetaQuotes 语言 5)来编写代码,它是内置在 MetaTrader 5 交易终端中的 IDE。 如果您不知道如何下载和使用 MetaTrader 5 和 MQL5,您可以阅读在 MetaEditor 中编写 MQL5 代码,来了解更多信息。 顺便说一句,如果您想提高编码技能,我建议您尝试应用自己所学知识。

在真实账户中使用之前,您必须测试任何提到的策略,因为本文的主要意图是教学。 此外,没有什么策略能适合所有人。 如此,您必须确保它适合您的交易。

免责声明:所有信息“按原样”提供仅用于教学目的,并非出于交易目的或建议。 这些信息不能保证任何结果。 如果您选择在您的任何交易账户上使用这些材料,您将自行承担风险,您是唯一的责任人。

分形定义

分形指标由比尔·威廉姆斯开发。 它旨在尝试预测价格动作的潜在走势,并发出看涨或看跌信号。 看涨信号给出的潜在移动向上,而看跌信号的潜在移动向下。 我们也可以说,该指标尝试预测图表上的高点和低点。 我们可以查看在图表的价格下方和上方生成的信号箭头。

它形成两个不同的箭头,向上分形箭头,和向下分形箭头。 如果您想问形成这两个箭头的计算方法,以下是这个问题的答案:

分形指标需要在图表上出现价格行为的特定形态,形成了向上或向下两个方向。

对于向上分形,在价格行为上,我们需要以下表现:

  • 至少连续五根蜡烛或柱线。
  • 中间蜡烛处于最高点(第 3 根)。
  • 在此高点的两侧的高点均较低。
  • 第五根蜡烛收盘之后,若先前条件未变,将在蜡烛上方(第三根)形成向上的分形箭头。

对于向下的分形,在价格行为上,我们需要以下表现:

  • 至少连续五根蜡烛或柱线。
  • 中间蜡烛处于最低点(第 3 根)。
  • 在此低点的两侧的低点均较高。
  • 第五根蜡烛收盘之后,若先前条件未变,将在蜡烛上方(第三根)形成向下的分形箭头。

幸运的是,我们不需要执行前面的这些步骤,以便在图表上绘制分形指标,因为它已在 MetaTrader 5 中为我们准备好了,我们只需要从可用指标中选择分形指标。 我们可打开 MetaTrader 5 终端,并按

插入 --> 指标 --> 比尔·威廉姆斯 --> 分形

 分形插入

选择分形后,我们将发现以下指标参数窗口:

 分形参数

1- 确定箭头的颜色。

2- 确定箭头的宽度。

按 OK 后,我们会发现插入到图表中的指标与下同:

 分形加载

正如我们所见,我们在蜡烛上方和下方都得到箭头,指示价格行为的潜在走势。 我们在蜡烛下方得到向下箭头,表示潜在的向上走势,在蜡烛上方得到向上箭头,表示潜在的向下走势。

分形策略

我们将学习如何基于该技术指标的主要概念,在简单策略里运用此分形指标。 我们将分形指标作为一个独立的指标来用,然后我们将学习与其它技术指标搭配运用的概念,从而获得更多视野,并增强其信号。

策略一: 分形高点和低点

    根据这个策略,我们需要根据分形的高点和低点的位置得到高点和低点信号。 如果指标生成了底侧箭头,则为低点信号。 如果指标生成了顶侧箭头,则为高点信号。

    简而言之,

    底侧箭头 --> 分形低点

    顶侧箭头 --> 分形高点

    策略二: 分形和均线

      根据此策略,除了生成的分形指标信号外,我们还需要根据价格位置和移动平均线的价格行为方向,获取买入和卖出信号。 如果收盘价高于移动平均线,并且分形指标生成了低点箭头,则为买入信号。 如果收盘价低于移动平均线,并且分形指标生成了高点箭头,则为卖出信号。

      简而言之,

      收盘价格 > MA, 且生成低点箭头 --> 买入信号

      收盘价格 < MA, 且生成高点箭头 --> 卖出信号

      策略三: 分形和鳄鱼(Alligator)

        根据此策略,我们要生成的分形指标信号,需要以及价格行为的方向,以及取决于其与鳄鱼指标的位置,获得买入和卖出信号。 如果鳄鱼嘴唇线在牙齿线和下颌线上方,牙齿线在下颌线上方,收盘价在牙齿线上方,分形指标信号是低点箭头,则为买入信号。 在另一种场景下,如果嘴唇线低于牙齿线和下颌线,牙齿线低于下颌线,收盘价低于牙齿线,并且分形信号是高点箭头,则为卖出信号。

        简而言之,

        嘴唇线 > 牙齿线和下颌线,牙齿线 > 下颌线,收盘价 > 牙齿线,且分形信号是低点箭头 --> 买入信号

        嘴唇线 < 牙齿线和下颌线,牙齿线 < 下颌线,收盘价 < 牙齿线,且分形信号是高点箭头 --> 卖出信号

        分形策略蓝图

        我们将为每个提到的策略设计一个分步蓝图,来帮助我们组织我们的思路,并顺畅轻松地为它们创建交易系统。

        1. 分形高点和低点

          基于此策略,我们需要创建一个交易系统,该系统可通过持续检查 fracUpvalue 和 fracDownValue 来返回分形指标的高点和低点,作为图表上的注释。 如果 fracUp 大于零或其不为空值,且 fracDown 为一个空值,我们要求交易系统在图表上返回一个信号,含有以下值的注释:

            • 分形高点围绕: n

          在另一种情况下,如果 fracDown 大于零或它不为空值,而 fracUp 为一个空值,我们要求交易系统在图表上返回一个信号,含有以下值的注释:

            • 分形低点围绕: n

          以下是此策略的蓝图:

          分形高点和低点蓝图

          2. 分形和均线

            基于此策略,我们需要创建一个交易系统,该系统可基于连续检查以下值,在图表上返回含有买入和卖出信号的注释:

              • 收盘价
              • EMA (指数均线) 值
              • fracDown 值
              • fracUp 值

            如果收盘价大于 EMA 值,且 fracDown 值不等于空值,我们要求交易系统返回以下值:

              • 买入
              • 当前 EMA
              • 分形低点值: n

            在另一种情况下,如果收盘价低于 EMA 值,且 fracUp 不等于空值,我们要求交易系统返回以下值:

              • 卖出
              • 当前 EMA
              • 分形高点值: n

            下图对应此蓝图:

            分形与 MA 蓝图

            3. 分形和鳄鱼

              基于此交易策略,我们需要创建一个系统,该系统可连续检查以下值的相对位置,来生成买入和卖出信号:

                • 嘴唇值
                • 牙齿值
                • 下颌值
                • 收盘格
                • fracDown 值
                • fracUp 值

              如果嘴唇值大于牙齿值和下颌值,牙齿值大于牙齿值,收盘价大于牙齿值,且 fracDown 不等于空值,我们要求交易系统在图表上返回含有以下值的注释:

                • 买入
                • 嘴唇值 n
                • 牙齿值 n
                • 下颌值 n
                • 分形低点围绕: n

              在另一种情况下,如果嘴唇值低于牙齿值和下颌值,牙齿值低于下颌值,收盘价低于牙齿值,且 fracUp 不等于空值,我们要求交易系统返回以下值:

                • 卖出
                • 嘴唇值 n
                • 牙齿值 n
                • 下颌值 n
                • 分形高点围绕: n

              下图对应此蓝图:

              分形与鳄鱼蓝图

              分形交易系统

              在本主题中,我们将学习如何基于上述策略逐步创建一个交易系统,从而在 MetaTrader 5 终端中执行它们。 我们将开始创建一个简单的分形系统,该系统可在图表上返回带有分形指标值的的注释,以下是操作方法。

              创建 double 数据类型的上下分形数组。

                 double fracUpArray[];
                 double fracDownArray[];

              调用 ArraySetAsSeries 函数设置数据排序方式。 其参数为:

              • array[]: 我们将采用创建的数组 fracUpArray 和 fracDownArray。
              • flag: 我们将采用 true.
                 ArraySetAsSeries(fracUpArray,true);
                 ArraySetAsSeries(fracDownArray,true);

              调用 "iFractals" 函数返回分形指标的句柄。 其参数为:

              • symbol: 我们将采用 _Symbol 对应当前图表。
              • period: 我们将采用 _Period 对应当前时间帧。
              int fracDef=iFractals(_Symbol,_Period);

              调用 “CopyBuffer” 函数获取数据,并存储结果。 其参数为:

              • indicator_handle: 确定指标句柄,我们将采用(fracDef)。
              • buffer_num: 确定指标缓冲区编号,我们将采用(UPPER_LINE 代表 fracUp),(LOWER_LINE 代表 fracDown)。
              • start_pos: 确定起始位置,我们将采用(1)。
              • count: 确定要复制的数量,我们将采用(3)。
              • buffer[]: 定义要复制的目标数组,我们将采用(fracUpArray,fracDownArray)。
                 CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                 CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);

              获取上下分形的值。

                 double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                 double fracDownValue=NormalizeDouble(fracDownArray[0],5);

              在 fracUpValue 和 faceDownValue 为空值的情况下返回零值。

                 if(fracUpValue==EMPTY_VALUE)
                    fracUpValue = 0;
                 if(fracDownValue==EMPTY_VALUE)
                    fracDownValue = 0;

              调用 “Comment” 函数在图表上返回带有分形值的注释。

                 Comment("Fractals Up Value = ",fracUpValue,"\n",
                         "Fractals Down Value = ",fracDownValue);

              以下是创建此交易系统的完整代码。

              //+------------------------------------------------------------------+
              //|                                       Simple Fractals System.mq5 |
              //|                                  Copyright 2022, MetaQuotes Ltd. |
              //|                                             https://www.mql5.com |
              //+------------------------------------------------------------------+
              #property copyright "Copyright 2022, MetaQuotes Ltd."
              #property link      "https://www.mql5.com"
              #property version   "1.00"
              //+------------------------------------------------------------------+
              void OnTick()
                {
              //creating price array
                 double fracUpArray[];
                 double fracDownArray[];
              //Sorting data
                 ArraySetAsSeries(fracUpArray,true);
                 ArraySetAsSeries(fracDownArray,true);
              //define frac
                 int fracDef=iFractals(_Symbol,_Period);
              //define data and store result
                 CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                 CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
              //get values of fracUp and fracDown
                 double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                 double fracDownValue=NormalizeDouble(fracDownArray[0],5);
              //returning zero if there is empty value of fracUp
                 if(fracUpValue==EMPTY_VALUE)
                    fracUpValue = 0;
              //returning zero if there is empty value of fracDown
                 if(fracDownValue==EMPTY_VALUE)
                    fracDownValue = 0;
              //comment on the chart
                 Comment("Fractals Up Value = ",fracUpValue,"\n",
                         "Fractals Down Value = ",fracDownValue);
                }
              //+------------------------------------------------------------------+

              编译此代码后,我们将在导航器文件夹中找到其文件,如下所示:

               分形导航

              将此文件拖放到图表上,我们将发现其窗口与下同:

               简单分形系统窗口

              在“允许算法交易”旁边打勾,按“确定”后,我们会发现该智能系统加载到图表上,如下所示:

              简单分形系统加载

              正如我们在图表右上角所见,加载了智能系统,我们已准备好接收所需的信号,以下是测试示例:

               简单分形系统信号

              正如我们在左上角看到的,我们有两个值:

              • 分形向上值 = n
              • 分形向下值 = 0

              很明显,分形向下值为零,而我们得到分形向上值。

               简单分形系统信号 2

              我们得到两个值:

              • 分形向上值 = 0
              • 分形向下值 = n

              但是分形向上值为零,而我们得到分形向下值。

              1. 分形高点和低点

                以下是关于创建分形高点和低点交易系统的完整代码。

                //+------------------------------------------------------------------+
                //|                                      Fractals highs and lows.mq5 |
                //|                                  Copyright 2022, MetaQuotes Ltd. |
                //|                                             https://www.mql5.com |
                //+------------------------------------------------------------------+
                #property copyright "Copyright 2022, MetaQuotes Ltd."
                #property link      "https://www.mql5.com"
                #property version   "1.00"
                //+------------------------------------------------------------------+
                void OnTick()
                  {
                //creating arrays
                   double fracUpArray[];
                   double fracDownArray[];
                //Sorting data
                   ArraySetAsSeries(fracUpArray,true);
                   ArraySetAsSeries(fracDownArray,true);
                //define frac
                   int fracDef = iFractals(_Symbol,_Period);
                //define data and store result
                   CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                   CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                //define values
                   double fracUpValue = NormalizeDouble(fracUpArray[0],5);
                   double fracDownValue = NormalizeDouble(fracDownArray[0],5);
                //returning zero in case of empty values
                   if(fracUpValue ==EMPTY_VALUE)
                      fracUpValue = 0;
                   if(fracDownValue ==EMPTY_VALUE)
                      fracDownValue = 0;
                //conditions of the strategy and comment on the chart with highs and lows
                //in case of high
                   if(fracUpValue>0)
                     {
                      Comment("Fractals High around: ",fracUpValue);
                     }
                //in case of low
                   if(fracDownValue>0)
                     {
                      Comment("Fractals Low around: ",fracDownValue);
                     }
                  }
                //+------------------------------------------------------------------+

                代码中的差异。

                策略条件:

                高点的情况,

                   if(fracUpValue>0)
                     {
                      Comment("Fractals High around: ",fracUpValue);
                     }

                低点的情况,

                   if(fracDownValue>0)
                     {
                      Comment("Fractals Low around: ",fracDownValue);
                     }

                编译此代码,并如以前所学那样将其加载到图表后,我们发现分形高点和低点的智能系统已被加载,如下所示:

                 分形高点和低点加载

                现在,我们可以收到高点和低点的预期结果。 在低点的情况下:

                 分形高点和低点 — 低点信号

                我们可以在左上角的上一张图表中看到,分形值较低,因为分形指标形成低点。

                高点的情况,

                分形高点和低点 — 高点信号

                正如我们所见,我们有分形的高值,因为指标在图表上形成了一个高点。

                2. 分形和均线

                  以下是依据分形搭配 MA 策略所创建交易系统的完整代码。

                  //+------------------------------------------------------------------+
                  //|                                             Fractals with MA.mq5 |
                  //|                                  Copyright 2022, MetaQuotes Ltd. |
                  //|                                             https://www.mql5.com |
                  //+------------------------------------------------------------------+
                  #property copyright "Copyright 2022, MetaQuotes Ltd."
                  #property link      "https://www.mql5.com"
                  #property version   "1.00"
                  //+------------------------------------------------------------------+
                  void OnTick()
                    {
                  //creating arrays
                     double fracUpArray[];
                     double fracDownArray[];
                     MqlRates priceArray[];
                     double maArray[];
                  //Sorting data
                     ArraySetAsSeries(fracUpArray,true);
                     ArraySetAsSeries(fracDownArray,true);
                     ArraySetAsSeries(priceArray,true);
                     ArraySetAsSeries(maArray,true);
                  //define values
                     int fracDef = iFractals(_Symbol,_Period);
                     int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                  //define data and store result
                     CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                     CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                     CopyBuffer(maDef,0,0,3,maArray);
                  //get values
                     double fracUpValue = NormalizeDouble(fracUpArray[0],5);
                     double fracDownValue = NormalizeDouble(fracDownArray[0],5);
                     double closingPrice = priceArray[0].close;
                     double maValue = NormalizeDouble(maArray[0],6);
                     bool isBuy = false;
                     bool isSell = false;
                  //conditions of the strategy and comment on the chart
                  //in case of buy
                     if(closingPrice > maValue && fracDownValue != EMPTY_VALUE)
                       {
                        Comment("Buy","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals Low around: ",fracDownValue);
                        isBuy = true;
                       }
                  //in case of sell
                     if(closingPrice < maValue && fracUpValue != EMPTY_VALUE)
                       {
                        Comment("Sell","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals High around: ",fracUpValue);
                        isSell = true;
                       }
                    }
                  //+------------------------------------------------------------------+

                  代码中的差异。

                  创建两个 “MqlRates” 数据结构的价格数组,存储有关价格、交易量、和点差的信息,并创建 “double” 数据类型的 maArray。

                     MqlRates priceArray[];
                     double maArray[];

                  为这两个数组设置排序。

                     ArraySetAsSeries(priceArray,true);
                     ArraySetAsSeries(maArray,true);

                  调用 “CopyRates” 函数获取 MqlRates 的历史数据。 其参数为:

                  • symbol_name: 确定品种名称,我们将采用(_Symbol)。
                  • timeframe: 确定周期,我们将采用(_Period)。
                  • start_pos: 确定起始位置,我们将采用(0)。
                  • count: 确定要复制的数据数量,我们将采用(3)。
                  • rates_array[]: 确定要复制的目标数组,我们将采用(priceArray)。

                  调用 “iMA” 函数定义移动平均线。 其参数:

                  • symbol: 确定符号名称。
                  • period: 确定周期。
                  • ma_period: 确定均化周期,将为(50)。
                  • ma_shift: 确定水平偏移,将为(0)。
                  • ma_method: 确定移动平均线的类型,将是 EMA(指数移动平均线)。
                  • applied_price: 确定价格的类型,将以收盘价为准。
                     int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

                  数据排序。

                  CopyBuffer(maDef,0,0,3,maArray);

                  定义收盘价和 MA 值。

                  double closingPrice = priceArray[0].close;
                  double maValue = NormalizeDouble(maArray[0],6);

                  创建两个布尔变量 isBuy 和 isSell,从而避免同一根蜡烛的买入和卖出信号之间的冲突。

                     bool isBuy = false;
                     bool isSell = false;

                  策略的条件。

                  买入信号情况:

                     if(closingPrice > maValue && fracDownValue != EMPTY_VALUE)
                       {
                        Comment("Buy","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals Low around: ",fracDownValue);
                        isBuy = true;
                       }

                  卖出信号情况:

                     if(closingPrice < maValue && fracUpValue != EMPTY_VALUE)
                       {
                        Comment("Sell","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals High around: ",fracUpValue);
                        isSell = true;
                       }

                  编译并执行此代码后,我们将发现智能系统已加载。

                   分形搭配 MA 加载

                  如我们所见,搭配 MA 的分形智能系统加载在图表的右上角。 我们即可接收与以下示例相同的所需信号:

                  买入信号情况:

                   分型搭配 MA - 买入信号

                  我们在图表上得到一个含有以下值的注释:

                  • 买入
                  • 当前 EMA
                  • 分形低点围绕: n

                  卖出信号情况:

                   分型搭配 MA - 卖出信号

                  我们得到以下值:

                  • 卖出
                  • 当前 EMA
                  • 分形高点围绕: n

                  3. 分形和鳄鱼

                    以下是依据分形搭配鳄鱼策略所创建交易系统的完整代码。

                    //+------------------------------------------------------------------+
                    //|                                      Fractals with Alligator.mq5 |
                    //|                                  Copyright 2022, MetaQuotes Ltd. |
                    //|                                             https://www.mql5.com |
                    //+------------------------------------------------------------------+
                    #property copyright "Copyright 2022, MetaQuotes Ltd."
                    #property link      "https://www.mql5.com"
                    #property version   "1.00"
                    //+------------------------------------------------------------------+
                    void OnTick()
                      {
                    //creating arrays
                       double fracUpArray[];
                       double fracDownArray[];
                       MqlRates priceArray[];
                       double jawsArray[];
                       double teethArray[];
                       double lipsArray[];
                    //Sorting data
                       ArraySetAsSeries(fracUpArray,true);
                       ArraySetAsSeries(fracDownArray,true);
                       ArraySetAsSeries(jawsArray,true);
                       ArraySetAsSeries(teethArray,true);
                       ArraySetAsSeries(lipsArray,true);
                    //define values
                       int fracDef=iFractals(_Symbol,_Period);
                       int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                       int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                    //define data and store result
                       CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                       CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                       CopyBuffer(alligatorDef,0,0,3,jawsArray);
                       CopyBuffer(alligatorDef,1,0,3,teethArray);
                       CopyBuffer(alligatorDef,2,0,3,lipsArray);
                    //get values
                       double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                       double fracDownValue=NormalizeDouble(fracDownArray[0],5);
                       double closingPrice = priceArray[0].close;
                       double jawsValue=NormalizeDouble(jawsArray[0],5);
                       double teethValue=NormalizeDouble(teethArray[0],5);
                       double lipsValue=NormalizeDouble(lipsArray[0],5);
                    //creating bool variables to aviod buy ans sell signals at the same time
                       bool isBuy = false;
                       bool isSell = false;
                    //conditions of the strategy and comment on the chart
                    //in case of buy
                       if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue
                       && closingPrice > teethValue && fracDownValue != EMPTY_VALUE)
                         {
                          Comment("Buy","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals Low around: ",fracDownValue);
                          isBuy = true;
                         }
                    //in case of sell
                       if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue
                       && closingPrice < teethValue && fracUpValue != EMPTY_VALUE)
                         {
                          Comment("Sell","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals High around: ",fracUpValue);
                          isSell = true;
                         }
                      }
                    //+------------------------------------------------------------------+

                    代码中的差异。

                    创建鳄鱼分量的三个数组。

                       double jawsArray[];
                       double teethArray[];
                       double lipsArray[];

                    调用 "ArraySetAsSeries" 函数设置数据排列顺序。

                       ArraySetAsSeries(jawsArray,true);
                       ArraySetAsSeries(teethArray,true);
                       ArraySetAsSeries(lipsArray,true);

                    调用 “iAlligator” 函数定义鳄鱼指标句柄: 其参数:

                    • symbol: 我们采用 (_Symbol) 对应当前应用的品种名称。
                    • period: 我们采用 (_Period) 应用当前时间帧。
                    • jaw_period: 确定下颌的计算周期,我们将采用(13)。
                    • jaw_shift: 确定下颌的水平偏移,我们将采用(8)。
                    • teeth_period: 确定牙齿的计算周期,我们将采用(8)。
                    • teeth_shift: 确定牙齿的水平偏移,我们将采用(5)。
                    • lips_period: 确定嘴唇的计算周期,我们将采用(5)。
                    • lips_shift: 确定嘴唇的水平偏移,我们将采用(3)。
                    • ma_method: 确定移动均线类型,我们将采用(MODE_SMA)。
                    • applied_price: 确定价格类型我们将采用 (PRICE_MEDIAN)。
                    int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);

                    调用 “CopyBuffer” 函数定义数据,并存储结果。 其参数:

                    • indicator_handle: 确定指标句柄,我们将采用(allicanDef)。
                    • buffer_num: 确定指标缓冲区数,我们将采用(0 表示下颌)、(1 表示牙齿)和(2 表示嘴唇)。
                    • start_pos: 确定起始位置,我们将采用(0)。
                    • count: 确定要复制的数量,我们将采用(3)。
                    • buffer[]: 确定要复制的目标数组,我们将采用(jawsArray,toothArray,lipsArray)。
                       CopyBuffer(alligatorDef,0,0,3,jawsArray);
                       CopyBuffer(alligatorDef,1,0,3,teethArray);
                       CopyBuffer(alligatorDef,2,0,3,lipsArray);

                    获取鳄鱼分量的值。

                       double jawsValue=NormalizeDouble(jawsArray[0],5);
                       double teethValue=NormalizeDouble(teethArray[0],5);
                       double lipsValue=NormalizeDouble(lipsArray[0],5);

                    策略条件:

                    买入信号情况:

                       if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue
                       && closingPrice > teethValue && fracDownValue != EMPTY_VALUE)
                         {
                          Comment("Buy","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals Low around: ",fracDownValue);
                          isBuy = true;
                         }

                    卖出信号情况:

                       if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue
                       && closingPrice < teethValue && fracUpValue != EMPTY_VALUE)
                         {
                          Comment("Sell","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals High around: ",fracUpValue);
                          isSell = true;
                         }

                    编译此代码,并在所需的图表上执行后,我们将发现智能系统已加载到图表上,如下所示:

                     分形搭配鳄鱼加载

                    将此智能系统加载到图表之后,我们可以基于此策略获得所需的信号,就像我们在右上角的上一张图表中所见。

                    以下是测试生成的信号示例:

                    买入信号情况:

                     分型搭配鳄鱼 - 买入信号

                    正如我们所见,我们在上一张图表上的左上角得到以下值作为信号:

                    • 买入
                    • 下颌值
                    • 牙齿值
                    • 嘴唇值
                    • 分形低点值

                     分型搭配鳄鱼 - 卖出信号

                    我们在前面的图表上得到以下值作为信号:

                    • 卖出
                    • 下颌值
                    • 牙齿值
                    • 嘴唇值
                    • 分形高点值


                    结束语

                    分形技术指标是一种实用且有效的交易工具,即可作为独立工具、亦或搭配其它技术指标,且其给出了与我们在本文中所学相同的见解。 假设您已学到了它是什么,它衡量什么,如何按照其计算方法在图表上形成它,以及如何插入在 MetaTrader 5 终端上的内置函数。 除此之外,我们还通过以下简单的交易策略学习了如何运用它:

                    • 分形高点和低点:检测分形指标的高点和低点,并在图表上获取信号。
                    • 分形搭配 MA:根据价格与其移动平均线的相对位置,生成分形信号,并获取买入和卖出信号。
                    • 分形搭配鳄鱼:根据价格与鳄鱼指标的相对位置,生成分形信号,并获取买入和卖出信号。

                    我们还学习了如何基于每个拟议的策略创建一个交易系统,利用 MQL5 为这些策略编码,并在 MetaTrader 5 图表上获得自动信号。 我希望您尝试自己应用它们,以便深入了解并获得更多有关本文主题、或任何相关主题的见解,从而自阅读本文中获得所有的益处。

                    我要再次确认,在真实账户上使用任何提到的策略之前,您必须对其进行测试,以确保其可盈利。 我希望您发现这篇文章对您有用,并且您能学到一些新东西,可以很好地增强您的交易结果。 如果您已发现了这一点,并且想阅读更多类似的文章,您可以阅读我在本系列中的其它文章,了解和创建基于最流行的技术指标的交易系统。

                    本文由MetaQuotes Ltd译自英文
                    原文地址: https://www.mql5.com/en/articles/11620

                    数据科学与机器学习(第 09 部分):以 MQL5 平铺直叙 K-均值聚类 数据科学与机器学习(第 09 部分):以 MQL5 平铺直叙 K-均值聚类
                    数据挖掘在数据科学家和交易者看来至关重要,因为很多时候,数据并非如我们想象的那么简单。 人类的肉眼无法理解数据集中的不显眼底层形态和关系,也许 K-means 算法可以帮助我们解决这个问题。 我们来发掘一下...
                    神经网络变得轻松(第三十一部分):进化算法 神经网络变得轻松(第三十一部分):进化算法
                    在上一篇文章中,我们开始探索非梯度优化方法。 我们领略了遗传算法。 今天,我们将继续这个话题,并将研究另一类进化算法。
                    自适应指标 自适应指标
                    在本文中,我将研究创建自适应指标的若干种可能方式。 自适应指标的区别在于输入值和输出信号之间存在反馈。 这种反馈令指标能够独自调整到处理金融时序数据的最优状态。
                    DoEasy. 控件 (第 23 部分): 改进 TabControl 和 SplitContainer WinForms 对象 DoEasy. 控件 (第 23 部分): 改进 TabControl 和 SplitContainer WinForms 对象
                    在本文中,我将添加与 WinForms 对象工作区域边界相关的新鼠标事件,并修复 TabControl 和 SplitContainer 控件功能中的一些瑕疵。