欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

KeyFinder 2.0 - MetaTrader 5 脚本

author emer | 599 人阅读 | 0 人评论 |

KeyFinder 2.0 - script for MetaTrader 5

KeyFinder 2.0 - script for MetaTrader 5

KeyFinder 2.0 - script for MetaTrader 5

KeyFinder 2.0 - script for MetaTrader 5

该脚本查找 DeMark 枢轴点,将它们显示在图表上并指示它们的尺寸。

该脚本的功能实际上与钥匙查找器。除了从图表中删除脚本和所有关联对象的按钮之外,它没有任何视觉差异。

KeyFinder 2.0 - script for MetaTrader 5

图 1. 应用 KeyFinder 2.0 脚本后的 RTS 指数期货图表

尽管脚本在视觉上和功能上都没有改变,但它的代码已经被显着修改了。

已为脚本创建了 CKeyFinder 类。

KeyFinder 2.0 - script for MetaTrader 5

图 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小时后评论,即可解锁附件下载
立即登录