Scripts: KeyFinder 2.0

 

KeyFinder 2.0:

El script encuentra y marca en el gráfico los puntos de apoyo de DeMark y muestra su dimensión.

Figura 1. Gráfico de futuros en el índice РТС con la aplicación del script KeyFinder 2.0

Autor: Pavel Trofimov

 

El botón que borra el script (no siempre funciona) permanece en la pantalla (no siempre). MT4 terminal, Alpari, bild 765


 
He podido simular su situación. Este comportamiento es el resultado de utilizar otro script después de KeyFinder 2.0. Todavía no he encontrado la forma de solucionar este problema a nivel de código. En términos de uso - vuelva a aplicar KeyFinder 2.0 y el botón volverá a "funcionar".
 
¿Quizás es más razonable hacer el programa como un indicador, y borrar la pantalla cuando el indicador se quita del gráfico?
 
komposter:
¿Quizás sería más razonable hacer el programa como un indicador, y borrar la pantalla cuando el indicador se quite del gráfico?
Estoy trabajando en un indicador. El script es una "prueba de mi pluma".
 
Rubick:
He podido simular su situación. Este comportamiento es el resultado de utilizar otro script después de KeyFinder 2.0. Todavía no he encontrado la forma de solucionar este problema a nivel de código. En términos de uso - vuelva a aplicar KeyFinder 2.0 y el botón volverá a "funcionar".
He intentado vencer el botón atascado en la pantalla de todo tipo de maneras. La más sencilla es borrar la ventana del par de divisas y crearla de nuevo desde cero. La información que muestra el script es muy útil. Por ejemplo, yo uso un montón de cosas en el comercio (niveles de Murray - TirMethod, modelos de negociación de Tercera Ola y Consolidación) y en todas partes necesito un indicador similar (ZigZag, ZipPips,), y el guión ayuda a evaluar la exactitud de la construcción de las cifras y la proporcionalidad de los extremos. Vamos a esperar a que el indicador. Manténganos informados. ¿Tiene una página en cualquier red social? ¡Buena suerte y éxito para usted!
 
ernst.yagafarof:
He intentado vencer el botón "atascado" en la pantalla de todas las maneras posibles. La más sencilla es borrar la ventana de pares de divisas y crearla de nuevo desde cero. La información que muestra el script es muy útil. Por ejemplo, yo uso un montón de cosas en el comercio (niveles de Murray - TirMethod, modelos de negociación de Tercera Ola y Consolidación) y en todas partes necesito un indicador similar (ZigZag, ZipPips,), y el guión ayuda a evaluar la exactitud de la construcción de las cifras y la proporcionalidad de los extremos. Vamos a esperar a que el indicador. Manténganos informados. ¿Tiene una página en cualquier red social? ¡Mucha suerte y éxito!
He actualizado mi perfil.
 
¡Tengo buenas noticias! He terminado de diseñar y escribir una clase para el indicador, ahora estoy escribiendo el indicador en sí, planeo terminarlo la próxima semana - a lo sumo, por lo menos durante el fin de semana en curso.
 
Rubick:
¡Tengo buenas noticias! He terminado de diseñar y escribir la clase para el indicador, ahora estoy escribiendo el indicador en sí, planeo terminar la próxima semana - a lo sumo, por lo menos durante el fin de semana en curso.
Gracias. ¡Lo esperamos con impaciencia!
[Eliminado]  

¿A qué lo puedo aplicar?

Puse tu script en el Indicador, cuando cambio el gráfico recalcula todo.

GBPUSDH4.

//+------------------------------------------------------------------+
//|KeyFinder.mq5
//|Trofimov Pavel |
//|trofimovpp@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Trofimov Pavel"
#property link      "trofimovpp@mail.ru"
#property version   "1.00"
#property description "¡Atención! Este algoritmo utiliza ciclos en los cálculos!"
#property description "¡Se recomienda encarecidamente fijar un máximo de 1.000 bares para el procesamiento!".
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//--- parámetros de entrada
input int      MinDimesion = 5;          // Dimensionalidad mínima de los puntos
input int      MaxBars     = 300;        // Número de barras a procesar
input string   LabelName   = "KF_Label"; //
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- asignación de búferes indicadores

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   CleanChart();
   Comment("");
  }
//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizada |
//+------------------------------------------------------------------+
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[])
  {
//---
//comprobar la disponibilidad del historial para el número de barras establecido
   int SMaxBars=Bars(Symbol(),0),iMaxBars=MaxBars;
   if(SMaxBars<MaxBars)
     {
      iMaxBars=SMaxBars;
      Comment("El parámetro MaxBars es demasiado grande".+"\n"+"Para los cálculos se utilizará "+IntegerToString(SMaxBars)+"bares".);
     };
   int clean=CleanChart();//borrar el gráfico al volver a aplicarlo
   MqlRates  rates_array[];
   string Com="";
   int iCod=CopyRates(Symbol(),Period(),0,iMaxBars,rates_array);//número de elementos de la matriz
   iCod=iCod-1;//Índice del elemento máximo de la matriz
   Com="Trabajando... ¡Espéralo!";
   Comment(Com);
   if(iCod>0)
     {
      FindUpKeyPoints(iCod,rates_array);//Encuentra los principales puntos clave
      Com=Com+"\n"+"Los puntos superiores han sido procesados".+"\n";
      Comment(Com);
      FindLowKeyPoints(iCod,rates_array);//Encontrar puntos clave inferiores
      Comment("Procesamiento completo".);
     }
   else
      Comment("¡¡¡Falta de barras de procesamiento!!!");
//--- valor de retorno de prev_calculado para la siguiente llamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|| Encontrar los principales puntos clave|
//+------------------------------------------------------------------+
void FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[])
  {
   int HD=1;
   for(int i=temp_iCod-MinDimesion; i>(MinDimesion-1); i--)// ciclo por barras desde final - MinDimension hasta cero + MinDimension
     {
      HD=getHighDimension(temp_rates,i,temp_iCod);//obtener la dimensionalidad de los puntos
      if((HD>=MinDimesion) || (HD==-1))
        {
         // crear una marca si cumple las condiciones 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
           {
            //Si no podemos determinar la dimensión, la marcamos con una bola.
            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);
           };
        };
     };
  }
//+------------------------------------------------------------------+
//|Búsqueda de puntos clave inferiores |
//+------------------------------------------------------------------+
void FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[])
  {
   int LD=1;//inicializar las dimensiones de los puntos
   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";//Preocúpate de las barras en las que el mínimo y el máximo pueden ser puntos clave
         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("No se puede crear un objeto".);
           }
         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("No se puede crear un objeto".);
           };
        };
     };
  }
//+------------------------------------------------------------------+
//| Determinar la dimensionalidad del punto superior |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Determinar la dimensionalidad del punto inferior |
//+------------------------------------------------------------------+
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);
  }
//+-------------------------------------------------------------------------------+
//| Borrar el gráfico de los objetos creados por el script en caso de reaplicación |||
//+-------------------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
KeyFinder.mq5  16 kb
 
lo probe y me resulto bueno .....un par de ajustes para tenerlo actualizado