Scripts: KeyFinder 2.0

 

KeyFinder 2.0:

O script encontra pontos pivot DeMark, exibe-os no gráfico e indica as suas dimensões.

Fig. 1. Índice Futuro RTS após aplicar o script KeyFinder 2.0

Autor: Pavel Trofimov

 

O botão que exclui o script (nem sempre funciona) permanece na tela (nem sempre). Terminal MT4, Alpari, imagem 765


 
Consegui simular sua situação. Esse comportamento é o resultado do uso de outro script após o KeyFinder 2.0. Ainda não descobri como superar isso no nível do código. Em termos de uso, reaplique o KeyFinder 2.0 e o botão voltará a "funcionar".
 
Talvez seja mais razoável criar o programa como um indicador e limpar a tela quando o indicador for removido do gráfico?
 
komposter:
Talvez seja mais razoável criar o programa como um indicador e limpar a tela quando o indicador for removido do gráfico?
Estou trabalhando em um indicador. O script é um "teste da minha caneta".
 
Rubick:
Consegui simular sua situação. Esse comportamento é o resultado do uso de outro script após o KeyFinder 2.0. Ainda não descobri como superar isso no nível do código. Em termos de uso, reaplique o KeyFinder 2.0 e o botão voltará a "funcionar".
Tentei eliminar o botão preso na tela de várias maneiras. A mais simples é excluir a janela do par de moedas e criá-la novamente do zero. As informações exibidas pelo script são muito úteis. Por exemplo, eu uso muitas coisas na negociação (níveis de Murray - TirMethod, modelos de negociação Third Wave e Consolidation) e em todos os lugares eu preciso de um indicador semelhante (ZigZag, ZipPips,), e o script ajuda a avaliar a exatidão da construção das figuras e a proporcionalidade dos extremos. Vamos aguardar o indicador. Mantenha-nos informados. Você tem uma página em alguma rede social? Boa sorte e sucesso para você!
 
ernst.yagafarof:
Tentei fazer com que o botão ficasse "preso" na tela de todas as formas possíveis. A mais simples é excluir a janela do par de moedas e criá-la novamente do zero. As informações exibidas pelo script são muito úteis. Por exemplo, eu uso muitas coisas na negociação (níveis de Murray - TirMethod, modelos de negociação Third Wave e Consolidation) e em todos os lugares eu preciso de um indicador semelhante (ZigZag, ZipPips,), e o script ajuda a avaliar a exatidão da construção das figuras e a proporcionalidade dos extremos. Vamos aguardar o indicador. Mantenha-nos informados. Você tem uma página em alguma rede social? Boa sorte e sucesso para você!
Atualizei meu perfil.
 
Tenho boas notícias! Terminei de projetar e escrever uma classe para o indicador, agora estou escrevendo o indicador em si, e planejo terminá-lo na próxima semana - no máximo, pelo menos no fim de semana atual.
 
Rubick:
Tenho boas notícias! Terminei de projetar e escrever a classe para o indicador, agora estou escrevendo o indicador em si, e pretendo terminar na próxima semana - no máximo, pelo menos no fim de semana atual.
Obrigado. Estamos esperando ansiosamente por isso!
[Excluído]  

Em que posso aplicá-lo?

Coloquei seu script no indicador e, quando mudo o gráfico, ele recalcula tudo.

GBPUSDH4.

//+------------------------------------------------------------------+
//|KeyFinder.mq5
//|Trofimov Pavel |
//|trofimovpp@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Trofimov Pavel"
#property link      "trofimovpp@mail.ru"
#property version   "1.00"
#property description "Aviso! Este algoritmo usa ciclos nos cálculos!"
#property description "É altamente recomendável definir um máximo de 1.000 barras para processamento!"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//--- parâmetros de entrada
input int      MinDimesion = 5;          // Dimensionalidade mínima dos pontos
input int      MaxBars     = 300;        // Número de barras a serem processadas
input string   LabelName   = "KF_Label"; //
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers de indicadores

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   CleanChart();
   Comment("");
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado
//+------------------------------------------------------------------+
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[])
  {
//---
//verificar a disponibilidade do histórico para o número definido de barras
   int SMaxBars=Bars(Symbol(),0),iMaxBars=MaxBars;
   if(SMaxBars<MaxBars)
     {
      iMaxBars=SMaxBars;
      Comment("O parâmetro MaxBars está definido como muito grande."+"\n"+"Para os cálculos será usado "+IntegerToString(SMaxBars)+" barras.");
     };
   int clean=CleanChart();//limpar o gráfico ao reaplicá-lo
   MqlRates  rates_array[];
   string Com="";
   int iCod=CopyRates(Symbol(),Period(),0,iMaxBars,rates_array);//número de elementos da matriz
   iCod=iCod-1;//Índice do elemento máximo na matriz
   Com="Trabalhando... Espere por isso!";
   Comment(Com);
   if(iCod>0)
     {
      FindUpKeyPoints(iCod,rates_array);/Encontre os principais pontos-chave
      Com=Com+"\n"+"Os pontos principais foram processados."+"\n";
      Comment(Com);
      FindLowKeyPoints(iCod,rates_array);/Encontrar pontos-chave inferiores
      Comment("Processamento concluído".);
     }
   else
      Comment("Falta de barras de processamento!!!");
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|| Encontrar os principais pontos-chave|
//+------------------------------------------------------------------+
void FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[])
  {
   int HD=1;
   for(int i=temp_iCod-MinDimesion; i>(MinDimesion-1); i--)// ciclo de barras de final - MinDimension a zero + MinDimension
     {
      HD=getHighDimension(temp_rates,i,temp_iCod);//obter a dimensionalidade dos pontos
      if((HD>=MinDimesion) || (HD==-1))
        {
         // criar uma marca se ela se enquadrar nas condições de 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
           {
            //Se não for possível determinar a dimensão, nós a marcamos com uma 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);
           };
        };
     };
  }
//+------------------------------------------------------------------+
//|Busca de pontos-chave inferiores
//+------------------------------------------------------------------+
void FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[])
  {
   int LD=1;//inicializar as dimensões do ponto
   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";//Seguro de barras em que a mínima e a máxima podem ser pontos-chave
         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("Não é possível criar um 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("Não é possível criar um objeto.");
           };
        };
     };
  }
//+------------------------------------------------------------------+
//| Determinação da dimensionalidade do ponto 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);
  }
//+------------------------------------------------------------------+
//| Determinação da dimensionalidade do ponto 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);
  }
//+-------------------------------------------------------------------------------+
//| Limpando o gráfico de objetos criados pelo script em caso de reaplicação
//+-------------------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
KeyFinder.mq5  16 kb
 
Experimentei e achei bom ..... algumas configurações para mantê-lo atualizado.