English Русский 中文 Español Deutsch 日本語
A ociosidade é o estímulo do progresso ou como trabalhar com gráficos de maneira interativa

A ociosidade é o estímulo do progresso ou como trabalhar com gráficos de maneira interativa

MetaTrader 4Exemplos | 8 fevereiro 2016, 12:13
407 0
Vladimir
Vladimir

Introdução

Em um fórum de falantes de inglês, encontrei uma descrição interessante da interpretação dos níveis Fibo. A ideia principal é a correção do impulso em movimento que se aproxima da região entre 38,2 и 61,8 %. Como assisti ao vídeo carregado lá e tentei desenhar os níveis Fibo nos gráficos sozinho, comecei a usar essa ferramenta em minha prática.

Não falarei das vantagens e desvantagens do sistema. Quero contar outra coisa aqui. Como sou preguiçoso por natureza (e creio não estar sozinho) e todos aqueles desenhos sem fim e outros desenhos de fibrilações para pesquisa que revertem a zona em um gráfico me entediaram, decidi colocar uma parte do trabalho no MQL4.

O principal problema que preciso resolver é a exibição automática das zonas com as mesmas cores no gráfico de preço das fibrilações desenhadas a mão. Não é segredo que a exibição de cor dos objetos melhora sua percepção vívida. Concordo, é muito mais fácil perceber um objeto em um gráfico que analisar uma variedade de linhas com os números especificados neles o tempo todo.

Processamento de coordenadas de objetos gráfico

Eu acho mesmo que a interatividade deve ser proporcionada durante o trabalho com um gráfico. Precisamos obter o desenho dos ícones do programa ou mesmo os desenhos gráficos adicionais para os desenhos feitos por um trader, e também precisamos de sons de acompanhamento no caso do cruzamento de linhas, por exemplo.

É necessário observar as vantagens do desenho manual.

  • Isso permite que o trader atribua ele mesmo um ponto de referência de desenho de objetos no gráfico.
  • Entradas de código suficientes são salvas, então o processador do computador carrega também.
  • Não é necessário programar uma lógica inicial de desenho de um objeto em um gráfico. A propósito, não é fácil atingir a lógica necessária programaticamente. Observe a quantidade de indicadores "ZigZag", por exemplo.

Aqui, eu gostaria de mostrar como implementar um indicador de intersecção de uma linha de tendência desenhada a mão.

Antes de tudo, vamos desenhar uma linha de tendência em um gráfico. Depois, encontrei essa linha na lista de objetos. Ela é chamada, por exemplo, então: Trendline 29344. Trendline é a descrição da própria linha, e 29344 é o número que é atribuído a ela pelo terminal do cliente MetaTrader 4.

Vamos renomear a Trendline no TrDup, ela será a linha da tendência superior.

Depois, repetimos as mesmas etapas de criação de outra linha de tendência e criamos a linha de tendência TrDdown usando o que mostraremos na tendência inferior.

(o indicador 1_01_Tr_Alert é ajustado em cooperação com essas linhas exatamente, os mesmos nomes são usados no indicador de linhas de tendência Demark desenhando TL_by_Demark_v6)

Agora, precisamos ler o número de objetos no gráfico usando MQL4.

int    obj_total=ObjectsTotal();

Conseguimos o número de objetos no gráfico na variável obj_total.

Agora, temos o número de objetos e resta escolher o objeto necessário para continuar o processamento adicional do algoritmo. Para fazer isso, usamos o operador típico do ciclo e encontramos os objetos "TrDup" e "TrDdown".

// Determine the Trend line object
int    obj_total=ObjectsTotal();
  string index;
  for(int i=0;i<obj_total;i++)
    {
     index=ObjectName(i);
      string substrTL_down = StringSubstr (index, 0, 7);
            if (substrTL_down == "TrDdown") string TrDLine_down=index;
      string substrTL_up = StringSubstr (index, 0, 5);
            if (substrTL_up == "TrDup") string TrDLine_up=index;
    
    }

Depois, atribuímos seus nomes às variáveis de string TrDLine_down e TrDLine_up.

Agora, temos as linhas de tendência identificadas que desenhamos manualmente no gráfico. A partir de agora, o indicador fisga as coordenadas das linhas e pode executar algumas ações com elas pelo algoritmo necessário.

Precisamos conseguir um sinal para o Close da primeira barra no candelabro abaixo do Close da segunda barra, fornecido pela linha de tendência entre os Closes das duas barras. Assim, recebemos um sinal de cruzamento da linha de tendência pelo preço.

if ((Close[1]>ObjectGetValueByShift(TrDLine, 1)) && (Close[2]<ObjectGetValueByShift(TrDLine, 2)))

Agora, precisamos apenas executar o Alerta e o arquivo de desenho ou de mídia de som, por exemplo, uma seta no gráfico próxima da barra do cruzamento da linha de tendência.

Esse método permite organizar facilmente a cooperação interativa com quaisquer objetos adicionados manualmente a um gráfico. Níveis Fibo, canais etc.

O indicador de exibição das zonas coloridas dos níveis Fibo publicado no fórum Onix pode servir de exemplo: http://www.onix-trade.net/forum/index.php?act=attach&type=post&id=27033&setlanguage=1&langid=ru.

E o complemento do nen indicador ZigZag para o desenho automático dos níveis Fibo pela última onda está aqui: http://www.onix-trade.net/forum/index.php?act=attach&type=post&id=27175&setlanguage=1&langid=ru.

Abaixo, forneço o código de indicador para a exibição complexa das zonas Fibo, indicação do cruzamento da linha de tendência e exibição do preço atual no gráfico usando o objeto "etiqueta de preço" colocado no gráfico.

 
//+------------------------------------------------------------------+
//|                                               1.012_InfoFibo.mq4 |
//|                                                                  |
//|                                                     b2w@narod.ru |
//+------------------------------------------------------------------+
#property copyright "http://www.fibook.ru"
#property link      "b2w@narod.ru"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters
extern bool Auto_Correct_Line = false;// Autocorrection of the last Fibo point
extern bool ClearRectangle = true;//Deleting of the squares while redrawing of the Fibo levels
extern bool TargetZone = true;//Drawing of the target zones
extern int count_Alert=3; //the number of iterations of Alert
double fibs[] = {-0.618, -0.382, -0.237, 0.0, 0.145, 0.382, 0.618, 0.855, 1.0, 1.237, 1.382, 1.618};
color fibsColor[] = {Maroon, Green, ForestGreen, Teal, SteelBlue, ,
                         SteelBlue, Teal, ForestGreen, Green, Maroon};
double Old_Price;
color FontColor=Black;
string TextAlert[7];   
int y=0,count_a=0;
double ftime;
double win_idx;
string NameFibs;
double Spread;
double ExtMapBufferUP[];
double ExtMapBufferDN[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
      Spread=(Ask-Bid);
 
//---- indicators
   SetIndexStyle(0,DRAW_ARROW,0,1);
   SetIndexArrow(0,233);
   SetIndexBuffer(0,ExtMapBufferUP);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexArrow(1,234);
   SetIndexBuffer(1,ExtMapBufferDN);
   SetIndexEmptyValue(1,0.0);
   
      return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
if(ftime!=Time[0]) count_a=0;
//  int    counted_bars=IndicatorCounted();
//----
// Determine if there are the Fibo levels or not
int    obj_total=ObjectsTotal();
  string index;
  for(int i=0;i<obj_total;i++)
    {
     index=ObjectName(i);
      string substr = StringSubstr(index, 0, 4);
            if (substr == "Fibo")  NameFibs=index;
      string substrTL = StringSubstr (index, 0, 9);
            if (substrTL == "Trendline") 
            string TrDLine=index;
      string substrPR = StringSubstr (index, 0, 5);
            if (substrPR == "Arrow") 
            string PR=index;
    }
 
 
// Paramaters of the trend line
      if (StringLen(TrDLine)>1)
         {
            if (ObjectGet(TrDLine, OBJPROP_PRICE1)>ObjectGet(TrDLine, OBJPROP_PRICE2))
               {
               if ((Close[1]>ObjectGetValueByShift(TrDLine, 1)) && 
                                        (Close[2]<ObjectGetValueByShift(TrDLine, 2)))
                 {
                  ExtMapBufferUP[1]=(Low[1]-5*Point); /*Alert (Symbol(),"  Trend UP enter");*/
                  c_alert(1);
                 }
               }
            else
            if (ObjectGet(TrDLine, OBJPROP_PRICE1)<ObjectGet(TrDLine, OBJPROP_PRICE2))
               {
               if ((Close[1]<ObjectGetValueByShift(TrDLine, 1)) && 
                                        (Close[2]>ObjectGetValueByShift(TrDLine, 2)))
                  {
                   ExtMapBufferDN[1]=(High[1]+5*Point);/*Alert (Symbol(),"  Trend DN enter");*/
                     c_alert(1);
                  }
               }         
         }
// The end of calculation of the trend line
if (StringLen(NameFibs) <1) return(-1);// If there are no Fibo levels, then we exit
// Determine where the Fibo levels are drawn
double pr1=ObjectGet(NameFibs, OBJPROP_PRICE1);// first price High
double pr1vrem=ObjectGet(NameFibs, OBJPROP_TIME1);// first time of the price
double pr2=ObjectGet(NameFibs,OBJPROP_PRICE2);// second price Low
double pr2vrem=ObjectGet(NameFibs, OBJPROP_TIME2);// second time of the price
double fibprop=(pr1-pr2);// The difference between HIGH and LOW
double Timeend=(Time[0]+(Period()*360)); // The right side by the time 
                                         // to display the objects on the chart
double TimeNachalo=(Time[0]+Period()*60);// The right side by the time 
                                         // to display the objects on the chart
//+++
            ObjectMove(PR, 0,Time[0], Bid);// The icon of the current price
//+++
// Parameters of the rectangle of the reverse zone..
double verx=(pr1-fibprop*0.382);
double niz=(pr2+fibprop*0.382);
string UP=DoubleToStr(verx+Spread,Digits); 
string DN=DoubleToStr(niz-Spread,Digits); 
  if (Auto_Correct_Line==true)
      {
         if (High[0]>pr1) ObjectMove(NameFibs, 0,Time[0], High[0]);
         if (Low[0]<pr2) ObjectMove(NameFibs, 1,Time[0], Low[0]);
      }
   if (ClearRectangle == true) ObjectsDeleteAll(0,OBJ_RECTANGLE);// Delete the RECTANGLES objects
// Draw the rectangles in the cycle
        for( y=0;y<11;y++)
      {
      ObjectCreate(("Kvadrat"+y), OBJ_RECTANGLE, 0, TimeNachalo,(pr2+fibprop*fibs[y]), 
                                                        Timeend,(pr2+fibprop*fibs[y+1]) );  
      ObjectSet(("Kvadrat"+y),OBJPROP_COLOR,fibsColor[y]);
      }
// The end of drawing
 
                                /* Drawing of the rectangle of the ZONE */
 ObjectCreate("Kvadrat", OBJ_RECTANGLE, 0, TimeNachalo, verx , Timeend , niz);  
 ObjectSet("Kvadrat",OBJPROP_BACK,false);
 
// The array of text data
       TextAlert[0] =   "Attention two targets "; 
       TextAlert[1] =   ("Order up * "+UP);
       TextAlert[2] =   ("Order down   * "+DN); 
       TextAlert[3] =   ("TARGET up 2  * "+(DoubleToStr(pr1+fibprop*0.618,Digits)));
       TextAlert[4] =   ("TARGET up 1  * "+(DoubleToStr(pr1+fibprop*0.382,Digits))); 
       TextAlert[5] =   ("TARGET down 1  * "+(DoubleToStr(pr2-fibprop*0.382,Digits))); 
       TextAlert[6] =   ("TARGET down 2  * "+(DoubleToStr(pr2-fibprop*0.618,Digits)));
double YDist[] = {20, 55, 80, 120, 150, 180, 210};
color TextAlertClr[] = {Yellow, Green, Red, Green, Green, Red, Red};
        
// Output to the screen the message about orders entering
              for(y=0;y<7;y++)
               ObjectDelete("TextAlerts"+y);
if (TargetZone == true)
      {
      if (Bid > niz && Bid < verx)
            for(y=0;y<7;y++)
                  {
                  ObjectCreate(("TextAlerts"+y), OBJ_LABEL, 0, 0, 0);  
                  ObjectSetText(("TextAlerts"+y),TextAlert[y], 12, "Times New Roman",TextAlertClr[y]);
                  ObjectSet(("TextAlerts"+y), OBJPROP_CORNER, 0);
                  ObjectSet(("TextAlerts"+y), OBJPROP_XDISTANCE, 10);
                  ObjectSet(("TextAlerts"+y), OBJPROP_YDISTANCE, YDist[y]);
                  }
      }
 
// The informer of the price and the currency name
ObjectDelete("Market_Price_Label101");
   ObjectCreate("Market_Text_Label101", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("Market_Text_Label101", (Symbol()+"  "+Period()), 16, "Times New Roman", Yellow);
   ObjectSet("Market_Text_Label101", OBJPROP_CORNER, 2);
   ObjectSet("Market_Text_Label101", OBJPROP_XDISTANCE, 5);
   ObjectSet("Market_Text_Label101", OBJPROP_YDISTANCE, 5);
 
  return(0);
  }
 
//+------------------------------------------------------------------+
 
void c_alert(int w)
 {
 ftime=Time[0];
 if(count_a<count_Alert)
 {count_a+=1;
 PlaySound("ku_ku.wav");
 }
 }
 return;


O cruzamento da linha de tendência no gráfico por hora GBPUSD é exibido na próxima figura.

Conclusão

A aplicação dessa abordagem de processamento dos dados recebidos é uma boa ajuda no trabalho do trader. Aliviar os olhos de alguém e libertá-lo da espera contínua pelo momento necessário para ativar ou fechar uma posição proporciona não só a diminuição de estresse emocional, mas também aumenta as chances de não perder os momentos necessários na negociação.

E para fazer tudo mais fácil para você, anexei o modelo do gráfico GBP que deve ser colocado na pasta \templates\.

O indicador deve ser colocado na pasta \experts\indicators\.

E o arquivo de som deve ser colocado na pasta \sounds\.

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

Arquivos anexados |
1_012_InfoFibo.mq4 (7.42 KB)
1_01_Tr_Alert.mq4 (3.51 KB)
add_files.zip (5.79 KB)
Método de determinação de erros no código por comentários Método de determinação de erros no código por comentários
O artigo descreve um método de busca de erros no código MQL4 que é baseado em comentários. Acredita-se que esse método é útil no caso de problemas ocorrendo durante a compilação causada pelos erros em um código razoavelmente grande.
Como escrever ZigZags rápidos que não são redesenhados Como escrever ZigZags rápidos que não são redesenhados
É proposta uma abordagem um tanto universal para escrever indicadores do tipo ZigZag. O método inclui uma parte significativa de ZigZags já descritos e permite que você crie novos de forma relativamente fácil.
Visão de Análise técnica no contexto de sistemas de controle automático (ACS) ou "Visão reversa" Visão de Análise técnica no contexto de sistemas de controle automático (ACS) ou "Visão reversa"
O artigo demonstra uma visão alternativa de análise técnica, que é baseada nos princípios da teoria de controle automático moderna e da própria teoria de análise técnica. O artigo é introdutório, representando a teoria com algumas aplicações práticas da mesma.
Passo a passo do HTML usando MQL4 Passo a passo do HTML usando MQL4
Hoje em dia, o HTML é um dos tipos de documentos amplamente disseminados. O terminal do cliente MetaTrader 4 permite que você salve declarações, testes e relatórios de otimização como arquivos .htm. Às vezes, é necessário conseguir as informações de tais arquivos em um programa MQL4. O artigo descreve uma das variações de como conseguir a estrutura de tag e os conteúdos de HTML.