在我开始教你如何编程一个使用MA分频器作为MACD滤波器的输入信号的EA之前,我需要告诉你,我已经改变了我们上次写的代码的一些编程风格。

如果你下载新文件,你会看到我已经缩写了很多。如果您将新文件与旧文件进行比较,那么阅读和理解它应该不是问题。这是一种使用布尔值更简单的方法。这也可以通过布尔函数来完成。(见下一个示例)而且你必须知道,有时你可以把大括号放在一边。但前提是你只在它后面写一个命令行。

// you can do this
if(IsNewBar()) Print("There is a new bar");

// but you cannot do this
if(IsNewBar()) Print("There is a new bar"); Comment("There is a new bar");

// in the second case the Comment would be displayed even if the IsNewBar function returns a false. It's like the Comment is on a new line.

 战略

我们将制作一个具有两条移动平均线的 MA 交叉 EA。周期为 12 的快速 MA 和周期为 16 的慢速 MA。我们只想在 MACD (12,26,9) 高于 0 且 MACD 主线高于 MACD 信号线时进行买入交易。

该指标的数据应来自日线图。(我还不知道这是否是一个成功的策略,但这并不重要)。

ma-cross-with-macd-filter

Let’s start

在本章中,我们只看一下我们的自定义函数 InitIndicators()、BuySignal() 和 SellSignal() 以及新指标的全局变量,因为这些是我们唯一需要改变的东西,以使我们的新策略发挥作用。首先,我们编写全局变量,以便我们的指标存储那里的值。我们列出了下面列出的 4 个。但是等等。对于这个策略,我们需要比这 4 个更多的数据。对于分频器,每个 MA 需要 2 个变量。我们需要交叉前后两个均线的价格来检测交叉。

我们需要第二根和第三根蜡烛的价格(记住蜡烛 0 是当前蜡烛,蜡烛 1 是过去的蜡烛,依此类推)。对于MACD,我们使用当前蜡烛的价格。因此,我们编写: 接下来,我们需要在 InitIndicators() 函数中用指标 price 填充变量。您可以在此处找到有关 iMACD 功能的更多信息:http://docs.mql4.com/indicators/imacd

 入场信号

现在我们只需要写入场信号。这很容易。让我们从 MA 开始。如果蜡烛 1 上的快速 MA 高于蜡烛 2 上的慢速 马,而蜡烛 2 上的快速 MA 低于蜡烛 2 上的慢速 MA,则 BuySignal 函数将返回 true。

默认情况下,该函数返回 false。卖出信号反之亦然

MACD filter

如果 MACD 主线不高于 0,MACD 信号线也不高于 0,则“MACD 零线滤波器”将返回 false。如果 MACD 主线不在 MACD 信号线上方,则“MACD 趋势过滤器”将返回 false。我们在写入策略的括号前用感叹号实现 not。下载源代码

 美化代码

EA 现已完成并且运行良好。但我不喜欢它的一些细节。现在,我将向您展示如何使用数组使代码看起来更美观。我们应该使用数组,而不是为我们想要存储的每个价格使用变量。

如果您不知道数组是什么,请先阅读以下内容:http://book.mql4.com/variables/arrays。因此,我们使用一个数组作为 MACD,一个用于快速 MA,一个用于慢速 MA。我们将在每个价格中存储 2 个价格。MACD 中的主线和信号线[]。fast_MA[] 和 slow_MA[] 数组中两个 MA 的 Candle1 和 candle2。

但是,由于数组总是开始计数 0,如果我们将 Mas candle1 存储在 [1] 中会更好,因此我们使用数组的 3 个内存插槽并将第一个 [0] 留空。为了将指标价格存储在这些数组中,我们使用 for 循环。请参阅: http://docs.mql4.com/basis/operators/for 第一次运行 for 循环时,EA 将存储 ….

  •  int i 为 0
  • MACD的主要价格[0]
  • fast_MA快速均线的蜡烛1价格[1]
  • slow_MA中慢速均线的蜡烛1价格[1]

第二次运行 for 循环时,EA 将存储 ….

  •  int i 为 1
  • MACD中的MACD信号价格[1]
  • fast_MA中快速均线的蜡烛2价格[2]
  • slow_MA中慢速均线的蜡烛2价格[2]
void InitIndicators()
  {
   for(int i=0;i<2;i++)
     {
      // MACD (0-MODE_MAIN, 1-MODE_SIGNAL)
      MACD[<strong>i</strong>]=iMACD(_Symbol,PERIOD_D1,12,26,9,PRICE_CLOSE,<strong>i</strong>,0);

      // Fast MA
      fast_MA[<strong>i+1</strong>]=iMA(_Symbol,PERIOD_CURRENT,12,0,MODE_EMA,PRICE_CLOSE,<strong>1+i</strong>);

      // Slow MA
      slow_MA[<strong>i+1</strong>]=iMA(_Symbol,PERIOD_CURRENT,16,0,MODE_EMA,PRICE_CLOSE,<strong>1+i</strong>);
     }
  }

在我们进行这些更改后,我们可以调整入场信号如下: 我认为它现在😀看起来好多了 请下载文件以查看完整的源代码。

我还没有写过关于如何平仓的教程,但如果你想知道如何做,请查看这个主题:
https://quivofx.com/boards/topic/orderclose-function/

Go to the next tutorial.

对本 mql4 教程有疑问吗?在论坛中发表评论或打开主题(如果还没有答案)

如果您看到错误,请与我联系。

本 MQL4 教程创建于 2015 年 12 月 14 日。

下载源代码