![懒惰是进步的动力。半自动标记模板](https://c.mql5.com/i/articles/overlay.png)
懒惰是进步的动力。半自动标记模板
简介
任何标记都是确定图表上的极值点,绘制一些基于这些点的用户自定义图形或线。艾略特波浪的追随者需要标记某些波浪并作出结论(是第几浪)以及确定数量等。沃夫波浪的学徒需要绘制趋势线并指明目标。“蝴蝶形态”爱好者需要确定未来的蝴蝶、螃蟹和其他由伽利形式化的图形的点和位。
对于那些喜欢这种方法的人,Murrey 位是必不可少的。只要不是特殊的软件,自动计算都不允许涉及数百乃至数千个构造。另一方面,任何人都可以从条件形式化方法的结果中看到自动标记的缺点。而且并非所有软件都允许我们干预标记过程。所以,手动标记的应用和将进一步的数据处理分配给电脑拓宽了用户的能力。
半自动标记交易模板
例如,我们来考虑标记沃夫波浪。(描述取自于 Linda Raschke 的著名书籍 Street Smarts)。
比尔·威廉姆的波浪结构基于牛顿的力学第一定律:对于每一个作用力,都有一个反作用力。此举创建了具有宝贵预测能力的有限波浪。当具有良好波动时,波浪形态最为显著。
从柱形图的顶部或底部开始,可以确信在新波浪上开始计数。该计数用于买入设置。我们在顶部开始计数。(如果我们从底部开始寻找卖出点,则波浪计数会反过来)。
- 第 2 浪是顶部。
- 第 3 浪是第一次下跌的底部。
- 第 1 浪是 2 浪(顶部)前的底部。点 3 必须低于点 1。
- 第 4 浪是第 3 浪的顶部。第 4 浪点应高于第 1 浪的底部。
- 从点 1 到点 3 绘制趋势线。该线的延长线延至我们将称之为第 5 浪的预期逆转点,这是一路上升到 EPA 线(1 到 4)的进入点。
- 到达估算价格(EPA)是从点 1 到点 4 绘制的趋势线。这反映了预期的价格目标。我们将初始止损放在了新形成的逆转点 5 下方。可以快速进入盈亏平衡。
重点:在点 1、2、3 和 4 形成前,无法开始查找沃夫波浪。
记住,对于买入设置,点 3 必须低于点 1。对于卖出设置,则必须高于点 1。另外,在最好的波浪上,对于买入,点 4 必须高于点 1;对于卖出,则必须低于点 1。这确保了不存在绝对失控的市场条件。现在,研究示例并看看是否可以训练你的眼睛以开始看出沃夫波浪的设置。
下图显示了沃夫波浪开始形成时的形状。点 1、2 和 3 必须已经形成。点 2 必须是明显的摆动低点或高点。然后在点 1和点 3 之间绘制趋势线。该线会预测预期点 5 出现的位置。
形成点 5。我们从该区域开始买入反转,在紧邻下方设置止损。如果我们从点 1 至点 4 绘制一条趋势线,会给出价格预测。
点 2 是形态的起始点。我始终觉得从这一点开始计算最为简单。然后,回来找到点 1 和点 3。不要忘了点 4 必须高于点 1。我们的趋势线预测了点 5。市场在该水平找到支撑,所以我们进入了市场的做多位置,在点 5 下方设置止损。市场根据其目标交易。
根据附加的描述,我们需要在标记上添加特殊符号(数字 1 到 5,并从点 1 绘制通过点 4 和 5 的趋势线)。
手动方法创建了文本对象并指定到图表上特定的点,然后在图表上创建并显示趋势线。编程语言的特点使我们可以简化过程并从过程中省去对象创建和趋势线绘制。在这种方法中,用户仍然将标记分配到图表上的特定点,并得到已经绘好的趋势线。
需要提醒的是,将信息放到图表上有两种方式。
第一种是把创建的文本对象分配到图表上的特定点,第二种是把约束分配到图表窗口的特定点。
我们来利用这些特点创建不同的对象。我们创建“OnOff”按钮来移除已经应用的对象和已经绘制的线,并将它约束到窗口的特定点。同时,我们创建将约束到图表上特定点的对象。考虑到图表会调整比例,对象会跟图表一起偏移,我们将结合点的初始位置确定在图表的零柱右侧。我们将使用该位置来启用和禁用趋势线绘制的函数。
// Check the presence of the "OnOff" button, create it in case of absence int obj_total=ObjectsTotal(); string index; for( i=0;i<obj_total;i++) { index=ObjectName(i); string Lbl = StringSubstr (index, 0, 12); if (Lbl == "Lable_On_Off") string LblOnOff=index; } if (LblOnOff!="Lable_On_Off") OnOff(Red, 10);
其中
OnOff(Red, 10);
是创建和定位“OnOff”按钮的函数。
void OnOff (color clr_, int h) { ObjectCreate("Lable_On_Off",OBJ_LABEL,0,0,0);// Creation of the "OnOff" button ObjectSetText("Lable_On_Off",CharToStr(204) , 12, "Wingdings", clr_); ObjectSet( "Lable_On_Off", OBJPROP_CORNER, 3); // The angle of displaying on the chart ObjectSet( "Lable_On_Off", OBJPROP_XDISTANCE, 10); ObjectSet( "Lable_On_Off", OBJPROP_YDISTANCE, h); } return;
嵌入函数
CharToStr()
可以在图表中显示任何对象
"Wingdings"
只需要输入符号的代码。
通过选择和上移“OnOff”按钮,我们执行指标的启用。在移动并出现图表上第一个价格变动后,按钮被分配到另一个位置,并将颜色更改为绿色,我们将对象显示在第一个柱的右侧:函数在图表上枚举的数字。
我们根据按钮的位置管理图表上的对象。
// Check if the "OnOff" button is at its place if (ObjectGet("Lable_On_Off",OBJPROP_XDISTANCE)>70|| ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)<20)// if it is not there then { OnOff(Red, 10);// we move the "OnOff" button to its place and delete all marks, channel, trend line for ( i=0; i<point_kol; i++) ObjectDelete("Lable_"+i); ObjectDelete("TRDLine"); ObjectDelete("FIBOCanal"); return; } if (ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)>10 && ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)!=40) //If the button is moved upwards then { OnOff(Green, 40); // we fix it up there CreatePoint(); // Create points }
其中
CreatePoint();
是图表上计算点初始位置的函数。
void CreatePoint () { double shcala=(WindowPriceMax()-WindowPriceMin()); for( i = 0; i < point_kol; i++) // Create points { ObjectCreate("Lable_"+i, OBJ_ARROW, 0,Time[Bars-1],Bid); ObjectSet("Lable_"+i,OBJPROP_ARROWCODE,140+i); ObjectSet("Lable_"+i,OBJPROP_WIDTH,2); ObjectSet("Lable_"+i,OBJPROP_COLOR,Green); ObjectMove("Lable_"+i, 0,(Time[0]+Period()*720), (WindowPriceMin()+shcala/2)-shcala/12*i); } }
这里需要注意的是,如果使用该标记,只有三个点是活动的,所以我添加了一个外部变量,使选择应用到图表上的点数成为可能(3 个或 5 个)。默认值为 5,但我使用了 3 个,我自己可以目视发现中间点。
extern int point_kol=5;
我们使用斐波那契通道而非趋势线,指向预设的价格移动。它在图表上提供了扩展引导。通道提供了在斐波那契水平上的支撑和阻力线引导。在下图中,我们可以观察到趋势线和斐波那契水平相交处的目标,可以指定某些交易策略。
显示如下:
我们打开指标,向上移动按钮。
日线图。我们放置创建了趋势线和斐波那契水平的点位和指标。
总结
这种图表上的信息表达方式允许进行,例如,艾略特波浪分析。由于我们手动确定了两个极值点,可以使用较小的时间周期重新计算内部波浪,并获得可供进一步分析的结果(通过跟指定条件对比)。对此,用户可以指定重新计算的明确值(脉动或修正)。
这里我还希望 MQL4 语言的开发者添加重新计算对象窗口定位(像素)的函数,以将约束直接指向图表。问题在于,此刻所说的访问 user32.dll 库和调用其当前窗口参数的方法显示 user32.dll 不存在的信息。这意味着在典型的 Windows XP 和 MetaTrader 4 版本中没有这种功能。在实施过程中,我不得不排除从整个图表进行分析的可能性,如果不用手动移动点就好了。
指标本身(源代码):
//| 0_CTL.mq4 | //| Copyright © 2008, b2w@narod.ru | //| http://www.fibook.ru | //+------------------------------------------------------------------+ #property copyright "b2w@narod.ru" #property link "http://www.fibook.ru" #property indicator_chart_window extern int point_kol=5; string mon[]={"january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"}; int i; double coordinatsT[5], coordinatsP[5]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators string info="Marking "+ Symbol()+" by "+Day()+" "+mon[Month()-1]+" "+Year()+" г."; CreateUp (info); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //---- // Check the presence of the "OnOff" button, create it in case of absence int obj_total=ObjectsTotal(); string index; for( i=0;i<obj_total;i++) { index=ObjectName(i); string Lbl = StringSubstr (index, 0, 12); if (Lbl == "Lable_On_Off") string LblOnOff=index; } if (LblOnOff!="Lable_On_Off") OnOff(Red, 10); // Check if the "OnOff" button is at its place if (ObjectGet("Lable_On_Off",OBJPROP_XDISTANCE)>70|| ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)<20)// if it is not there then { OnOff(Red, 10);// we move the "OnOff" button to its place and delete all marks, channel, trend line for ( i=0; i<point_kol; i++) ObjectDelete("Lable_"+i); ObjectDelete("TRDLine"); ObjectDelete("FIBOCanal"); return; } if (ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)>10 && ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)!=40) //If the button is moved upwards then { OnOff(Green, 40); // Fix it up there CreatePoint(); // Create points } for (i=0; i<point_kol; i++) { coordinatsT[i]=ObjectGet("Lable_"+i,OBJPROP_TIME1); // Read the coordinates coordinatsP[i]=ObjectGet("Lable_"+i,OBJPROP_PRICE1); } // if all points are carried to the chart then we draw the additional objects if ((coordinatsT[0]<Time[0])&& (coordinatsT[1]<Time[0])&& (coordinatsT[2]<Time[0])&& (coordinatsT[3]<Time[0])&& (coordinatsT[4]<Time[0])) { ObjectCreate("TRDLine", OBJ_TREND, 0,0,0); ObjectCreate("FIBOCanal", OBJ_FIBOCHANNEL, 0,0,0); ObjectMove ("TRDLine", 0,coordinatsT[0],coordinatsP[0]); ObjectMove ("TRDLine", 1,coordinatsT[point_kol-2],coordinatsP[point_kol-2]); ObjectMove ("FIBOCanal", 0,coordinatsT[0],coordinatsP[0]); ObjectMove ("FIBOCanal", 2,coordinatsT[point_kol-2],coordinatsP[point_kol-2]); ObjectMove ("FIBOCanal", 1,coordinatsT[point_kol-1],coordinatsP[point_kol-1]); } return(0); } //+------------------------------------------------------------------+ void OnOff (color clr_, int h) { ObjectCreate("Lable_On_Off",OBJ_LABEL,0,0,0);// Creation of the "OnOff" button ObjectSetText("Lable_On_Off",CharToStr(204) , 12, "Wingdings", clr_); ObjectSet( "Lable_On_Off", OBJPROP_CORNER, 3); // The angle of displaying on the chart ObjectSet( "Lable_On_Off", OBJPROP_XDISTANCE, 10); ObjectSet( "Lable_On_Off", OBJPROP_YDISTANCE, h); } return; void CreatePoint () { double shcala=(WindowPriceMax()-WindowPriceMin()); for( i = 0; i < point_kol; i++) // Create points { ObjectCreate("Lable_"+i, OBJ_ARROW, 0,Time[Bars-1],Bid); ObjectSet("Lable_"+i,OBJPROP_ARROWCODE,140+i); ObjectSet("Lable_"+i,OBJPROP_WIDTH,2); ObjectSet("Lable_"+i,OBJPROP_COLOR,Green); ObjectMove("Lable_"+i, 0,(Time[0]+Period()*720), (WindowPriceMin()+shcala/2)-shcala/12*i); } } void CreateUp(string info) { ObjectCreate("TextAlerts", OBJ_LABEL, 0, 0, 0); ObjectSetText("TextAlerts",info , 16, "Times New Roman", Green); ObjectSet("TextAlerts", OBJPROP_CORNER, 0); ObjectSet("TextAlerts", OBJPROP_XDISTANCE, 20); ObjectSet("TextAlerts", OBJPROP_YDISTANCE, 10); }
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/1556
![面向初学者的 MQL4 语言。自定义指标(第 2 部分)](https://c.mql5.com/2/15/536_27.gif)
![Taichi 指标 - 一目平衡表指标值形式化的简单理念](https://c.mql5.com/2/15/509_25.gif)