スクリプト: KeyFinder 2.0

 

KeyFinder 2.0:

このスクリプトは、デマーク(DeMark)方式のピボットポイントを検索してチャート上に表示し、それらのディメンションを示します。

図1KeyFinder 2.0スクリプトが適応された後のRTS指数先物契約チャート

作者: Pavel Trofimov

 

スクリプトを削除するボタン(常に機能するわけではありません)が画面に残ります。MT4ターミナル、Alpari、bild 765


 
あなたの状況をシミュレートすることができました。この動作は、KeyFinder 2.0の後に別のスクリプトを使用した結果です。コードレベルでこれを克服する方法はまだわかっていません。使い方としては、KeyFinder 2.0を再度適用すれば、ボタンは再び「動作」します。
 
インジケーターとしてプログラムを作成し、インジケーターをチャートから外したときに画面をクリアにする方が合理的かもしれませんね。
 
komposter:
プログラムをインジケーターとして作成し、インジケーターをチャートから外すと画面がクリアになるようにした方が合理的なのでは?
私はインジケーターを作っています。スクリプトは "私のペンのテスト "です。
 
Rubick:
あなたの状況をシミュレートすることができました。この動作は、KeyFinder 2.0の後に別のスクリプトを使用した結果です。コードレベルでこれを克服する方法はまだわかっていません。使い方としては、KeyFinder 2.0を再適用すれば、ボタンは再び「動く」ようになります。
いろいろな方法でボタンが動かなくなるのを防ごうとした。一番簡単なのは、通貨ペア・ウィンドウを削除して、一から作り直すことです。スクリプトが表示する情報はとても便利だ。例えば、私は取引でいろいろなもの(マレー・レベル - TirMethod、取引モデル第3の波とコンソリデーション)を使いますが、どこでも似たようなインジケータ(ZigZag、ZipPips、)が必要で、スクリプトは数値の構築の正しさと極値の比例性を評価するのに役立ちます。インジケータを待ちましょう。また情報をお寄せください。ソーシャルネットワークにページをお持ちですか?幸運と成功を祈ります!
 
ernst.yagafarof:
ボタンが「動かない」のを何とかしようと、いろいろな方法を試した。一番簡単なのは、通貨ペア・ウィンドウを削除して、一から作り直すことだ。スクリプトによって表示される情報はとても便利です。例えば、私は取引で多くのもの(マレー・レベル-TirMethod、取引モデル第3の波動とコンソリデーション)を使用しており、どこでも似たようなインジケータ(ZigZag、ZipPips、)が必要で、スクリプトは数値の構築の正しさと極値の比例性を評価するのに役立ちます。インジケータを待ちましょう。また情報をお寄せください。ソーシャルネットワークにページをお持ちですか?幸運と成功を祈ります!
プロフィールを更新しました。
 
いいニュースがある!インジケーターのクラス設計と 執筆を終え、今はインジケーターそのものを書いている。
 
Rubick:
いいニュースがある!インジケーターのクラス設計と執筆を終え、今はインジケーターそのものを書いている。
ありがとう。楽しみにしています!
削除済み  

何に適用できますか?

あなたのスクリプトをインディケータに入れましたが、チャートを切り替えるとすべて再計算されます。

GBPUSDH4.

//+------------------------------------------------------------------+
//|キーファインダー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))
        {
         // MinDimensionの条件に該当する場合、マークを作成する。
         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
 
使ってみたところ、いい感じだった......最新の状態に保つための設定がいくつかある。