Controle Gráfico dos Parâmetros Externos dos Indicadores
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
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso