文章 "使用MQL4和MQL5绘制基于分形指标的趋势线"

 

新文章 使用MQL4和MQL5绘制基于分形指标的趋势线已发布:

本文介绍一种使用MQL4和MQL5语言,自动绘制基于分形指标趋势线的方法。本文以比较的视角,提供两种语言的解决方案。使用最近的两个分形来绘制趋势线。

近,我一直在考虑如何使用趋势线。如何选择绘制趋势线的点以及绘制的精确度一直是个问题。我决定使用分形来作为基础。

我的 主要工作是分析市场,也能花些时间来做交易。你不能仅仅在长时间框架下绘制趋势线,应能够通过极点精确到15分钟图表上。原因是长时间框架上的分形时间并 不总是等于M15上的极值点的时间。简而言之,自动化在此能够派上用场。我开始用MQL5编写代码然后移植到MQL4上,因为我需要程序运行于 MetaTrader 4。

在本文中,我将以MQL4和MQL5两种语言来呈现问题的解决方案。虽然在本文中对两种语言进行了比较,但并不是为了对比MQL4和MQL5的执行效率。 当然我也意识到可能有比我更好的解决方法。本文对使用MQL4或MQL5编写脚本的初学者有帮助,尤其是那些计划使用分形和趋势线的朋友。

. 确定分形的价格和时间

要绘制趋势线,我们需要确定分形的时间和价格。当然,在MQL4中我们可以简单的使用High[]和Low[]预定义时间序列变量,以及iTime()函数,然而我们也需要获取更为精确的坐标来确保绘制趋势线的准确性。

图1-2显示了H4和M15时间框架下极点时间的差别。

图1. H4图表上的极点时间。

图1. H4图表上的极点时间。

图2. M15图表上的极点时间

图2. M15图表上的极点时间

作者:Almat Kaldybay

[删除]  
下午。批评。一天并不总是固定的蜡烛数。就您的情况而言 - 检查 M15 的 96 根蜡烛的数据并不总是正确的。有时您可以使用另一天的数据。
 
Tapochun:
下午。批评。一天并不总是固定的蜡烛数。就您的情况而言 - 检查 M15 的 96 根蜡烛的数据并不总是正确的。有时您可能会进入另一天的数据。
谢谢您的意见,我自己还没有遇到过这种情况,因为我已经放弃了每日 TL,转而进行日内交易(我看的是 4 小时、小时和 M15)。但总的来说,我得仔细看看这种情况。
[删除]  
Almat Kaldybay:
感谢您的评论,我自己确实没有遇到过这种情况,因为我已经放弃了每日 TL,转而进行日内交易(我关注 4 小时、1 小时和 m15)。但总的来说,我们必须仔细观察一下情况。
任何 TF 都是如此,不一定是 M15。问题是,如果您要寻找一天内的顶部/底部,例如前一天,您不应该依赖于固定的蜡烛数,最好是依赖于时间:从前一天的开盘(在这种情况下,从开盘到当天的开盘(第一根蜡烛,其时间可能不是 00.00)。
 
Tapochun:
这适用于任何 TF,不一定是 M15。问题是,如果您要寻找一天内的顶部/底部,例如前一天,您就不应该依赖于固定的蜡烛数,最好是依赖于时间:从前一天的开盘(在这种情况下,从开盘到当天的开盘(第一根蜡烛,其时间可能不是 00.00)。

刚才我在 mql4 上编写一个 EA,想起了您的批评。虽然在实践中没有遇到过这种情况,但我还是决定将其排除在外。解决方案如下:

//1.2 确定极值之后的横杠
int UpperFractal_1_base_next=UpperFractal_1_base-1;
int UpperFractal_2_base_next=UpperFractal_2_base-1;
int LowerFractal_1_base_next=LowerFractal_1_base-1;
int LowerFractal_2_base_next=LowerFractal_2_base-1;
//1.3 确定分形形成的时间
datetime UpFractalTime_1_base=iTime(NULL,base_tf,UpperFractal_1_base);
datetime UpFractalTime_2_base=iTime(NULL,base_tf,UpperFractal_2_base);
datetime LowFractalTime_1_base=iTime(NULL,base_tf,LowerFractal_1_base);
datetime LowFractalTime_2_base=iTime(NULL,base_tf,LowerFractal_2_base);
//1.4 确定极值之后的横杠时间
datetime UpFractalTime_1_base_next=iTime(NULL,base_tf,UpperFractal_1_base_next);
datetime UpFractalTime_2_base_next=iTime(NULL,base_tf,UpperFractal_2_base_next);
datetime LowFractalTime_1_base_next=iTime(NULL,base_tf,LowerFractal_1_base_next);
datetime LowFractalTime_2_base_next=iTime(NULL,base_tf,LowerFractal_2_base_next);
//1.5 在 m15 上确定分形柱打开时间的柱形指数
int UpperFractal_1_m15_base=iBarShift(NULL, 15, UpFractalTime_1_base,true);
int UpperFractal_2_m15_base=iBarShift(NULL, 15, UpFractalTime_2_base,true);
int LowerFractal_1_m15_base=iBarShift(NULL, 15, LowFractalTime_1_base,true);
int LowerFractal_2_m15_base=iBarShift(NULL, 15, LowFractalTime_2_base,true);
//1.6 为极值之后的条形图确定 m15 上的条形图指数
int UpperFractal_1_m15_base_next=iBarShift(NULL, 15, UpFractalTime_1_base_next,true);
int UpperFractal_2_m15_base_next=iBarShift(NULL, 15, UpFractalTime_2_base_next,true);
int LowerFractal_1_m15_base_next=iBarShift(NULL, 15, LowFractalTime_1_base_next,true);
int LowerFractal_2_m15_base_next=iBarShift(NULL, 15, LowFractalTime_2_base_next,true);
//1.7 计算 m15 上的柱状分形与下一个柱状分形之间的柱状数
int UpperFractal_1_m15_NumBars_base=(UpperFractal_1_m15_base-UpperFractal_1_m15_base_next);
int UpperFractal_2_m15_NumBars_base=(UpperFractal_2_m15_base-UpperFractal_2_m15_base_next);
int LowerFractal_1_m15_NumBars_base=(LowerFractal_1_m15_base-LowerFractal_1_m15_base_next);
int LowerFractal_2_m15_NumBars_base=(LowerFractal_2_m15_base-LowerFractal_2_m15_base_next);
// --- 第 2 阶段 --- 完善极值
//2.1 第一个最小分形
int Bar_1_Lowest_m15_base=iLowest(NULL,PERIOD_M15,MODE_LOW,LowerFractal_1_m15_NumBars_base,LowerFractal_1_m15_base_next);
datetime Time_1_Lowest_m15_base=iTime(NULL,PERIOD_M15,Bar_1_Lowest_m15_base);
double Price_1_Lowest_m15_base=iLow(NULL,PERIOD_M15,Bar_1_Lowest_m15_base);
//2.2 对于第二小分形
int Bar_2_Lowest_m15_base=iLowest(NULL,PERIOD_M15,MODE_LOW,LowerFractal_2_m15_NumBars_base,LowerFractal_2_m15_base_next);
datetime Time_2_Lowest_m15_base=iTime(NULL,PERIOD_M15,Bar_2_Lowest_m15_base);
double Price_2_Lowest_m15_base=iLow(NULL,PERIOD_M15,Bar_2_Lowest_m15_base);
//2.3 第一大分形
int Bar_1_Highest_m15_base=iHighest(NULL,PERIOD_M15,MODE_HIGH,UpperFractal_1_m15_NumBars_base,UpperFractal_1_m15_base_next);
datetime Time_1_Highest_m15_base=iTime(NULL,PERIOD_M15,Bar_1_Highest_m15_base);
double Price_1_Highest_m15_base=iHigh(NULL,PERIOD_M15,Bar_1_Highest_m15_base);
//2.4 为第二大分形
int Bar_2_Highest_m15_base=iHighest(NULL,PERIOD_M15,MODE_HIGH,UpperFractal_2_m15_NumBars_base,UpperFractal_2_m15_base_next);
datetime Time_2_Highest_m15_base=iTime(NULL,PERIOD_M15,Bar_2_Highest_m15_base);
double Price_2_Highest_m15_base=iHigh(NULL,PERIOD_M15,Bar_2_Highest_m15_base);

	          
[删除]  
Almat Kaldybay:

虽然我在实践中没有遇到过这种情况,但我还是决定将其排除在外。

例如,今天打开货币对 GBPUSD/EURUSD M5,第一根蜡烛在 00:05 打开。如果我们将 288 根蜡烛线与 M15 进行类比,我们将获得另一天的数据。

诚然,这是 MT5...在 MT4(MetaQuotes-Demo 服务器)上 - 同样,在另一家经纪商上,从 00:00 开始,所以...一切都是个别的,您仍然需要检查。

 
MetaQuotes Software Corp.:

使用 MQL4 和 MQL5 根据分形绘制趋势线的 新文章已发布:

作者: Almat KaldybayAlmat Kaldybay

你好、

我没有得到如上图所示的趋势线。
有什么特殊设置吗?

 
Hairi Baba:

你好、

我没有看到如上图所示的趋势线。
有什么特殊设置吗?

您好,也许您没有 M15 的历史数据。
 

嗨,阿尔马特、

我没有在图表中看到趋势线,但我收到了连续的移动警报。如果我错过了什么,请帮助我。

谢谢,
Prakash.R

 
prakki79:

你好,阿尔马特、

我没有在图表中看到趋势线,但我收到了连续的移动警报。如果我错过了什么,请帮助我。

谢谢,
Prakash.R

您好、

1.您需要在元编辑器中编译 mq4 文件;

2. 我认为图表中有趋势线,但由于图表的比例问题,您看不到它们

 
您好,请告诉我如何在 mt4 中安装智能交易系统。我下载了trendlines.mq4 文件, 将其编译后连同源代码一起发送到 mql4/Indicators 文件夹,重新加载了终端,尝试将指标附加到图表上,但没有任何反应。我做错了什么?