脚本: KeyFinder 2.0

 

KeyFinder 2.0:

这款脚本搜索 DeMark 的轴点, 并在图表上显示它们, 同时指示它们的尺度。

图例. 1. 加载 KeyFinder 2.0 脚本之后的 RTS 指数期货合约图表

作者: Pavel Trofimov

 

删除脚本的按钮(并不总是有效)仍在屏幕上(并不总是)。MT4 终端,Alpari,图片 765


 
我可以模拟您的情况。这种行为是在 KeyFinder 2.0 之后使用另一个脚本的结果。我还没想出如何在代码层面解决这个问题。在使用方面--重新应用 KeyFinder 2.0,按钮将重新 "工作"。
 
也许将程序作为指标,并在指标从图表中移除时清除屏幕更为合理?
 
komposter:
也许把程序做成一个指标,并在指标从图表中移除时清除屏幕会更合理?
我正在制作一个指标。这个脚本是 "测试我的笔"。
 
Rubick:
我可以模拟您的情况。这种行为是在 KeyFinder 2.0 之后使用另一个脚本的结果。我还没想出如何在代码层面解决这个问题。在使用方面--重新应用 KeyFinder 2.0,按钮将重新 "工作"。
我尝试了各种方法来解决按钮卡在屏幕上的问题。最简单的方法是删除货币对窗口,然后重新创建。脚本显示的信息非常有用。例如,我在交易中使用了很多东西(穆雷水平 - TirMethod、交易模型 Third Wave 和 Consolidation),在任何地方我都需要类似的指标(ZigZag、ZipPips),而脚本有助于评估数字构建的正确性和极值的比例性。让我们拭目以待。请随时通知我们。您在任何社交网络上都有自己的页面吗?祝您好运并取得成功!
 
ernst.yagafarof:
我尝试了各种方法来解决按钮 "卡 "在屏幕上的问题。最简单的方法是删除货币对窗口,然后重新创建。脚本显示的信息非常有用。例如,我在交易中使用了很多东西(穆雷水平 - TirMethod、交易模型 Third Wave 和 Consolidation),在任何地方我都需要一个类似的指标(ZigZag、ZipPips),而脚本有助于评估数字构建的正确性和极值的比例性。让我们拭目以待。请随时通知我们。您在任何社交网络上都有自己的页面吗?祝你好运并取得成功!
我已经更新了我的个人资料。
 
我有一个好消息!我已经完成了指标类的设计 和编写,现在我正在编写指标本身,我计划下周完成它--最多,至少在本周末完成。
 
Rubick:
我有个好消息!我已经完成了指标类的设计和编写,现在我正在编写指标本身,计划下周完成--最多,至少在本周末完成。
谢谢你们。我们非常期待!
[删除]  

我可以把它应用到什么地方?

我把你的脚本放到了 "指标 "中,当我切换图表时,它会重新计算一切。

GBPUSDH4.

//+------------------------------------------------------------------+
//|KeyFinder.mq5
//|特罗菲莫夫-帕维尔
//|trofimovpp@mail.ru ||
//+------------------------------------------------------------------+
#property copyright "Trofimov Pavel"
#property link      "trofimovpp@mail.ru"
#property version   "1.00"
#property description "警告!此算法在计算中使用循环!"
#property description "强烈建议将处理量设置为最多 1000 条!"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//--- 输入参数
input int      MinDimesion = 5;          // 点的最小维度
input int      MaxBars     = 300;        // 要处理的条数
input string   LabelName   = "KF_Label"; //
//+------------------------------------------------------------------+
//| 自定义指示器初始化函数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 指示器缓冲区映射

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   CleanChart();
   Comment("");
  }
//+------------------------------------------------------------------+
//| 自定义指标迭代函数
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
// 检查设定条数的历史可用性
   int SMaxBars=Bars(Symbol(),0),iMaxBars=MaxBars;
   if(SMaxBars<MaxBars)
     {
      iMaxBars=SMaxBars;
      Comment("MaxBars 参数设置过大"。+"\n"+"计算将使用"+IntegerToString(SMaxBars)+"酒吧"。);
     };
   int clean=CleanChart();//重新应用时清除图形
   MqlRates  rates_array[];
   string Com="";
   int iCod=CopyRates(Symbol(),Period(),0,iMaxBars,rates_array);//数组元素数
   iCod=iCod-1;//数组中最大元素的索引
   Com="工作......等着!";
   Comment(Com);
   if(iCod>0)
     {
      FindUpKeyPoints(iCod,rates_array);/查找最重要的关键点
      Com=Com+"\n"+"最高分已处理完毕"+"\n";
      Comment(Com);
      FindLowKeyPoints(iCod,rates_array);/查找较低的关键点
      Comment("处理完成");
     }
   else
      Comment("缺少加工条!!");
//--- 为下一次调用返回 prev_calculated 的值
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|| 找到最重要的关键点|
//+------------------------------------------------------------------+
void FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[])
  {
   int HD=1;
   for(int i=temp_iCod-MinDimesion; i>(MinDimesion-1); i--)// 从最终 - 最小维度到零 + 最小维度,逐条循环
     {
      HD=getHighDimension(temp_rates,i,temp_iCod);// 获取点的维度
      if((HD>=MinDimesion) || (HD==-1))
        {
         // 如果符合最小尺寸条件,则创建标记
         string Ob_Name=LabelName+IntegerToString(i);
         if(HD!=-1)
           {
            ObjectCreate(0,Ob_Name,OBJ_TEXT,0,temp_rates[i].time,temp_rates[i].high);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_LOWER);
            ObjectSetString(0,Ob_Name,OBJPROP_TEXT,0,IntegerToString(HD));
            ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrRed);
           }
         else
           {
            // 如果无法确定尺寸,我们就用一个球来标记。
            ObjectCreate(0,Ob_Name,OBJ_ARROW,0,temp_rates[i].time,temp_rates[i].high);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ARROWCODE,0,159);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_BOTTOM);
            ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrRed);
           };
        };
     };
  }
//+------------------------------------------------------------------+
//|搜索较低的关键点
//+------------------------------------------------------------------+
void FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[])
  {
   int LD=1;//初始化点尺寸
   bool iCreate;
   for(int i=temp_iCod-MinDimesion; i>(MinDimesion-1); i--)
     {
      LD=getLowDimension(temp_rates,i,temp_iCod);
      if((LD>=MinDimesion) || (LD==-1))
        {
         string Ob_Name=LabelName+IntegerToString(i)+"_1";//担心最低点和最高点可能成为关键点的条形图
         if(LD!=-1)
           {
            iCreate=ObjectCreate(0,Ob_Name,OBJ_TEXT,0,temp_rates[i].time,temp_rates[i].low);
            if(iCreate)
              {
               ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_UPPER);
               ObjectSetString(0,Ob_Name,OBJPROP_TEXT,0,IntegerToString(LD));
               ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrGreen);
              }
            else
               Comment("无法创建对象"。);
           }
         else
           {
            iCreate=ObjectCreate(0,Ob_Name,OBJ_ARROW,0,temp_rates[i].time,temp_rates[i].low);
            if(iCreate)
              {
               ObjectSetInteger(0,Ob_Name,OBJPROP_ARROWCODE,0,159);
               ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_TOP);
               ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrGreen);
              }
            else
               Comment("无法创建对象"。);
           };
        };
     };
  }
//+------------------------------------------------------------------+
//| 确定上点的维数
//+------------------------------------------------------------------+
int getHighDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)
  {
   int k=1;
   while((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++;
   if(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0))
      k=-1;
   return(k);
  }
//+------------------------------------------------------------------+
//| 确定底点的维数
//+------------------------------------------------------------------+
int getLowDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)
  {
   int k=1;
   while((tmpRates[tmp_i].low<tmpRates[tmp_i+k].low) && (tmpRates[tmp_i].low<tmpRates[tmp_i-k].low) && ((tmp_i+k)<(tmp_iCod)) && ((tmp_i-k)>0))
      k++;
   if(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0))
      k=-1;
   return(k);
  }
//+-------------------------------------------------------------------------------+
// 清除脚本创建的对象图,以防重新应用 ||
//+-------------------------------------------------------------------------------+
int CleanChart()
  {
   string Label=LabelName;
   int obj_total=ObjectsTotal(0,0,-1),n=0;
   for(int obj=obj_total-1; obj>=0; obj--)
     {
      string objname=ObjectName(0,obj,0,-1);
      if(StringFind(objname,Label)>=0)
         ObjectDelete(0,objname);
      n++;
     }
   return(n);
  }
//+------------------------------------------------------------------+
附加的文件:
KeyFinder.mq5  16 kb
 
我试了一下,发现它很不错 ..... 一些设置,使其保持最新。