Discussão do artigo "Exemplo de indicador que constrói uma linha de suporte e resistência"

 

Novo artigo Exemplo de indicador que constrói uma linha de suporte e resistência foi publicado:

O artigo mostra a implementação de um indicador para construção de linhas de suporte e de resistência com base em condições formais. Você não só poderá aplicar o indicador, mas também entenderá quão fácil é realizá-lo. Agora você será capaz de formular as condições para desenhar linhas alterando o código do indicador ligeiramente para atender às suas necessidades.

Quais são os critérios que aplicaremos à seleção do segundo ponto? Em primeiro lugar, podemos tomar o segundo fractal, que vai depois do nosso primeiro ponto, uma vez que isso faz com que se mostre a linha mais próxima. Mas podemos usar outras regras de seleção, por exemplo, o ponto mais alto no gráfico, a linha através da qual o preço ainda não cruzou para cima até a linha de resistência (ou o ponto mais baixo no gráfico, a linha através da qual o preço ainda não cruzou para baixo até a linha de suporte). Vocês podem definir suas regras para a seleção do segundo ponto. Nós consideramos o segundo fractal mais próximo, segundo ele construímos as linhas de suporte e resistência.  

seleção de pontos de construção de linhas

Autor: Andrey Kisselyov

 

Você pode desenhar níveis inclinados do outro lado?

Ou seja, desenhar linhas de suporte e resistência não de baixo para cima quando estiver subindo, mas, ao contrário, de cima para baixo?

 
Alexandr Gavrilin:

Você pode desenhar níveis inclinados do outro lado?

Ou seja, desenhar linhas de suporte e resistência não a partir da parte inferior quando estiver subindo, mas, ao contrário, a partir da parte superior?

Boa tarde.
Sim, claro, não é tão difícil quanto parece.
 

Pessoal experiente, por favor, me digam como encontrar a máxima alta e a mínima para o número definido de barras em MQL5

Por exemplo, no mql4 é fácil fazer isso.

_High   = NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar,0)), Digits); // calcular o preço máximo mais alto para o último CanalBar 
_Low    = NormalizeDouble(iLow (Symb,PERIOD_CURRENT,iLowest (Symb,PERIOD_CURRENT,MODE_LOW, CanalBar,0)), Digits); // calcular o preço mínimo mais baixo para o último CanalBar
   

Aqui, simplesmente pegamos o que encontramos e desenhamos uma linha no gráfico.

Mas como encontrar o máximo e o mínimo para o número de barras em mql5 é um quebra-cabeça. iHighest e iLowest

Pelo que entendi, não há um entendimento simples aqui.

Ficarei grato se puder me ajudar e, se houver um código de exemplo, seria ótimo em geral.

Obrigado.

 
Konstantin Seredkin:

Pessoal experiente, por favor, me digam como encontrar a máxima alta e a mínima para o número definido de barras em MQL5

Por exemplo, no mql4 é fácil fazer isso.

Aqui, simplesmente pegamos o que encontramos e desenhamos uma linha no gráfico.

Mas como encontrar o máximo e o mínimo para o número de barras em mql5 é um quebra-cabeça. iHighest e iLowest

Pelo que entendi, não há um entendimento simples aqui.

Ficarei grato se puder me ajudar, e se houver um exemplo de código, seria ótimo em geral.


_High   = NormalizeDouble(high[ArrayMaximum(high, 0, CanalBar)], Digits); // calcular o preço máximo mais alto para o último CanalBar 

onde high é uma matriz de preços de barras altas

se for um indicador, ele virá para você em OnCalculation,
se estiver no Expert Advisor, solicite-o via CopyHigh.

Não se esqueça do ArraySetAsSeries true


Obrigado.

 

SPS

 
Konstantin Seredkin:

Pessoal experiente, por favor, me digam como encontrar a máxima alta e a mínima para o número definido de barras em MQL5

Por exemplo, no mql4 é fácil fazer isso.

Aqui, simplesmente pegamos o que encontramos e desenhamos uma linha no gráfico.

Mas como encontrar o máximo e o mínimo para o número de barras em mql5 é um quebra-cabeça. iHighest e iLowest

Pelo que entendi, não há um entendimento simples aqui.

Ficarei grato se puder me ajudar, e se houver um exemplo de código, seria ótimo em geral

Obrigado.

Em primeiro lugar, no seu código, eu o simplificaria, com base no fato de que você está solicitando a máxima no gráfico atual. Darei um exemplo para vértices, mas para mínimos tudo é quase igual.
Você confunde comandos de consulta geral a todos os dados com comandos de consulta aos dados atuais, o que, nesse caso, é desnecessário.
//para dados atuais (o acesso aos dados atuais de qualquer EA ou indicador) será
   _High=NormalizeDouble(High[iHighest(Symb,_Period,MODE_HIGH,CanalBar)],_Digits);

//para dados gerais (acesso de qualquer EA ou indicador a qualquer dado no banco de dados) será 
   _High=NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar)),MarketInfo(Symb,MODE_DIGITS));

E agora sobre o código no mt5.

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(Symb,PERIOD_CURRENT,0,CanalBar,high);
   _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(Symb,SYMBOL_DIGITS));
   ArrayFree(high);

Nesse caso, o acesso a qualquer dado no banco de dados para qualquer símbolo de qualquer indicador ou EA é fornecido.
não há necessidade de se preocupar com a direção da indexação, pois precisamos apenas do máximo, não importa onde ele esteja localizado.
o comando ArrayMaximum() (de acordo com a ajuda) retorna o valor necessário levando em conta a direção da indexação da matriz.

c/u.

P.S. Eu não normalizaria o preço, pois isso é desnecessário, a menos, é claro, que você esteja criando um pipsmith que capture 1 ponto de uma negociação.

 
Andrey Kisselyov:
Primeiramente, no seu código, eu o simplificaria com base no fato de que você solicita a máxima no gráfico atual. Darei um exemplo para os topos; para as baixas, tudo é quase igual.
Você confunde comandos de solicitação geral de todos os dados com comandos de solicitação dos dados atuais, o que, nesse caso, é desnecessário.

e agora sobre o código no mt5.

Nesse caso, o acesso a qualquer dado no banco de dados para qualquer símbolo de qualquer indicador ou EA é fornecido.
não há necessidade de se preocupar com a direção da indexação, pois precisamos apenas do máximo, não importa onde ele esteja localizado.
O comando ArrayMaximum() (de acordo com a ajuda) retorna o valor necessário levando em conta a direção da indexação da matriz.

c/u.

P.S. Eu não normalizaria o preço, isso é desnecessário, a menos que você esteja criando um pipsmith que capture 1 ponto de uma negociação.


Ótimo, está tudo resolvido

Agora temos outra pergunta

A implementação é a seguinte

input int CanalBar  = 200; // Número de barras a serem calculadas

//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
void OnTick()
  {

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(_Symbol,PERIOD_CURRENT,0,CanalBar,high);
   double _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
   ArrayFree(high);
   
   
   HLineCreate(0,"HIGH",0,_High,"",clrBlue,1,1); // Desenhe uma linha no gráfico.

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Cria uma linha horizontal|
//+------------------------------------------------------------------+
//| Baseado em:|
//| Guia de Referência MQL5 / Constantes padrão, enums e estruturas|
//| / Constantes de objeto / Tipos de objeto / OBJ_HLINE |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // ID do gráfico
                 const string          name="HLine",      // nome da linha
                 const int             sub_window=0,      // número da subjanela
                 double                price=0,           // preço da linha
                 const string          toolTip="\n",      // texto da dica de ferramenta
                 const color           clr=clrRed,        // cor da linha
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha
                 const int             line_width=1,      // espessura da linha
                 const bool            back=false,        // em segundo plano
                 const bool            selection=true,    // selecione para mover
                 const bool            hidden=true,       // oculto na lista de objetos
                 const long            z_order=0,         // prioridade de clique do mouse
                 const int             timeFrames=OBJ_ALL_PERIODS)//exibe o objeto em diferentes períodos
  {
//--- redefinir o valor do erro
   ResetLastError();
//--- criar uma linha horizontal
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(LINE_NUMBER,__FUNCTION__,
            ": failed to create a horizontal line! Error code = ",GetLastError());
      return(false);
     }
//--- definir o texto da dica de ferramenta
   ObSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- definir a cor da linha 
   ObSetIntegerColor(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de exibição da linha
   ObSetIntegerLineStyle(chart_ID,name,style);
//--- definir a espessura da linha
   ObSetIntegerInt(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- exibição em primeiro plano (falso) ou em segundo plano (verdadeiro)
   ObSetIntegerBool(chart_ID,name,OBJPROP_BACK,back);
//--- ativar (true) ou desativar (false) o modo de movimento da linha do mouse
//--- ao criar um objeto gráfico com a função ObjectCreate, por padrão o objeto
//--- não pode ser selecionado e movido. Dentro desse método, o parâmetro de seleção
//--- o padrão é true, o que permite selecionar e mover esse objeto
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objetos
   ObSetIntegerBool(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento de clique do mouse no gráfico
   ObSetIntegerLong(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- definição da visibilidade do objeto em diferentes períodos de tempo 
   ObSetIntegerInt(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
//--- execução bem-sucedida
   return(true);
  }


Ao iniciar o teste visual, a linha no gráfico é desenhada, mas fica parada, a linha não altera seus valores no decorrer do teste. No mql5, é necessário dar aos cálculos um chute adicional no traseiro de alguma forma?

 
Konstantin Seredkin:

Muito bem, já está tudo resolvido.

Agora, aqui está outra pergunta

A implementação é a seguinte


Quando você inicia o teste visual, a linha no gráfico é desenhada, mas fica parada, sua linha de valores não muda durante o teste, no mql5 você precisa adicionalmente, de alguma forma, dar um chute no traseiro dos cálculos?

Tente isso:

void HLineCreate(const long            chart_ID=0,        // ID do gráfico
                 const string          name="HLine",      // nome da linha
                 const int             sub_window=0,      // número da subjanela
                 double                price=0,           // preço da linha
                 const string          toolTip="\n",      // texto da dica de ferramenta
                 const color           clr=clrRed,        // cor da linha
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha
                 const int             line_width=1,      // espessura da linha
                 const bool            back=false,        // em segundo plano
                 const bool            selection=true,    // selecione para mover
                 const bool            hidden=true,       // oculto na lista de objetos
                 const long            z_order=0,         // prioridade de clique do mouse
                 const int             timeFrames=OBJ_ALL_PERIODS)//exibe o objeto em diferentes períodos
  {
  if(ObjectFind(chart_ID, name)<0) {
//--- criar uma linha horizontal
   ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price);
//--- definir o texto da dica de ferramenta
   ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- definir a cor da linha 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de exibição da linha
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a espessura da linha
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- exibição em primeiro plano (falso) ou em segundo plano (verdadeiro)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- ativar (true) ou desativar (false) o modo de movimento da linha do mouse
//--- ao criar um objeto gráfico com a função ObjectCreate, por padrão o objeto
//--- não pode ser selecionado e movido. Dentro desse método, o parâmetro de seleção
//--- o padrão é true, o que permite selecionar e mover esse objeto
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objetos
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento de clique do mouse no gráfico
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- definição da visibilidade do objeto em diferentes períodos de tempo 
   ObjectSetInteger(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
     }
//--- definir o método de vinculação
   ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
  }
 
Konstantin Seredkin:

Tudo bem, isso já foi resolvido.

Agora, aqui está outra pergunta

A implementação é a seguinte


Quando você inicia o teste visual, a linha no gráfico é desenhada, mas fica parada, sua linha de valores não muda durante o teste, no mql5 isso precisa adicionalmente, de alguma forma, dar aos cálculos um chute no traseiro?

comando
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
se já houver um objeto com esse nome não está implementado, como consequência, seu preço na linha existente não será alterado.
como lhe foi dito corretamente, isso deve ser feito por comando.

ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
E mais uma observação, tente não se envolver em classes e outras sabedorias, se houver a possibilidade de escrever de forma mais simples, usando comandos de acesso direto.
aplique apenas os comandos que forem necessários, não é preciso passar por todos os parâmetros da linha a cada acesso, pois você precisa alterar apenas o preço da linha.

com todo o respeito.
 

Obrigado, pessoal, já está tudo resolvido.