# 指标,是什么?
指标的目的是为您提供可能在交易时有帮助的可视化信息。这些信息可以表现为线条、直方图、箭头或任何其他您可以用眼睛看到并据此决定如何交易的视觉信息。
指标也可以将这些信息传递给其他程序——专家顾问或脚本。但在这种情况下,信息不是可视的,而只是数字 ,因为计算机程序理解的是数字。
从技术上讲,所有指标的工作方式相同——它们用数值数据填充一些数组。这些数组称为输出缓冲区 (或简称为缓冲区 )。MetaTrader 读取这些信息并将其显示在图表上。
# 查找您的自定义指标
有一个术语叫做自定义指标 ——这些是您可以为 MetaTrader 编写的指标。MetaTrader 本身有一系列内置指标供您使用,但您无法修改。您可以在以下文件夹中找到您的自定义指标:
对于 MetaTrader 4:%Data Folder%/MQL4/Indicators/
对于 MetaTrader 5:%Data Folder%/MQL5/Indicators/
这是如何找到您的数据文件夹
# 指标如何与其他程序通信?
我们已经知道,指标将其数值数据放入称为缓冲区的地方,以便其他机器人可以读取这些数据。缓冲区是一维数组,里面填充了数值数据。该数组中的元素总数与图表上的蜡烛数量相同,这意味着每根蜡烛对应一个数值。缓冲区的每个数值都对应一个特定的蜡烛。以著名的移动平均线为例:
每根蜡烛都有一个 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 - 布尔类型,值为 true 或 false
string - 文本类型,例如 "Hello, World"
datetime - 数值类型,实际上是整数值,但该数据类型用于时间参数
color - 数值类型,同样是整数值,但用于描述颜色
