KeyFinder 2.0 - MetaTrader 5 脚本




该脚本查找 DeMark 枢轴点,将它们显示在图表上并指示它们的尺寸。
该脚本的功能实际上与钥匙查找器。除了从图表中删除脚本和所有关联对象的按钮之外,它没有任何视觉差异。

图 1. 应用 KeyFinder 2.0 脚本后的 RTS 指数期货图表
尽管脚本在视觉上和功能上都没有改变,但它的代码已经被显着修改了。
已为脚本创建了 CKeyFinder 类。

图 2. CKeyFinder 类
下面提供了该类的代码。由于我尝试尽可能详细地发表评论,因此您不应该遇到任何问题。
//+------------------------------------------------------------------+ //| KeyFinder.mqh | //| 特罗菲莫夫·帕维尔 | //| trofimovpp@mail.ru | //+------------------------------------------------------------------+ #财产版权 《特罗菲莫夫·帕维尔》 #财产关联 “trofimovpp@mail.ru” //+------------------------------------------------------------------+ //| KeyFinder 2.0 类 | //+------------------------------------------------------------------+ 班级密钥查找器 {私人的: // 类变量 整数 最小尺寸; //点的最小维数 整数 最大酒吧; //要处理的柱数 受保护的: // 供内部使用的类方法 // 确定上点尺寸 整数 获取高维(Mql费率&tmp费率[],整数tmp_i,整数tmp_iCod); // 确定较低点的尺寸 整数 获取低维(Mql费率&tmp费率[],整数tmp_i,整数tmp_iCod);民众: // 类构造函数 CKeyFinder(); // 类析构函数 〜CKeyFinder(); // 获取维度的属性方法 整数 获取最小尺寸(); // 设置维度的属性方法 空白 设置最小尺寸(整数临时值); // 用于获取要处理的柱数的属性方法 整数 获取最大条数(); // 设置要处理的柱数的属性方法 空白 设置最大条数(整数临时值); // 寻找上枢轴点的方法 空白 查找关键点(整数临时iCod,Mql费率&temp_rates[]); // 寻找下枢轴点的方法 空白 查找低关键点(整数临时iCod,Mql费率&temp_rates[]); // 从脚本对象中清除图表。 整数 清洁图表(); };//+------------------------------------------------------------------+ //| 确定上点尺寸 | //+------------------------------------------------------------------+ 整数CKeyFinder::getHighDimension(Mql费率&tmp费率[],整数tmp_i,整数tmp_iCod)// 该方法接收 MqlRates 类型数据的数组、数组中已处理柱的编号以及数组的最大索引 { 整数k=1; 尽管((tmpRates[tmp_i].high>tmpRates[tmp_i+k].high) && (tmpRates[tmp_i].high>tmpRates[tmp_i-k].high) && ((tmp_i+k)<(tmp_iCod)) && ((tmp_i-k)>0)) k++; 如果(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0)) k=-1; 返回(k); };//+------------------------------------------------------------------+ //| 确定下点尺寸 | //+------------------------------------------------------------------+ 整数CKeyFinder::getLowDimension(Mql费率&tmp费率[],整数tmp_i,整数tmp_iCod)// 该方法接收 MqlRates 类型数据的数组、数组中已处理柱的编号以及数组的最大索引 { 整数k=1; 尽管((tmpRates[tmp_i].low0)) k++; 如果(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0)) k=-1; 返回(k); };//+------------------------------------------------------------------+ //|方法 GetMinDimension | //+------------------------------------------------------------------+ 整数CKeyFinder::GetMinDimension(){返回(最小尺寸);};//+------------------------------------------------------------------+ //|方法 SetMinDimension | //+------------------------------------------------------------------+ 空白CKeyFinder::SetMinDimension(整数临时值) { 如果(临时值>1) MinDimension=temp_Val; 别的 { 消息框(“设定的维度太低了。”+“\n”+“将使用默认尺寸 5”,“警告!”,MB_OK+MB_ICON警告); 最小尺寸=5; }; };//+------------------------------------------------------------------+ //|方法 GetMaxBars | //+------------------------------------------------------------------+ 整数CKeyFinder::GetMaxBars() {返回(最大条数);};//+------------------------------------------------------------------+ //| Method SetMaxBars | //+------------------------------------------------------------------+ 空白CKeyFinder::SetMaxBars(整数临时值) {// 检查设定数量的柱线的历史记录的可用性 整数SMaxBars=酒吧(象征(),0); 如果(SMaxBars // 设置最大可用柱数 消息框(“MaxBars 参数太高。”+“\n”+“仅有的 ”+整数转字符串(temp_Val)+“将使用条形图进行计算。”,“警告!”,MB_OK+MB_ICON警告); };// 检查柱的数量是否太少 如果(temp_Val<(2*最小尺寸)) { 消息框(“设定的栏数太少了。”+“\n”+“将使用默认数量 300”,“警告!”,MB_OK+MB_ICON警告); 临时值=300; }; MaxBars=temp_Val; };//+------------------------------------------------------------------+ //|方法 FindKeyPoints - 查找上关键点 | //+------------------------------------------------------------------+ 空白CKeyFinder::FindUpKeyPoints(整数临时iCod,Mql费率&temp_rates[])// 该方法接收最大数组元素和 MqlRates 数组的索引 { 整数高清=1; //初始化点尺寸 为了(整数i=temp_iCod-MinDimension; i>(最小尺寸-1);我 - )// 从最后一个柱 - MinDimension 到零柱 + MinDimension 的循环 { HD=getHighDimension(temp_rates,i,temp_iCod);//获取点的维度 如果((HD>=最小尺寸) || (HD==-1)) {//如果满足MinDimension条件则创建标记 细绳观测名称=“KF_标签”+整数转字符串(我); 如果(高清!=-1) { 对象创建(0,观测名称,对象文本,0,temp_rates[i].time,temp_rates[i].high); 对象集整数(0,观测名称,OBJPROP_Anchor,0,ANCHOR_LOWER); 对象集字符串(0,观测名称,OBJPROP_TEXT,0,整数转字符串(高清)); 对象集整数(0,观测名称,OBJPROP_COLOR,红细胞); } 别的 {//如果无法确定尺寸,则使用球标 对象创建(0,观测名称,OBJ_箭头,0,temp_rates[i].time,temp_rates[i].high); 对象集整数(0,观测名称,OBJPROP_ARROWCODE,0,159); 对象集整数(0,观测名称,OBJPROP_Anchor,0,锚点底部); 对象集整数(0,观测名称,OBJPROP_COLOR,红细胞); }; }; }; };//+------------------------------------------------------------------+ //|方法 FindLowKeyPoints - 查找较低的关键点 | //+------------------------------------------------------------------+ 空白CKeyFinder::FindLowKeyPoints(整数临时iCod,Mql费率&temp_rates[])// 该方法接收最大数组元素和 MqlRates 数组的索引 { 整数LD=1;//初始化点尺寸 布尔值我创造; 为了(整数i=temp_iCod-MinDimension; i>(最小尺寸-1);我 - )// 从最后一个柱 - MinDimension 到零柱 + MinDimension 的循环 { LD=getLowDimension(temp_rates,i,temp_iCod); 如果((LD>=最小尺寸) || (LD==-1)) { 细绳观测名称=“KF_标签”+整数转字符串(一)+“_1”;//避开最低点和最高点的柱线可能是关键点 如果(LD!=-1) { 我创建=对象创建(0,观测名称,对象文本,0,temp_rates[i].time,temp_rates[i].low); 如果(i创建) { 对象集整数(0,观测名称,OBJPROP_Anchor,0,锚点_上部); 对象集字符串(0,观测名称,OBJPROP_TEXT,0,整数转字符串(LD)); 对象集整数(0,观测名称,OBJPROP_COLOR,清绿); } 别的 评论(“无法创建对象”); } 别的 { 我创建=对象创建(0,观测名称,OBJ_箭头,0,temp_rates[i].time,temp_rates[i].low); 如果(i创建) { 对象集整数(0,观测名称,OBJPROP_ARROWCODE,0,159); 对象集整数(0,观测名称,OBJPROP_Anchor,0,锚点顶部); 对象集整数(0,观测名称,OBJPROP_COLOR,清绿); } 别的 评论(“无法创建对象”); }; }; }; };//+------------------------------------------------------------------+ //|方法 CleanChart - 从对象中清除图表 | //+------------------------------------------------------------------+ 整数CKeyFinder::CleanChart(空白) { 细绳标签=“KF_标签”; 整数对象总数=对象总数(0,0,-1),n=0; 为了(整数obj=obj_total-1;对象>=0;对象--)//清除脚本通过名称掩码创建的对象 { 细绳对象名=对象名(0,对象,0,-1); 如果(字符串查找(对象名称,标签)>=0)对象删除(0,对象名); n++; } 返回(n); }//+------------------------------------------------------------------+ //|类构造函数 | //+------------------------------------------------------------------+CKeyFinder::CKeyFinder(){};//+------------------------------------------------------------------+ //|类析构函数 | //+------------------------------------------------------------------+CKeyFinder::~CKeyFinder(){};//+--------------------------------------------------------------------------------+
由于大部分代码已经移至类中,所以主脚本代码非常紧凑。
//+------------------------------------------------------------------+ //| KeyFinder2.mq5 | //| 特罗菲莫夫·帕维尔 | //| trofimovpp@mail.ru | //+------------------------------------------------------------------+ #财产版权 《特罗菲莫夫·帕维尔》 #财产关联 “trofimovpp@mail.ru” #财产版本 “2.00” #财产描述 “警告!该算法使用循环进行计算!” #财产描述 “建议设置不要超过1000个来处理!” #财产脚本显示输入 //--- 输入参数 输入 整数 最小尺寸=5;//点的最小维数 输入 整数 最大条数=300; //要处理的柱数 #包括 “KeyFinder.mqh” #包括//+------------------------------------------------------------------+ //|脚本变量 | //+------------------------------------------------------------------+CKeyFinder m_keyfinder; //声明СKeyFinder类变量CChartObjectButton m_button_close; //声明CChartObjectButton类变量 //+------------------------------------------------------------------+ //|脚本程序启动函数 | //+------------------------------------------------------------------+ 空白 启动时() {//-初始化变量 Mql费率 rates_array[]; 细绳com=“\n\n\n”; 整数iCod=复制率(象征(),时期(),0,MaxBars,rates_array);// 我们能够复制的 MqlRates 数组中的元素数量 整数西=10;//按钮位置 如果(图表获取整数(0,CHART_SHOW_OHLC)) 西+=16;//-设置必要的参数 m_keyfinder.SetMaxBars(MaxBars); m_keyfinder.SetMinDimension(MinDimesion); m_keyfinder.CleanChart();//在第二次使用时清除图表中的对象 iCod=iCod-1;// rates_array[] 中最大元素的索引 通讯+=“工作中……请稍等!”;//-创建按钮并设置其属性 m_button_close.Create(0,“关闭按钮”,0,10,sy,100,20); m_button_close.描述(“关闭脚本”); m_button_close.Color(蓝色); m_button_close.FontSize(8); 评论(通讯);//-使用 CKeyFinder 类方法处理柱形图 如果(iCod>0) { m_keyfinder.FindUpKeyPoints(iCod,rates_array);//搜索上层关键点 通讯+=“\n上面的点已被处理。\n”; 评论(通讯); m_keyfinder.FindLowKeyPoints(iCod,rates_array);//搜索较低的关键点 评论(“\n\n\n处理完成”); } 别的 评论(“\n\n\n没有要处理的栏!!!”); m_button_close.State(错误的);//-循环脚本直到按下按钮 尽管(!(m_button_close.State())) { //--- 重绘图表 图表重绘(); 睡觉(250); };//-按下按钮清除图表 m_keyfinder.CleanChart(); 评论(””); }
最后,我提供了一些有用的链接和解释:
我期待阅读您的评论、反馈和建议。祝交易顺利!
附件下载
📎 keyfinder2.mq5 (6.22 KB)
📎 keyfinder.mqh (19.26 KB)
Source: MQL5 #12439
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录
