这是用户在 2025-8-3 3:51 为 https://fxdreema.com/documentation/builder/indicators 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?

# 指标,是什么?

指标的目的是为您提供可能在交易时有帮助的可视化信息。这些信息可以表现为线条、直方图、箭头或任何其他您可以用眼睛看到并据此决定如何交易的视觉信息。

指标也可以将这些信息传递给其他程序——专家顾问或脚本。但在这种情况下,信息不是可视的,而只是数字 ,因为计算机程序理解的是数字。

从技术上讲,所有指标的工作方式相同——它们用数值数据填充一些数组。这些数组称为输出缓冲区 (或简称为缓冲区 )。MetaTrader 读取这些信息并将其显示在图表上。

# 查找您的自定义指标

有一个术语叫做自定义指标 ——这些是您可以为 MetaTrader 编写的指标。MetaTrader 本身有一系列内置指标供您使用,但您无法修改。您可以在以下文件夹中找到您的自定义指标:

  • 对于 MetaTrader 4:%Data Folder%/MQL4/Indicators/
  • 对于 MetaTrader 5:%Data Folder%/MQL5/Indicators/

这是如何找到您的数据文件夹

MetaTrader 5 - Open Data Folder

# 指标如何与其他程序通信?

我们已经知道,指标将其数值数据放入称为缓冲区的地方,以便其他机器人可以读取这些数据。缓冲区是一维数组,里面填充了数值数据。该数组中的元素总数与图表上的蜡烛数量相同,这意味着每根蜡烛对应一个数值。缓冲区的每个数值都对应一个特定的蜡烛。以著名的移动平均线为例:

每根蜡烛都有一个 ID 编号,或称为偏移量。最新蜡烛的编号是 0。前一根蜡烛的编号是 1。然后依次是 2、3、4,依此类推。每根蜡烛都有一个数值:

  • 蜡烛 0 的数值是 1.3667
  • 蜡烛 1 的数值是 1.3658
  • 蜡烛 2 的数值是 1.3641
  • ...

基本上,这就是我们的数据数组,输出缓冲区。当这些数字由 MetaTrader 绘制在图表上时,我们会看到一条线。

我们可以有多个缓冲区,每个缓冲区都有自己的编号。类似于蜡烛图,第一个缓冲区是0,第二个是1,然后是2,依此类推。

现在假设我们想在我们的专家顾问中获取一个指标的数值。我们需要指向该指标(通过文件名)、输出缓冲区(0、1、2、3……)以及蜡烛编号(0、1、2、3……)。

点击这里了解更多关于输出缓冲区的信息。

# 如何判断您的自定义指标有哪些缓冲区?

当您将自定义指标添加到图表时,您可以看到其参数。转到颜色标签,您将看到类似如下内容:

显然,有3个输出缓冲区,你甚至可以看到它们的编号——0、1和2。你也可以猜出它们各自代表什么:

  • 缓冲区 0 用于 中线
  • 缓冲区 1 用于 上线
  • 缓冲区 2 用于 下线

# 指标中的箭头(中断信号)

有些指标不会绘制连续的线条。你可能见过一些指标在图表上零散地放置箭头。它们是如何做到的?

在指标代码中,有指令告诉 MetaTrader 如何在图表上绘制缓冲区中的数据。数据会显示为线条、柱状图,还是某种箭头或点状物,取决于这些指令。以下是可能的绘图样式:

但我们已经知道,每个输出缓冲区的元素(数值)数量与图表上的蜡烛数量相同,这一点始终成立。那么,我们如何只在特定的蜡烛上显示内容呢?这很简单,我们可以在缓冲区中放入一个特殊的数值,当 MetaTrader 看到该数值时,就不会在该蜡烛的图表上显示任何内容。这个数值称为 EMPTY_VALUE。这是一个预定义的常量,其实际值是可能的最大整数值:

  • 32 位(MetaTrader 4):EMPTY_VALUE 等于 2,147,483,647
  • 64 位(MetaTrader 5):EMPTY_VALUE 等于 9,223,372,036,854,775,807

你现在可以想象,如果输出缓冲区全部填充为 EMPTY_VALUE,你在图表上将看不到任何东西。

提示 1:在 fxDreema 中,如果 Condition 块的任一操作数等于 EMPTY_VALUE,该条件块将不会通过。这是因为 EMPTY_VALUE 应被视为不存在的值,毕竟它的名称中包含“empty”(空)的字样。

提示 2:如果你期望从绘制箭头的指标中获得信号但没有任何信号,尝试将 Candle ID 参数设置为大于 0 的值。这些指标通常会在较旧的蜡烛上给出信号,而不是当前蜡烛。尝试将 Candle ID 设置为 1。

# 图表上的箭头和线条,但缓冲区中没有任何内容?

是的,这是可能的。有些指标直接在图表上绘制它们的对象。这主要适用于绘制趋势线或箭头的指标。在这种情况下,您无法使用输出缓冲区来提取数值,但可以从对象中获取信息。尽管这通常不是一件容易的事。

还要注意,如果情况确实如此,您使用的指标仅绘制对象,并且您在专家顾问中以某种方式处理了它们,那么由于 MetaTrader 的一些限制,策略在进行优化时可能无法正常工作。

点击此处了解有关图表对象的更多信息

# 查看缓冲区内容

当你第一次尝试一个新的自定义指标时,可能完全不知道它的缓冲区里有什么,也不知道如何在策略中使用它们。但你可以轻松地用 Trace 模块来检查它们。请看下面的示例(这不是截图):

.

回测时,结果如下:

你想看到的是各种不同的数值。如果你只看到所有蜡烛图都相同的一个数值,那么你无法在此配置下使用该缓冲区。

# 指标何时会自动显示在图表上?

您会注意到所有指标在回测后都会自动出现,但在前测中不会。这是不是很奇怪?

当一个专家顾问脚本在其代码中使用指标时,该指标会在后台加载,您永远看不到它出现在图表上。这就是为什么如果您想看到该指标,您需要手动将其添加到图表上。但当您这样做时,实际上是创建了该指标的另一个实例,而您仍然看不到后台运行的那个。您甚至可能尝试修改其输入参数,但这不会改变机器人在后台加载的指标的参数。

# 信息不足?

欲了解更详细的信息,请阅读这篇文章

# 如何在 FxDreema 中使用自定义指标?

在 fxDreema 中,您可以将自定义指标添加到数据库中,以便在项目中轻松使用。首先,进入我的指标 。要添加新指标,您需要其源代码文件,扩展名为 .mq4.mq5。如果没有源代码,您也可以手动填写所有必要信息。

实际上,从源代码文件添加新指标的过程并不涉及将整个文件上传到服务器。所有必要信息均由浏览器本地读取,然后仅将这些信息发送到服务器。对于自定义指标,您只需要以下信息:

  • 指标名称 - 这必须与您的自定义指标文件名相同(不含扩展名)。如果文件名是 "Custom ATR.mq5",则填写 "Custom ATR"。
  • 输入参数 - 它们的数量和顺序必须正确,否则自定义指标将无法成功加载。名称也应相同,但这不是强制性的。它们的数据类型应至少相似。
  • 输出缓冲区 - 你可以为它们命名任何你更容易理解的名称。

现在你可以在 fxDreema 的模块中使用你的自定义指标,例如在条件模块中。

# 如何手动添加自定义指标?

您有两个选项——从源代码或从 MetaTrader 获取信息。



选项1:从源代码获取信息

您可以打开源代码文件并从中获取信息。所有必要的信息都位于文件顶部的某处。这是一个自定义指标的一部分:

//+------------------------------------------------------------------+
//|                                                    Alligator.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
#property indicator_type3   DRAW_LINE
#property indicator_color1  Blue
#property indicator_color2  Red
#property indicator_color3  Lime
#property indicator_width1  1
#property indicator_width2  1
#property indicator_width3  1
#property indicator_label1  "Jaws"
#property indicator_label2  "Teeth"
#property indicator_label3  "Lips"
//---- input parameters
input int                InpJawsPeriod=13;               // Jaws period
input int                InpJawsShift=8;                 // Jaws shift
input int                InpTeethPeriod=8;               // Teeth period
input int                InpTeethShift=5;                // Teeth shift
input int                InpLipsPeriod=5;                // Lips period
input int                InpLipsShift=3;                 // Lips shift
input ENUM_MA_METHOD     InpMAMethod=MODE_SMMA;          // Moving average method
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN;   // Applied price
//---- indicator buffers
double ExtJaws[];
double ExtTeeth[];
double ExtLips[];
//---- handles for moving averages
int    ExtJawsHandle;
int    ExtTeethHandle;
int    ExtLipsHandle;
//--- bars minimum for calculation
int    ExtBarsMinimum;

您可以看到输入参数的定义位置:

input int                InpJawsPeriod=13;               // Jaws period
input int                InpJawsShift=8;                 // Jaws shift
input int                InpTeethPeriod=8;               // Teeth period
input int                InpTeethShift=5;                // Teeth shift
input int                InpLipsPeriod=5;                // Lips period
input int                InpLipsShift=3;                 // Lips shift
input ENUM_MA_METHOD     InpMAMethod=MODE_SMMA;          // Moving average method
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_MEDIAN;   // Applied price

关键字 input 将这些全局变量转换为输入参数。第二个词是数据类型(int,ENUM_MA_METHOD,ENUM_APPLIED_PRICE)。然后是参数名称(InpJawsPeriod,InpJawsShift...)。接着是默认值(13,8...)。最后是每个参数的描述。

这里我们可以看到输出缓冲区的数量,显然有3个缓冲区:

#property indicator_buffers 3
#property indicator_plots 3



选项 2:从 MetaTrader 获取信息

打开您的指标参数。 输入参数列在输入标签下, 输出缓冲区列在颜色标签下:

每个输入参数的数据类型以图标表示。图标含义如下:

  • int - 数值类型,整数,例如 3
  • double - 数值类型,浮点数,例如 3.654
  • bool - 布尔类型,值为 truefalse
  • string - 文本类型,例如 "Hello, World"
  • datetime - 数值类型,实际上是整数值,但该数据类型用于时间参数
  • color - 数值类型,同样是整数值,但用于描述颜色

点击此处了解有关数据类型的更多信息