学习如何基于分形

我们将学习它是什么,它衡量什么,以及如何手工计算它,从而理解它背后的主要思想。 我们将学习如何基于指标的基本概念,并运用在简单交易策略中,令其为我们谋利。 之后,我们将基于这些策略创建一个交易系统,可在 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

下图对应此蓝图:

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
 f fracDown
   if(fracDownValue==EMPTY_VALUE)
      fracDownValue = 0;
//comment on the chart
   Comment("Fractals Up Value = ",fracUpValue,"\n",
           "Fractals Down Value = ",fracDownValue);
  }
//+------------------------------------------------------------------+

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

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

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

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

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

我们得到两个值:

  • 分形向上值 = 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);

   if(fracUpValue ==EMPTY_VALUE)
      fracUpValue = 0;
   if(fracDownValue 
     {
      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);
 );
   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;
     }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值