English Русский 中文 Español Deutsch 日本語
Controle Gráfico dos Parâmetros Externos dos Indicadores

Controle Gráfico dos Parâmetros Externos dos Indicadores

MetaTrader 4Exemplos | 30 setembro 2015, 09:44
871 0
Vladimir
Vladimir

Introdução

Quantas vezes você tem que definir ou alterar os parâmetros externos dos indicadores? Muitos de vocês devem já deve ter pensado de mover os parâmetros no gráfico, com a possibilidade de arrastar convenientemente um ícone ou objeto à posição escolhida com o mouse, simplificando assim o procedimento de configuração do indicador. Então, a linguagem MQL4 permite a exibição de configurações do indicador na tela.


Controle gráfico dos parâmetros

Primeiro de tudo, precisamos definir os parâmetros existentes no nosso indicador e quais deles vamos mudar. Para fazer isso, abra as propriedades de indicador e anote os nomes dos parâmetros que terão de ser alterados no decorrer do trabalho.

Como exemplo, usaremos o indicador ZigZag incluído no terminal padrão. Selecione os nomes das variáveis nas propriedades.


Parâmetros do indicador:

  • ExtDepth=12
  • ExtDeviation=5
  • ExtBackstep=3

Criaremos mais variáveis e arrays que serão utilizados para alterar os valores dos parâmetros do indicador.

Nomes dos parâmetros do indicador serão de acordo com os parâmetros do indicador que vamos controlar.

// Valores iniciais do indicador
int               ExtDepth=12;
int               ExtDeviation=5;
int               ExtBackstep=3;
//---- buffers do indicador
double            ZigzagBuffer[];
double            HighMapBuffer[];
double            LowMapBuffer[];
// Array das variáveis dos parâmetros do indicador
string            ArrExt[3,3]    ={"12","21","34", "5","8","21", "3","13","34"};
// Arrays de índices
string            Array_Index[]={"Dep -> ","Dev -> ","Back ->"};
int               Coordinats_IndexUp[]={65,160,260};
int               Coordinats_Index[]  ={35,130,230};
int               Coordinats_IndexDn[]={5, 100,200};
// Cores para blocos dos parâmetros e índices
color             Color_[]={Blue,Green,Red};

Eu acredito que tudo é claro nesta fase.

"Dep -> ","Dev -> ","Back ->"

são ExtDepth, ExtDeviation e ExtBackstep, respectivamente. Esta é a forma como serão exibidos no gráfico.

Para cada um dos parâmetros, utilizam-se três valores de variáveis

string            ArrExtDepth[]    ={"12","15","20"};
string            ArrExtDeviation[]={"5",  "8","21"};
string            ArrExtBackstep[] ={"3", "13","34"};

armazenados num array tridimensional, por conveniência:

string            ArrExt[3,3]    ={"12","21","34", "5","8","21", "3","13","34"};

3, 5, 12 são valores padrões definidos nos parâmetros do indicador ZigZag.

Outros valores são apresentados aqui como exemplo. Eles serão usados como variáveis de parâmetros para controle do indicador.

Considerando que haverá muitas plotações envolvidas, nós colocamos uma função para criar e mover objetos num bloco separado:

void Obj_CreateMove_Text (int CreateMove, string Name, int Type, string Number,  color text_color, 
                          int DistX, int DistY)
   {
      if (CreateMove==0)
      ObjectCreate(Name,Type,0,0,0);
      ObjectSetText(Name,Number,10,"Arial",text_color);
      ObjectSet(Name,101,3);
      ObjectSet(Name, 102, DistX);
      ObjectSet(Name, 103, DistY);
   }

Para assegurar facilidade de controle a fim de manter o código compacto, todas as coordenadas dos objetos gráficos são armazenados em arrays. Isto já foi demonstrado anteriormente (ver o início do artigo).

Vamos agora plotar todos os objetos na janela do gráfico.

O lado direito do nosso gráfico é o menos carregado com informações, então as variáveis serão dispostas verticalmente ao longo da borda direita da janela. Cada parâmetro tem o seu próprio índice cuja cor vai ser a mesma correspondente das variáveis dos parâmetros.

Assim precisamos criar três índices de parâmetros e três valores de variáveis para cada um dos parâmetros.

Criar objetos para os parâmetros do indicador na tela, exibir valores numéricos das variáveis para esses parâmetros e criar os índices correspondentes ao lado de cada bloco de parâmetro.

// Criar objetos
   for( ii=0;ii<3;ii++)
      for( i=0;i<3;i++)
      Obj_CreateMove_Text (0, Array_Index[ii]+i, 23, (ArrExt[ii,i]), Color_[ii], 5, Coordinats_IndexDn[ii]+30*i);
      for( i=0;i<3;i++)
      Obj_CreateMove_Text (0, "Index"+Array_Index[i], 23, (Array_Index[i]),   Color_[i], 25, Coordinats_Index[i]);


Figura 1.

Agora nós somente precisamos criar um bloco para manipular ações do usuário quando o índice relevante for movido.

Temos pontos de ancoragem dos objetos no gráfico de acordo com a leitura do índice dos parâmetros, um por um e vamos determinar a lógica do programa.

// Leia o índice das coordenadas a partir do gráfico
      for( i=0;i<3;i++)
           {
            Coordinats[i]=ObjectGet("Index"+Array_Index[i],OBJPROP_YDISTANCE);
               if (Coordinats[i]==0)//Se fora do gráfico, defina novamente
                  Obj_CreateMove_Text (1, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Coordinats_IndexDn[i]);
           }    

Agora que os valores obtidos foram salvos, precisamos analisar suas posições no gráfico e fazer o necessário. Para a análise, usamos as posições efetivas dos índices, tomando como ponto de referência os três valores de base de cada um dos índices relativos aos valores dos parâmetros usados. Se o índice é movido acima do valor mais alto em seu grupo, ele será considerado como tendo sido transferido ao seu valor mais alto. Se o índice é movido abaixo do valor do parâmetro mais baixo, de forma semelhante será transferido ao valor menor do parâmetro. Se o índice estiver entre os valores maiores e menores do parâmetro, ele toma o valor médio. Para fins de comparação, usamos uma escala vertical, ou seja, o parametro

OBJPROP_YDISTANCE

a partir do

ObjectGet()


// Analisar posições dos índices
      for( i=0;i<3;i++)
         {
            if (Coordinats[i]>Coordinats_IndexUp[i]) 
                  {Move[i] = Coordinats_IndexUp[i]; index[i]=2;}//  Índice foi movido para cima
            if (Coordinats[i]>Coordinats_IndexDn[i]  && 
                Coordinats[i]<Coordinats_IndexUp[i])
                  {Move[i] = Coordinats_Index[i];   index[i]=1;}// Índice está no meio
            if (Coordinats[i]<Coordinats_IndexDn[i]) 
                  {Move[i] = Coordinats_IndexDn[i]; index[i]=0;}// Índice está no meio 
            if (Move[i]!=0)

Em seguida, alinhar os objetos que foram movidos.

Salve os novos valores dos parâmetros para plotar o ZigZag.

Traçar o indicador com base nos valores definidos usando o controle gráfico.

// Move e alinha os objetos de acordo com suas posições
            Obj_CreateMove_Text (1, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Move[i]);    
// Salvar os valores do parâmetro ZigZag
            switch (i)   
               {
                case 0:  ExtDepth =     StrToInteger(ArrExt[0,index[i]]);  break;
                case 1:  ExtDeviation = StrToInteger(ArrExt[1,index[i]]);  break;
                case 2:  ExtBackstep =  StrToInteger(ArrExt[2,index[i]]);  break;                  
               }/**/
          }
 // Valores dos parâmetros transferidos ao indicador personalizado e plota o ZigZag com base nos valores obtidos
     for(i=300;i>0;i--)
            {
               ZigzagBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
               HighMapBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,1,i);
               LowMapBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,2,i);
            }

Dê um duplo clique em qualquer objeto gráfico para ativá-lo. Quando ativado, o objeto pode ser controlado usando o mouse. Isso precisa ser feito a cada vez que você decidir mudar o valor do parâmetro.


Figura 2.


Figura 3.


Figura 4.


A versão final do código será a seguinte.

//+------------------------------------------------------------------+
//|                                         management_indicator.mq4 |
//|                                  Copyright © 2009, WWW.FIBOOK.RU |
//|                                             http://www.fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, WWW.FIBOOK.RU"
#property link      "http://www.fibook.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
// Valores iniciais do indicador
int               ExtDepth=12;
int               ExtDeviation=5;
int               ExtBackstep=3;
//---- buffers do indicador
double            ZigzagBuffer[];
double            HighMapBuffer[];
double            LowMapBuffer[];
// Array das variáveis dos parâmetros do indicador
string            ArrExt[3,3]    ={"12","21","34", "5","8","21", "3","13","34"};
// Arrays de índices
string            Array_Index[]={"Dep -> ","Dev -> ","Back ->"};
int               Coordinats_IndexUp[]={65,160,260};
int               Coordinats_Index[]  ={35,130,230};
int               Coordinats_IndexDn[]={5, 100,200};
// Cores para blocos dos parâmetros e índices
color             Color_[]={Blue,Green,Red};
// Variáveis para calcular
int               i,ii;
int               index[3];
//+------------------------------------------------------------------+
//| Função inicializar do indicador personalizado                    |
//+------------------------------------------------------------------+
int init()
  {
//---- indicadores
   IndicatorBuffers(3);
//---- Configurações do desenho
   SetIndexStyle(0,DRAW_SECTION);
// ---- mapeamento dos buffers do indicador
   SetIndexBuffer(0,ZigzagBuffer);
   SetIndexBuffer(1,HighMapBuffer);
   SetIndexBuffer(2,LowMapBuffer);
   SetIndexEmptyValue(0,0.0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Função desinicializar do indicador personalizado                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Função de iteração do indicador personalizado                    |
//+------------------------------------------------------------------+
int start()
  {
int  Coordinats[3];
int  Move[3];
// Verifica se os objetos de índice estão no gráfico
   if (ObjectGet("IndexDep -> ",OBJPROP_YDISTANCE)<1||
       ObjectGet("IndexDev -> ",OBJPROP_YDISTANCE)<1||
       ObjectGet("IndexBack ->",OBJPROP_YDISTANCE)<1)
// Se eles não estão no gráfico, devem sr criados
               {
      for( ii=0;ii<3;ii++)
       for( i=0;i<3;i++)
        Obj_CreateMove_Text (0, Array_Index[ii]+i, 23, ArrExt[ii,i], Color_[ii], 5, Coordinats_IndexDn[ii]+30*i);
       for( i=0;i<3;i++)
        Obj_CreateMove_Text (0, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Coordinats_IndexDn[i]);
               }
// Leia o índice das coordenadas a partir do gráfico
      for( i=0;i<3;i++)
           {
            Coordinats[i]=ObjectGet("Index"+Array_Index[i],OBJPROP_YDISTANCE);
               if (Coordinats[i]==0)//Se fora do gráfico, defina novamente
                  Obj_CreateMove_Text (1, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Coordinats_IndexDn[i]);
           }    
// Analisar posições dos índices
      for( i=0;i<3;i++)
         {
            if (Coordinats[i]>Coordinats_IndexUp[i]) 
                  {Move[i] = Coordinats_IndexUp[i]; index[i]=2;}//Index has been moved up
            if (Coordinats[i]>Coordinats_IndexDn[i]  && 
                Coordinats[i]<Coordinats_IndexUp[i])
                  {Move[i] = Coordinats_Index[i];   index[i]=1;}// Índice está no meio
            if (Coordinats[i]<Coordinats_IndexDn[i]) 
                  {Move[i] = Coordinats_IndexDn[i]; index[i]=0;}//Ìndice foi movido para baixo
            if (Move[i]!=0)
// Move e alinha os objetos de acordo com suas posições
            Obj_CreateMove_Text (1, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Move[i]);    
// Salvar os valores do parâmetro ZigZag
            switch (i)   
               {
                case 0:  ExtDepth =     StrToInteger(ArrExt[0,index[i]]);  break;
                case 1:  ExtDeviation = StrToInteger(ArrExt[1,index[i]]);  break;
                case 2:  ExtBackstep =  StrToInteger(ArrExt[2,index[i]]);  break;                  
               }/**/
          }
 // Valores dos parâmetros transferidos ao indicador personalizado e plota o ZigZag com base nos valores obtidos
     for(i=300;i>0;i--)
            {
               ZigzagBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
               HighMapBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,1,i);
               LowMapBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,2,i);
            }
Comment ("ExtDepth =",ExtDepth,", ExtDeviation =",ExtDeviation,", ExtBackstep =",ExtBackstep);        
//----
   return(0);
  }
// Função para criar e mover objetos gráficos
void Obj_CreateMove_Text (int CreateMove, string Name, int Type, string Number,  color text_color, int DistX, int DistY)
   {
      if (CreateMove==0)
      ObjectCreate(Name,Type,0,0,0);
      ObjectSetText(Name,Number,10,"Arial",text_color);
      ObjectSet(Name,101,3);
      ObjectSet(Name, 102, DistX);
      ObjectSet(Name, 103, DistY);
   }


//+------------------------------------------------------------------+


Conclusão

A abordagem descrita acima podem ser implementada para controlar qualquer indicador externamente, exibindo os parâmetros que precisam ser ajustados.

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1370

Alert e Comment para Indicadores Externos. Análise de Multimoedas Através de Varredura Externa Alert e Comment para Indicadores Externos. Análise de Multimoedas Através de Varredura Externa
Alerta para análise de multimoedas e múltiplos timeframes para indicadores externos. O artigo trata de um método para obter informações sobre o evento em relação aos acontecimentos com indicadores externos, sem a necessidade de anexar indicadores a um gráfico ou aos próprios gráficos abertos. Vamos chamá-lo de varredura externa.
Lendo Feeds de Notícias RSS Via MQL4 Lendo Feeds de Notícias RSS Via MQL4
Este artigo mostra um exemplo da leitura de RSS via MQL4 utilizando as funções para análise de tags HTML. Vamos tentar fazer uma peça de trabalho que pode então ser transformada num indicador de notícias ou apenas um leitor na linguagem MQL4.
Alert e Comment para Indicadores Externos (Parte II) Alert e Comment para Indicadores Externos (Parte II)
Desde que publiquei o artigo "Alert e Comment para indicadores externos", tenho recebido pedidos e perguntas a respeito da possibilidade de desenvolver uma operação baseada em informação externa com linhas de indicador, tendo analisado as perguntas, eu decidi continuar com o assunto. Os dados armazenados em buffers de indicador acabaram despertando outra área de interesse dos usuários.
LibMatrix: Biblioteca de Álgebra Matricial (Parte I) LibMatrix: Biblioteca de Álgebra Matricial (Parte I)
O autor familiariza os leitores com uma simples biblioteca de álgebra matricial e fornece descrições e peculiaridades das principais funções.