如何利用 MQL5 处理指示线
概述
作为交易者,我们都会在交易时画很多线,从而帮助我们观察一些重要的价位,以便据其制定合适的交易决策。 因此,这些指示线对于作为交易者的我们非常重要,我们也许会琢磨是否有一种方法可以绘制这些指示线,或根据它们自动做出合适的决策,因为我认为这对我们的帮助很大。 答案是肯定的,我们有一种方法,可利用 MQL5(MetaQuotes 语言 5)来做到这一点。
本文是学习如何利用 MQL5 处理这些指示线的示例,因为有许多方法可以执行此类操作,而这些方法取决于您需要的作为。 指示线有很多类型,但我们仅在本文中提到其中广受欢迎的三种,它们是趋势线、支撑线和阻力线。
我们将在以下主题中涵盖它们:
一般来说,MQL5 有很多方法可用于处理指示线,我们将在这里分享简单的一种,也许您发现需要开发它,以便匹配您的策略,我们将在这里分享一种方法,可检测价位,然后绘制更新的指示线类型。
我们将通过识别其类型来详细了解指示线的一切,我们如何手工绘制它们,以及如何在交易中运用它们。 我们学习如何利用 MQL5 来处理趋势线、支撑位和阻力位,从而帮助我们通过自动化来简化交易过程,并增强交易结果。 我们将利用内置于 MetaTrader 5 交易终端中的 MQL5(MetaQuotes 语言 5)来编写程序,如果您还不知道如何使用它们,您可以阅读以前的文章在 MetaEditor 中编写 MQL5 代码中的主题,从而了解更多信息。
我的建议是尝试编写和应用您自己阅读的内容,因为此步骤对于提高您的编码技能非常重要,除了获得有关本文主题和/或任何相关主题的更多见解外,它还将加深您的理解,且这些主题可用于开发和增强您的交易结果。
趋势线和 MQL5
指示线是可用于交易,并据其获得更有效结果的技术工具。 这些指示线可以围绕重要的价格或级别绘制,这些价格或级别可当作制定有效决策的触发器,并且这些指示线有很多类型。 我们将在本文中提到其中三条重要的指示线,它们是趋势线、支撑位和阻力位。
现在,我们就开始识别并处理趋势线。 趋势线是可视化价位的指示线,可当作向上或向下的反弹价位。 它可根据行情方向,绘制在价格上方或下方。 故此,我们可以说趋势线可以帮助我们探测行情趋势的方向。 如果价格在同一条上升线上的三个点处反弹向上,那么所绘制的指示线是一条上升趋势线。 反之亦然,如果价格在同一条下降线上的三个点反弹向下,那么所绘制的指示线是一条下降趋势线。 这里需要提到的是,趋势线只是一种工具,您可以正确识别和绘制它。
我们可以在交易中应用趋势线,并依据趋势线类型下单。 如果是上升趋势线,我们可能会期望价格向下移动,来从上方测试该趋势线,若反弹到向上,然后我们就可在此趋势线附近放置买入订单。 反之亦然,如果是一条下降趋势线,我们可能期望价格从下方向上移动,来测试该趋势线,若反弹向下,然后我们就可以在此下降趋势线附近放置卖出订单。
以下是上升趋势线:
我们可以看到,上图中很明显,我们有一个向上的走势,如果我们尝试在最后三个低点之间连接,我们可以发现它们在同一条上升线上。
以下是行情上升趋势线的示例:
正如我们在上一张图表中所见,我们有一条上升趋势线,被多次触及,并在找到上涨的购买力动后反弹,这证实了上升趋势的存在。
以下是下降趋势线:
我们可以看到,上图中很明显,我们有一个向下的走势,如果我们尝试在最后三个高点之间连接,我们可以发现它们在同一条下降线上。
以下是行情下降趋势线的示例:
正如我们在上一张图表中所见,我们有一条下降趋势线,被多次触及,并在找到下跌的卖出动力后反弹,这证实了下降趋势的存在。
1. 上升趋势线系统
我们需要创建一个程序,通过 MetaTrader 5 自动创建一条上升趋势线,可看到其下方价格潜在的上涨走势。 我们需要程序来检查价格低点,以及每次跳价是否有任何上升趋势线迹象。 然后删除之前的上升趋势线,并在价格低点下方创建一条更新的蓝色趋势线。
为此,我们可以按照以下步骤作为可用方法之一。
为第一根检测蜡烛创建一个整数型变量,令其等于当前图表调用 “ChartGetInteger” 函数返回相应的长整数型属性值,其参数为:
- chart_id: 确定图表,我们将采用(0)来表示当前图表。
- prop_id: 确定图表属性 ID,我们可以在此处取用其中一个(ENUM_CHART_PROPERTY_INTEGER)值。 我们将采用(CHART_FIRST_VISIBLE_BAR)。
- sub_window=0: 确定图表子窗口的编号。 我们将采用(0) 来表示主图表窗口。
int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
为蜡烛最低价创建数组 pLow,数据类型为双精度。
double pLow[];
调用 “ArraySetAsSeries” 函数为所创建的数组设置排序,并返回一个布尔值,该值在成功时为真,在另一种情况下为假。
ArraySetAsSeries(pLow,true);
调用 “CopyLow” 函数填充所创建 pLow 数组,以此获得当前品种当前时间帧的最低价格。 其参数为:
- symbol_name: 确定交易品种,我们将采用(_Symbol) 对应于当前品种。
- timeframe: 确定时间帧,我们将采用(_Period) 对应于当前时间帧。
- start_pos: 确定要复制的元素的起始位置,我们将采用(0)。
- count: 确定要复制的数据计数,我们将采用预先创建的变量(candles)。
- low_array[]: 确定要复制的目标数组,我们将采用(pLow)数组。
CopyLow(_Symbol,_Period,0,candles,pLow);
创建并计算蜡烛最低价变量 “candleLow”,其为一个整数型变量,等于数组的最小值,我们将调用 “ArrayMinimum” 函数返回数组中的最低元素。 其参数为:
- array[]: 确定数组,我们将采用(pLow)数组。
- start=0: 确定开始检查的索引,我们将采用(0)值。
- count=WHOLE_ARRAY: 确定选中元素的数量,我们将采用(candles)。
int candleLow = ArrayMinimum(pLow,0,candles);
创建价格 “pArray” 数组,并调用 “MqlRates” 函数存储有关价格、交易量和点差信息。
MqlRates pArray[];
调用 “ArraySetAsSeries” 函数对 “pArray” 的价格数组设置排序。
ArraySetAsSeries(pArray,true);
在创建整数型变量“Data” 后,将价格数据复制到价格数组,然后调用“CopyRates” 获取 MqlRates 结构的历史数据。 其参数为:
- symbol_name: 确定品种,我们将采用(_Symbol)对应于当前图表。
- timeframe: 确定时间帧,我们将采用(_Period)对应于当前时间帧。
- start_pos: 确定起始位置,我们将采用(0)值。
- count: 确定要复制的数据计数,我们将采用创建的(candles)变量。
- rates_array[]: 确定要复制的目标数组,我们将采用( pArray)。
int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
删除所有前创建的、需更新的趋势线,调用 “ObjectDelete” 函数从所有指定图表中删除任何指定对象。 其参数为:
- chart_id: 确定图表标识符,我们将采用(_Symbol)对应于当前品种。
- name: 指定我们要删除的对象的名称,我们将采用(“UpwardTrendline”)作为名称。
ObjectDelete(_Symbol,"UpwardTrendline");
调用 “ObjectCreate” 创建新的趋势线对象,其会创建一条趋势线。 其参数为:
- chart_id: 确定品种,我们将采用(_Symbol)对应于当前品种。
- name: 指定对象名称,我们将指定(“UpwardTrendline”)作为名称。
- type: 确定对象类型,我们将采用(OBJ_TREND)创建趋势线。
- nwin: 确定窗口索引,我们将采用(0)值来指定主图表窗口。
- time1: 确定第一个锚点的时间,我们将采用(pArray[candleLow].time)。
- price1: 确定第一个锚点的价格,我们将采用(pArray[candleLow].low)。
- timeN: 确定锚点 N 的时间,我们将采用(pArray[0].time)。
- priceN: 确定锚点 N 的价格,我们将采用(pArray[0].low)。
ObjectCreate(_Symbol,"UpwardTrendline",OBJ_TREND,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low);
调用 “ObjectSetInteger” 函数为对象设置颜色值,确定趋势线颜色。 其参数为:
- chart_id: 图表标识符,我们将采用(0)值,表示当前图表。
- name: 对象名称,我们将采用(“UpwardTrendline”),这是对象的预定义名称。
- prop_id: 对象属性的 ID,我们将采用其中一个 ENUM_OBJECT_PROPERTY_INTEGER,即(OBJPROP_COLOR)。
- prop_value: 属性的值,我们将采用(Blue)作为所创建趋势线的颜色。
ObjectSetInteger(0,"UpwardTrendline",OBJPROP_COLOR,Blue);
也可以调用 ObjectSetInteger 函数设定趋势线样式,但我们采用另一个 ENUM_OBJECT_PROPERTY_INTEGER,即 (OBJPROP_STYLE),prop_value 将取(STYLE_SOLID)作为所创建趋势线的样式。
ObjectSetInteger(0,"UpwardTrendline",OBJPROP_STYLE,STYLE_SOLID);
调用 “ObjectSetInteger” 函数设定趋势线宽度,但我们将采用另一个 ENUM_OBJECT_PROPERTY_INTEGER,即(OBJPROP_WIDTH),prop_value 将取(3)作为所创建趋势线的宽度。
ObjectSetInteger(0,"UpwardTrendline",OBJPROP_WIDTH,3);
调用 “ObjectSetInteger” 函数设置趋势线射线,但我们将采用 ENUM_OBJECT_PROPERTY_INTEGER 的另一个,即(OBJPROP_RAY_RIGHT),并且属性值将为 true。
ObjectSetInteger(0,"UpwardTrendline",OBJPROP_RAY_RIGHT,true);
以下是自动创建上升趋势线的完整代码:
//+------------------------------------------------------------------+ //| UpwardTrendline System.mq5 | //+------------------------------------------------------------------+ void OnTick() { int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); double pLow[]; ArraySetAsSeries(pLow,true); CopyLow(_Symbol,_Period,0,candles,pLow); int candleLow = ArrayMinimum(pLow,0,candles); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int Data = CopyRates(_Symbol,_Period,0,candles,pArray); ObjectDelete(_Symbol,"UpwardTrendline"); ObjectCreate(_Symbol,"UpwardTrendline",OBJ_TREND,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low); ObjectSetInteger(0,"UpwardTrendline",OBJPROP_COLOR,Blue); ObjectSetInteger(0,"UpwardTrendline",OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,"UpwardTrendline",OBJPROP_WIDTH,3); ObjectSetInteger(0,"UpwardTrendline",OBJPROP_RAY_RIGHT,true); } //+------------------------------------------------------------------+
此代码编写完毕后,我们将对其进行编译,它必须不能导致任何错误。
将 EA 拖放到图表上,我们将找会到与以下内容相同的智能系统窗口:
在“允许算法交易”旁边打勾,并按“确定”后,我们的 EA 加载到图表上,我们将准备好查看基于此 EA 的所需操作,与以下示例相同:
正如我们在上一个图表中所见,我们将 EA 加载到图表上,其在右上角很明显,我们在价格下方绘制了蓝色上升趋势线。
2. 下降趋势线系统
我们需要创建一个程序,可通过 MetaTrader 5 自动创建一条下降趋势线,可观察上方价格潜在的下降走势。 我们需要程序来检查价格高点,以及在每次跳价时,是否有任何下降趋势线。 然后删除之前的下降趋势线,并在价格高点上方创建一条更新的蓝色趋势线。
为此,我们可以参照以下完整代码作为可用方法之一。
//+------------------------------------------------------------------+ //| DownwardTrendline System.mq5 | //+------------------------------------------------------------------+ void OnTick() { int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); double pHigh[]; ArraySetAsSeries(pHigh,true); CopyHigh(_Symbol,_Period,0,candles,pHigh); int candleHigh = ArrayMaximum(pHigh,0,candles); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int Data = CopyRates(_Symbol,_Period,0,candles,pArray); ObjectDelete(_Symbol,"DnwardTrendline"); ObjectCreate(_Symbol,"DnwardTrendline",OBJ_TREND,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_COLOR,Blue); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_WIDTH,3); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true); } //+------------------------------------------------------------------+
此代码的不同之处:
创建蜡烛最高价序列数组。
double pHigh[];
所创建数组排序时从当前数据开始。
ArraySetAsSeries(pHigh,true);
用数据填充数组。
CopyHigh(_Symbol,_Period,0,candles,pHigh);
创建并计算(candle)变量的最高值
int candleHigh = ArrayMaximum(pHigh,0,candles);
删除先前的所有下降趋势线
ObjectDelete(_Symbol,"DnwardTrendline");
创建新的下降趋势线
ObjectCreate(_Symbol,"DnwardTrendline",OBJ_TREND,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high);
由 “OBJPROP_COLOR” 确定下降趋势线颜色为蓝色
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_COLOR,Blue);
由 “OBJPROP_STYLE” 和 STYLE_SOLID 确定下降趋势线样式为实心
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_STYLE,STYLE_SOLID);
由 “OBJPROP_WIDTH” 确定下降趋势线宽度为 3
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_WIDTH,3);
由 “OBJPROP_RAY_RIGHT” 确定下降趋势线射线
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);
确认编译没有任何错误后,我们会在导航器窗口中找到智能系统,与我们之前提到的相同。 加载 EA 之后,我们就准备好基于此 EA 获得所需的动作,我们可以发现下降趋势线的绘制方式与以下内容相同:
正如我们在右上角的图表上所见,我们加载 EA,然后在价格上方绘制了下降趋势线,如此在这个级别附近就具有买入动力。
支撑位和 MQL5
支撑位是可在当前价格下方找到的价格水平或区域,我们可发现价格在它附近反弹向上,因为这些水平附近有买入动力。 故此,它们非常重要,因为我们可将它们作为买入触发点。 支撑位有多种形式,其中之一就是水平支撑位。 以下是此形式的样子:
以下是来自行情的支撑位示例:
正如我们在上一张图表中所见,我们在价格下方有一条绿色支撑线,可当作反弹向上的级别。
我们需要该程序检查价格低点,以及每次跳价是否有任何支撑线。 然后删除之前的支撑线,并在价格低点下方创建一条更新的绿色支撑线。我们可利用 MQL5 绘制和处理这条支撑线,就像下面的完整代码一样:
//+------------------------------------------------------------------+ //| Support Line System.mq5 | //+------------------------------------------------------------------+ void OnTick() { int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); double pLow[]; ArraySetAsSeries(pLow,true); CopyLow(_Symbol,_Period,0,candles,pLow); int candleLow = ArrayMinimum(pLow,0,candles); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int Data = CopyRates(_Symbol,_Period,0,candles,pArray); ObjectDelete(_Symbol,"supportLine"); ObjectCreate(_Symbol,"supportLine",OBJ_HLINE,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low); ObjectSetInteger(0,"supportLine",OBJPROP_COLOR,Green); ObjectSetInteger(0,"supportLine",OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,"supportLine",OBJPROP_WIDTH,3); ObjectSetInteger(0,"supportLine",OBJPROP_RAY,true); } //+------------------------------------------------------------------+
此代码的不同之处:
删除任何以前名为 “supportLine” 的支撑线
ObjectDelete(_Symbol,"supportLine");
创建新的支撑线,由 “OBJ_HLINE” 作为所需对象类型
ObjectCreate(_Symbol,"supportLine",OBJ_HLINE,0,pArray[candleLow].time,pArray[candleLow].low, pArray[0].time,pArray[0].low);
由 “OBJPROP_COLOR” 确定支撑线颜色
ObjectSetInteger(0,"supportLine",OBJPROP_COLOR,Green);
由 OBJPROP_STYLE 和 STYLE_SOLID 确定支撑线样式
ObjectSetInteger(0,"supportLine",OBJPROP_STYLE,STYLE_SOLID);
由 “OBJPROP_WIDTH” 确定支撑线宽度
ObjectSetInteger(0,"supportLine",OBJPROP_WIDTH,3);
由 “OBJPROP_RAY” 确定支撑线射线
ObjectSetInteger(0,"supportLine",OBJPROP_RAY,true);
编译此代码,且没有任何错误之后,我们可像之前提到的一样将其加载至图表中。 之后,我们会发现它被加载到图表上,我们可以发现它的动作,还可以找到支撑线的绘制方式与以下示例相同:
正如我们在上一张图表中所见,我们的支撑系统 EA 与右上角的相同,我们在价格下方有一条支撑线。
阻力位和 MQL5
阻力位是可在当前价格上方找到的价格水平或区域,我们可发现价格在它附近反弹向下,因为这些水平附近有卖出动力。 故此,它们非常重要,因为我们可将它们作为卖出触发点。 阻力位有多种形式,其中之一就是水平阻力位。
以下是来自行情的阻力位示例:
正如我们在上一张图表中所见,我们在价格上方有一条红色阻力线,可当作反弹向下的级别,围绕此级别有卖出动力。
我们需要程序来检查价格高点,以及在每次跳价时,是否有任何阻力线。 然后删除之前的阻力线,并在价格高点下方创建一条更新的红色阻力线。我们可利用 MQL5 绘制和处理这条阻力线,就像下面的完整代码一样:
//+------------------------------------------------------------------+ //| Resistance Line System.mq5 | //+------------------------------------------------------------------+ void OnTick() { int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); double pHigh[]; ArraySetAsSeries(pHigh,true); CopyHigh(_Symbol,_Period,0,candles,pHigh); int candleHigh = ArrayMaximum(pHigh,0,candles); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int Data = CopyRates(_Symbol,_Period,0,candles,pArray); ObjectDelete(_Symbol,"resistanceLine"); ObjectCreate(_Symbol,"resistanceLine",OBJ_HLINE,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high); ObjectSetInteger(0,"resistanceLine",OBJPROP_COLOR,Red); ObjectSetInteger(0,"resistanceLine",OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,"resistanceLine",OBJPROP_WIDTH,3); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true); } //+------------------------------------------------------------------+
此代码的不同之处:
删除任何以前名为 “resistanceLine” 的阻力线
ObjectDelete(_Symbol,"resistanceLine");
创建新的阻力线,由 “OBJ_HLINE” 作为所需对象类型
ObjectCreate(_Symbol,"resistanceLine",OBJ_HLINE,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high);
由 “OBJPROP_COLOR” 确定阻力线颜色
ObjectSetInteger(0,"resistanceLine",OBJPROP_COLOR,Red);
由 OBJPROP_STYLE 和 STYLE_SOLID 确定阻力线样式
ObjectSetInteger(0,"resistanceLine",OBJPROP_STYLE,STYLE_SOLID);
由 “OBJPROP_WIDTH” 确定阻力线宽度
ObjectSetInteger(0,"resistanceLine",OBJPROP_WIDTH,3);
由 “OBJPROP_RAY_RIGHT” 确定阻力线射线
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);
编译此代码,且没有任何错误之后,我们可像之前提到的一样将其加载至图表中。 之后,我们将发现阻力系统 EA 加载至图表上,我们可以发现其动作与以下内容相同:
正如我们在上一张图表中所见,我们的阻力系统 EA 与右上角的相同,我们在价格上方有一条阻力线。
结束语
现在,假设您已详细理解了可在我们的交易中用到的三条重要指示线。 趋势线(向上和向下趋势线)、支撑线和阻力线,我们已了解到它们是什么,以及如何运用它们。 我们还学习了如何利用 MQL5 处理它们,创建我们自己的系统来自动绘制它们的每一个。 您还可以深入开发此代码,添加发送订单,并据其执行交易;您必须在真实账户上使用它们之前对其进行测试,从而确保它们可盈利,因为本文主要目的是教学。
我希望您发现本文对您有用,并且您学会了如何使用这些提到的工具,将它们用作另一个高级系统的一部分,或单独使用它们。 如此,我希望您能从本文的主题、或任何相关主题获得有用的见解,从而得到更好的交易结果,或增强工具的实用性和可盈利性,此外还希望您尝试自己测试和编写提到的代码,从中获得实惠,并提高您的编码技能。
如果您觉得这篇文章很有用,并且您想阅读更多关于 MQL5,以及如何使用最流行的技术指标设计交易系统的文章,您可以阅读我之前的文章,从中了解更多信息,因为您可以找到诸如如何基于最流行的技术指标(如移动平均线)设计交易系统的文章, RSI、MACD、随机指标、抛物线 SAR、等等。
如果您还想了解更多有关 MQL5 的一些基础知识,以及为什么、以及如何设计您的算法交易系统,您也可以阅读我之前的文章。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/11538