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


KeyFinder 2.0:
这款脚本搜索 DeMark 的轴点, 并在图表上显示它们, 同时指示它们的尺度。
作者: Pavel Trofimov