我需要提示的是,这些形态与其它技术工具一起配合使用,对于获取有意义的信号非常重要。 故此,您需要理解利用 MQL5 检测上述形态的主要思想,使之成为您的交易系统的一部分,从而简化您的交易,并获得良好的结果。
免责声明:所有信息“按原样”提供,仅用于教学目的,并非预备、且不建议用于交易目的。 该信息不保证任何类型的结果。 如果您选择在自己的任何交易账户上使用这些素材,您将自行承担风险,且您将是唯一的责任人。
添加图片注释,不超过 140 字(可选)
单烛形态
在这一部分中,赫兹量化将看到两个常在图表上出现的单烛形态示例。 您可以在任何时间帧内看到它们,而当它们出现在与价格行为相对应的位置时,它会尤为重要。 我们将看到十字星(Doji)和锤子(Hammer)形态。
十字星(Doji)形态:
它在烛条形态中非常受欢迎,它是开盘价和收盘价几乎相同的蜡烛,赫兹量化能看到非常短小的蜡烛实体、或图表上的一条线,实体的顶底价格相同,甚至没有阴影。 下图就是这样的蜡烛:
添加图片注释,不超过 140 字(可选)
这根十字星蜡烛表明买卖双方之间存在平衡,在价格出现的时间段内,没有人能控制市场将价格推高或拉低。 如果它在调整之前或趋势结束时出现在图表上的适当位置,则可能预示着市场的逆转或调整,如果它出现在更大的时间帧内,则它将更加重要。 蜡烛有很多类型和形成方式,每一个都有很多信息可用于我们的交易,如蜻蜓和长腿。
赫兹量化需要做的是通过定义最后一根蜡烛的价格和时间来通知计算机检测十字星形态,我们需要程序在这个定义的时间检查和比较这些值,并判定每一个的位置。 如果开盘价等于收盘价,赫兹量化需要程序返回一个信号,表明这是十字星蜡烛形态。
现在,赫兹量化需要创建一个可以检测此形态的程序,以下是执行此操作的方法步骤:
我们将针对这个十字星创建一个函数(getDoji),赫兹量化将在每次跳价 OnTick() 中调用它来检查搜索此形态
void OnTick() { getDoji(); }
创建(getDoji) 函数,并返回整数型变量
int getDoji()
定义该函数需定义最后一根蜡烛的时间、开盘价、最高价、最低价和收盘价
调用 iTime 函数返回蜡烛开盘时间,调用 iOpen 返回蜡烛开盘价,调用 iHigh 返回最高价,调用 iLow 返回最低价,以及调用 iClose 返回蜡烛收盘价。 所有这些参数都相同:
-
symbol: 定义品种名称,我们将采用(_Symbol)对应当前交易品种。
-
timeframe: 定义图表的周期或时间帧,我们将采用(PERIOD_CURRENT)对应当前时间帧。
-
shift: 定义返回值的柱线索引,我们将采用(1)对应最后一根蜡烛。
datetime time=iTime(_Symbol,PERIOD_CURRENT,1); double open=iOpen(_Symbol,PERIOD_CURRENT,1); double high=iHigh(_Symbol,PERIOD_CURRENT,1); double low=iLow(_Symbol,PERIOD_CURRENT,1); double close=iClose(_Symbol,PERIOD_CURRENT,1);
使用 if 语句设置我们需要检测的十字星的条件
if(open==close)
如果此条件为 true,赫兹量化需要程序基于 createObj 函数创建一个对象,我们将依据时间、价格、箭头代码、颜色和我们需要的文本等参数创建该函数。 然后在函数终止时返回 1。
if(open==close) { createObj(time,low,217, clrBlack,"Doji"); { return 1; } }
我们将返回 0 来终止 getDoji 函数
return 0;
以 void 数据类型创建(createObj)函数,其中包含时间、价格、箭头代码、颜色和文本的参数
void createObj(datetime time, double price, int arrawCode, color clr, string txt)
创建字符串变量(objName),并分配(“ ”)值
string objName=" ";
调用(StringConcatenate)函数将字符串合并为一,并将它们分配给(objName)变量,该函数把所传递参数的字符串合并,并返回所形成字符串的总长。 其参数是:
-
string_var: 定义连接后将形成的字符串,我们将采用(objName)。
-
argument1: 定义任何简单类型的参数,我们将采用 “Signal at ” 文本。
-
argument2: 定义检测到的蜡烛时间,我们将采用预设变量的时间。
-
argument3: 我们将文本设置为 " at "。
-
argument4: 我们将调用 DoubleToString 将双精度类型转换为字符串类型,并取四舍五入价格来设置文本。
-
argument5: 我们将文本设置为 " ("。
-
argument6: 我们将为所需的预定整数型变量(箭头代码)分配一个数值。 可以通过在 mql5 参考中搜索 Wingdings 来找到此代码。
-
argument7: 我们将文本设置为 ")"。
StringConcatenate(objName, "Signal at ",time, " at ",DoubleToString(price,_Digits)," (",arrawCode,")");
我们将使用 if 语句和(ObjectCreate)函数作为表达式来设置要评估的条件,(ObjectCreate)函数采用预定义的名称(objName)为我们创建一个对象,其参数为:
-
chart_id: 为了识别图表,我们将采用 0 对应当前图表。
-
name: 定义对象名称,我们将采用预定义的名称(objName)。
-
type: 定义对象类型,我们将采用(OBJ_ARROW)。
-
nwin: 定义图表子窗口的编号,我们将采用(0) 对应主图表窗口。
-
time1: 定义锚点的时间,我们将采用预定义的(time)变量。
-
price1: 定义锚点的价格,我们将采用预定义的(price)变量。
if(ObjectCreate(0,objName,OBJ_ARROW,0,time,price))
如若创建对象实现此条件后,我们需要通过调用设置对象属性值的(ObjectSetInteger)函数确定箭头代码和颜色,并设置对象属性值。 其参数是:
-
chart_id: 为了识别图表,我们将采用 0 对应当前图表。
-
name: 定义对象名称,我们将采用(objName)。
-
prop_id: 定义对象的属性,我们将采用 ENUM_OBJECT_PROPERTY_INTEGER 中之一,即箭头代码的(OBJPROP_ARROWCODE)和颜色的(OBJPROP_COLOR)。
-
prop_value: 定义属性值,我们将采用(arrawCode)对应箭头代码,并采用预定义变量(clr)对应颜色。
ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrawCode); ObjectSetInteger(0,objName,OBJPROP_COLOR,clr);
之后,赫兹量化需要定义所需的蜡烛文本,即创建一个字符串变量(candleName),并赋值预定义的(objName)和(txt)变量
string candleName=objName+txt;
利用 if 语句创建文本并编辑对象,其中(ObjectCreate)函数作为表达式,操作符是调用(ObjectSetString)设置对象属性的字符串值,以及调用(ObjectSetInteger)设置文本对象的颜色。
ObjectSetString(0,candleName,OBJPROP_TEXT," "+txt); ObjectSetInteger(0,candleName,OBJPROP_COLOR,clr);
现在,赫兹量化可以看到该智能系统的完整代码,如下所示:
//+------------------------------------------------------------------+ //| Doji pattern detector.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ void OnTick() { getDoji(); } int getDoji() { datetime time=iTime(_Symbol,PERIOD_CURRENT,1); double open=iOpen(_Symbol,PERIOD_CURRENT,1); double high=iHigh(_Symbol,PERIOD_CURRENT,1); double low=iLow(_Symbol,PERIOD_CURRENT,1); double close=iClose(_Symbol,PERIOD_CURRENT,1); //Doji if(open==close) { createObj(time,low,217, clrBlack,"Doji"); { return 1; } } return 0; } void createObj(datetime time, double price, int arrawCode, color clr, string txt) { string objName=" "; StringConcatenate(objName, "Signal at ",time, " at ",DoubleToString(price,_Digits)," (",arrawCode,")"); if(ObjectCreate(0,objName,OBJ_ARROW,0,time,price)) { ObjectSetInteger(0,objName,OBJPROP_ARROWCODE,arrawCode); ObjectSetInteger(0,objName,OBJPROP_COLOR,clr); } string candleName=objName+txt; if(ObjectCreate(0,candleName,OBJ_TEXT,0,time,price)) { ObjectSetString(0,candleName,OBJPROP_TEXT," "+txt); ObjectSetInteger(0,candleName,OBJPROP_COLOR,clr); } }
编译此代码后,若没有错误,赫兹量化可以在导航器窗口中找到它。 通过拖动它来执行,我们可以得到它检测十字星模式的信号,以下是测试的示例:
添加图片注释,不超过 140 字(可选)
正如我们在上面一张图表中看到的,我们在蜡烛下方有一个黑色箭头对象和十字星文本来定义蜡烛形态。
锤子(Hammer)形态:
锤子形态是一种非常流行的烛条形态,我们可在许多时间帧的图表上看到它。 它的名字指的是它的形状,因为它有一个长长的阴影和一段小的实体,根据小实体的位置有两种类型的锤子形态,锤子和倒锤。 如果它有一个很长的下影线,蜡烛的实体在上面,它是一个锤子,基于开盘价和收盘价,它即可是一个看涨亦或看跌的蜡烛,下图是这个锤子形态的例子:
-
看涨锤子
添加图片注释,不超过 140 字(可选)
这表明卖方试图压低价格,但买方控制市场,且收盘价高于开盘价,这意味着买方强势。
-
看跌锤子
添加图片注释,不超过 140 字(可选)
这表明卖方试图压低价格,但买方把收盘价控制在开盘价附近,这意味着买方仍在游戏中。
如果蜡烛有一个长上影线,它的实体在下面,它是一个倒锤形态,根据开盘价和收盘价的位置,它即也可看涨亦或看跌。 下图是这种倒锤的示例。
-
看涨倒锤
添加图片注释,不超过 140 字(可选)
这表明买方试图推高价格,但卖方把收盘价控制在开盘价附近且以低点收盘,这意味着尽管买方的实力很强,但卖方仍在游戏中。
-
看跌倒锤
添加图片注释,不超过 140 字(可选)
它表明买方试图推低价格,但卖方控制市场,且收盘价低于开盘价,这意味着卖方的强势。
这种形态也与所有烛条形态相同,当它与其它技术工具结合使用时,将更加有意义。
现在,赫兹量化需要创建一个可检测这种形态的程序,如此我们就能让程序找出蜡烛价格、时间和蜡烛大小,并与蜡烛的实体和阴影进行比较,我们需要程序在每次跳价中不断检查和比较它们,来判定它们的位置。 当程序检测到锤子或倒锤子之一(看涨或看跌)时,我们需要程序返回图表上的一个对象,其类型名称和箭头颜色为绿色或红色,并且基于蜡烛的颜色(看涨或看跌),将其绘制在蜡烛下方或上方。