通常在开发 EA 时,您将使用特定柱的柱价格数据。 在这篇完整的 MQL4 价格数据文章中了解如何使用四个级别的价格数据(开盘价、最高价、最低价、收盘价)编写功能齐全的 Expert Advisor,以帮助您对交易 EA 进行编程。
等级 | 价格数据常量 / 功能 | 功能性 |
---|---|---|
1 | 高价、低价、开盘价、收盘价、 也:出价,询问 | 最简单的水平。 价格数据是指图表符号、图表时间框架和当前柱的当前数据价格。 |
2 | 高[]、低[]、开盘[]、收盘[] | 上一层。 价格数据是指聊天品种、图表时间框架的当前数据价格,但更灵活的是它可以参考哪个历史柱。 括号中的数字是指它可以参考的历史柱。 示例:Close[0] = 当前柱的收盘价,Close[1] = 前一个柱的收盘价。 |
3 | iHigh()、iLow()、iOpen()、iClose() | 非常灵活的功能级别。 价格数据功能是指自定义交易品种和/或时间框架和/或历史柱的价格数据。 示例 #1:iClose(NULL,0,0) = 图表交易品种、时间范围、当前柱的收盘价。 注意:它的这种用法与 Close 或 Bid 甚至 iClose[0] 几乎没有区别。 示例 #2:iClose (“EURUSD”,30,1) = EURUSD 符号的收盘价,30 分钟时间范围,前一个柱形。 注意:这次使用它比以前的价格数据功能增加了三倍的功能。 |
4 | iHighest(), iLowest(), | 价格数据函数用于查找一段时间范围内的最大价格数据值。 适用于查找特定范围内的最高或最低数据值。 示例:Low[iLowest(Symbol(), 0, MODE_LOW, 3, 1)] = 最后三个柱中的最低柱。 |
让我们分别查看这四个级别的价格数据。
如果您只是想参考当前图表和时间范围的当前柱的价格数据,您可以使用以下任何一种价格数据方法:High、Low、Open、Close、Bid、Ask。
请记住,所有人都必须有一个首字母大写字母才能被程序读取(出价有效,出价无效)。 如果要参考当前的收盘价,可以使用Close,也可以使用Bid,因为MT4的收盘价默认为Bid。 例如,如果您希望您的 EA 寻找当前收盘价必须大于 200 周期移动平均线的条件,您可以这样声明:
关闭 > iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,1)
或者,或者,作为:
出价 > iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,1);
注意:请记住,这种简单的价格数据水平只能用于图表符号、图表时间范围和当前柱。 如果您想灵活地使用不同的柱线,您必须求助于 2 级或 3 级价格数据。 如果您想灵活地使用不同的图表符号、不同的时间范围以及不同的柱线,您必须使用 3 级价格数据。
如果您想使用当前图表的价格数据,但又想控制您所指的柱线,您可以使用预定义的系列数组:High[]、Low[]、Open[] 和 Close [].
数组是存储多个值的变量。 它们的作用类似于列表,您可以在其中对表中的项目进行分组并按行号访问它们,称为索引。 编号的行或索引从 0 开始,然后进行到 1、2、3 等。这些编号的索引包含在括号中,在上面的特定情况下,每个编号的索引指的是时间上的特定柱并更改编号 及时更改您要参考的栏。 例如 Close[0] 是当前柱的开盘价,其中 0 是索引,通过改变它,我们可以得到其他柱的收盘价: Close[1] 指的是当前柱的前一根柱 , Close [2] 指的是从当前柱回退 2 个柱,等等。
在我们创建的大多数 EA 中,我们将使用当前柱或前一个柱的价格值。 但是,如果您不仅希望更灵活地处理不同历史柱线的价格数据,还希望处理当前图表以外的不同交易品种或当前图表以外的不同时间范围的价格数据,那么您必须转向 3 级价格数据。
如果您想使用当前图表以外的交易品种的价格数据(最高价、最低价、开盘价、收盘价),或者如果您需要当前图表时段以外的其他时段的价格数据,您可以使用以下价格数据函数 :iHigh()、iLow()、iOpen() 和 iClose()。 这些将为您提供单个周期或条形图上的价格数据值。
下表说明了 iClose() 函数的语法:
参数 | 描述 |
---|---|
Symbol | 使用的货币对符号 |
Timeframe | 大体时间。 可以是任何 Timeframe 枚举值。选择 (0) 显示当前显示的时间范围或选择一个 以下之一:(1、5、15、30、60、240、1440、10080、43200){全部在 分钟} |
Shift | 相对于当前柱的后移 |
例如,假设您打开了一个 1 小时图,但您想在日线图上查看前一根柱线的收盘价。
这是昨天的最高价和最低价样本:
双高 = iHigh(NULL, PERIOD_D1, 1);
双低 = iLow(NULL, PERIOD_D1, 1);
参数表示:
NULL = 当前图表代码。
PERIOD_D1 = D1 或日线图周期,也可以是 1440。
1 = shift,1 代表前一个柱。
注意:iHigh() 和 iLow() 函数让您移动单个柱的最大值。 如果您想要在柱线范围内移动最大值,您必须使用 iHighest() 和 iLowest() 函数,下面将进一步讨论。
有两种放置时间范围的方法:一种是通过周期常数,另一种是通过整数值,如下例所示。
双高 = iClose (NULL,Period_D1,1);
双高 = iClose (NULL, 1440,1);
您会看到 PERIOD_D1 可以替换为 1440 — 分钟组成一天的时间段。
这是常量值及其整数等价物的完整表格:
持续的 | 价值 | 描述 |
---|---|---|
PERIOD_M1 | 1 | 1 分钟 |
PERIOD_M5 | 5 | 5 分钟 |
PERIOD_M30 | 30 | 30 分钟 |
PERIOD_H1 | 60 | 1 小时 |
PERIOD_H4 | 240 | 4 小时 |
PERIOD_D1 | 1440 | 日常的 |
PERIOD_W1 | 10080 | 每周 |
PERIOD_MN1 | 43200 | 每月 |
0 (zero) | 0 | 图表的时间范围 |
这些微小的值替换很容易记住,一旦记住,我发现它们比常量更容易输入到指定的参数框中。 我还发现这些整数可以更容易地与外部变量一起使用。 例如,如果我们想参考与我们自己的 H1 图表不同的前一个收盘价,但我们不知道要使用哪个时间范围,该怎么办。 然后我们可以将时间范围参数构造为外部变量,如下例所示:
// 放入外部变量部分
外部 int 时间框架 = 30;
// 放置在你的代码中的某处
双 PreviousClose = iClose (NULL, TimeFrame, 1);
TimeFrame 是我的标识符,指的是时间帧参数,我的默认值是 30,指的是之前的 M30 柱。 我知道这是前一根柱线,因为我在 shift 参数中输入了 1。 如果我想参考当前 M5 收盘价,我只需在第二个参数中输入 5,如果我想参考当前柱,我只需在第三个参数中输入 0。
现在您可以轻松地让您的 EA 参考多个时间范围,如果您愿意,您甚至可以设置策略测试器在时间范围之间进行优化。
很棒的是,您不仅可以轻松参考多个时间范围,还可以轻松参考多个货币对。 NULL 代表当前图表的交易品种,但它可以替换为任何货币交易品种,甚至是 EA 自己图表之外的货币。 这样做很简单:您只需将 NULL 替换为您要使用的交易品种(它必须出现在您的市场窗口中)并将其包装在报价市场中。
如果您想引用 EURUSD 符号,请示例:
double PreviousClose = iClose (“EURUSD”, 30,1);
此外,您可以灵活地为此参数构造一个外部变量,如下例所示:
// 放入外部变量部分
外部字符串货币名称 = “EURUSD”;
外部 int 时间框架 = 30;
// 放置在你的代码中的某处
double PreviousClose = iClose (CurrencyName, TimeFrame, 0);
如您所见,我们将 NULL 替换为外部字符串变量,我们标识为 CurrencyName,并且我们默认为“EURUSD”(尽管它可以是您可以在市场窗口中看到的任何货币对,只要您将其放在报价中 分数)。 另请注意,要附加到外部变量的所有货币名称都必须使用外部字符串变量。
为什么您需要参考与您的图表不同的货币对?
我能想到很多原因,但最先想到的是当你通过相关性进行交易时。 例如,假设您正在交易 GBPUSD,但您认为 EURUSD 是大多数主要货币的领先货币,因此您想首先查看 EURUSD 的趋势方向,以此作为开仓交易的先决条件 英镑兑美元。
除了使用单个周期的 iHigh() 和 iLow 等价格数据函数外,还可以使用一系列周期内最大值的价格数据函数:iHighest() 和 iLowest()。 使用这些函数中的每一个,您都可以处理一个范围内多个柱的 h/l。
这两个函数有自己的参数集:
int iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)
参数 | 描述 |
---|---|
Symbol | 使用的符号。 NULL=当前图表 |
TimeFrame | 大体时间。 它可以是任何时间范围的计数。 0=当前时间范围 |
Type | 系列数组标识符。 它可以是任何 Series 数组标识符枚举值 |
Bar Count | 您要测试的柱数,从起始柱到执行计算的后面柱的方向。 |
Start Bar | Shift 显示相对于当前柱的柱,应该从中获取数据 |
Series array identifier table:
Constant | Value | Description |
---|---|---|
MODE_OPEN | 0 | 开盘价 |
MODE_LOW | 1 | 低价 |
MODE_HIGH | 2 | 高价 |
MODE_CLOSE | 3 | 收盘价 |
MODE_VOLUME | 4 | 交易量,用于 iLowest() 和 iHighest() 函数。 |
MODE_TIME | 5 | 柱开盘时间,用于 ArrayCopySeries() 函数。 |
注意:您似乎可以选择使用上述任何类型,但在一般实践中,您将使用 MODE_HIGH 和 iHighest() 以及 MODE_LOW 和 iLowest()。
止损的最后 3 个柱的最低低点和最高点示例:
// stop = lowest Low of the last 3 bars
if(dir == OP_BUY)
{
stopLoss = Low[iLowest(Symbol(), 0, MODE_LOW, 3, 1)];
}else if(dir == OP_SELL)
{
stopLoss = High[iHighest(Symbol(), 0, MODE_HIGH, 3, 1)];
}
以上是使用不同于常规止损类型的巧妙技术。
如果您想获得 10 到 20 小节之间的最低值怎么办?
// 计算范围内 10 个连续柱的最低值
// 当前图表上第 10 到第 19 个索引(含)
double val=Low[iLowest(NULL,0,MODE_LOW,10,10)];