CopyHigh, CopyLow, ArrayMaximum, ArrayMinimum - Ajuda - Primeiro EA

 

Olá pessoal.

Estou escrevendo meu primeiro EA e encontrei um problema que não estou conseguindo resolver.

O sinal para disparo de ordens ocorre quando as 12 últimas velas tem máxima <= a vela 13, e mínima >= a vela 13.

A lógica que eu encontrei foi pegar o preço máximo e o preço mínimo das últimas 13 velas e comparar o índice para checar se a máxima e a mínima são da mesma vela.

O problema é que quando uma vela mais recente faz máxima ou mínima igual à anterior, o índice é atualizado. (Exemplo figura anexa: Vela 5 e Vela 13 tem o mesmo preço mínimo)

Alguém sabe como posso resolver este problema?

Obrigado,
Guilherme S

input int TotalBars=13;
double Highest[],Lowest[];

void OnTick()
  {
   
   ArraySetAsSeries(Highest,true);
   CopyHigh(_Symbol,_Period,0,TotalBars,Highest);   
   int HighestIndex=ArrayMaximum(Highest,0,TotalBars);
   
   ArraySetAsSeries(Lowest,true);
   CopyLow(_Symbol,_Period,0,TotalBars,Lowest);
   int LowestIndex=ArrayMinimum(Lowest,0,TotalBars);
   
   bool Signal=false;
   
   if(HighestIndex==LowestIndex && HighestIndex>=(TotalBars-1))
      {
         Signal=true;
         Comment("Signal TRUE");
      }
      
   else
      {
         Comment("Signal FALSE");
      }

   Print("Highest Price: ",Highest[HighestIndex],"[",HighestIndex,"]  Lowest Price: ",Lowest[LowestIndex],"[",LowestIndex,"]");

  }
Arquivos anexados:
candles.jpg  44 kb
 
guisantos23:

Olá pessoal.

Estou escrevendo meu primeiro EA e encontrei um problema que não estou conseguindo resolver.

O sinal para disparo de ordens ocorre quando as 12 últimas velas tem máxima <= a vela 13, e mínima >= a vela 13.

A lógica que eu encontrei foi pegar o preço máximo e o preço mínimo das últimas 13 velas e comparar o índice para checar se a máxima e a mínima são da mesma vela.

O problema é que quando uma vela mais recente faz máxima ou mínima igual à anterior, o índice é atualizado. (Exemplo figura anexa: Vela 5 e Vela 13 tem o mesmo preço mínimo)

Alguém sabe como posso resolver este problema?

Obrigado,
Guilherme S

Olá guisantos23,

algumas considerações sobre sua dúvida:

1) se você quer encontrar a máxima/mínima dos últimos 13 candles, incluindo o atual, você deve usar TotalBars=14, e não 13... Logo, a barra atual (no caso, 0, pois você usou ArraySetAsSeries como true) deve ser incluída na contagem, uma vez que você usa a posição inicial 0 dentro de CopyHigh e CopyLow;

2) como você já deve ter percebido, tanto ArrayMaximum quanto ArrayMinimum retornam a máxima/mínima mais recente, logo, no caso de dois preços iguais você sempre terá o índice daquela barra mais recente;

3) ao invés de trabalhar com a posição das máximas e mínimas, porque não trabalhar diretamente com o preço? Um simples for-loop poderia, nesse caso, ser utilizado para checar a máxima/mínima dos últimos "n" preços e comparar essa informação com o preço obtido no candle 13 de sua contagem ...

Abraços,
Malacarne 

 
Malacarne:

Olá guisantos23,

algumas considerações sobre sua dúvida:

1) se você quer encontrar a máxima/mínima dos últimos 13 candles, incluindo o atual, você deve usar TotalBars=14, e não 13... Logo, a barra atual (no caso, 0, pois você usou ArraySetAsSeries como true) deve ser incluída na contagem, uma vez que você usa a posição inicial 0 dentro de CopyHigh e CopyLow;

2) como você já deve ter percebido, tanto ArrayMaximum quanto ArrayMinimum retornam a máxima/mínima mais recente, logo, no caso de dois preços iguais você sempre terá o índice daquela barra mais recente;

3) ao invés de trabalhar com a posição das máximas e mínimas, porque não trabalhar diretamente com o preço? Um simples for-loop poderia, nesse caso, ser utilizado para checar a máxima/mínima dos últimos "n" preços e comparar essa informação com o preço obtido no candle 13 de sua contagem ...

Abraços,
Malacarne 

Olá Malacarne,

Obrigado pela rápida resposta. Vou tentar escrever novamente da maneira que você sugeriu.

 Abraços,

Guilherme S 

 
Rodrigo Malacarne:

Olá guisantos23,

algumas considerações sobre sua dúvida:

1) se você quer encontrar a máxima/mínima dos últimos 13 candles, incluindo o atual, você deve usar TotalBars=14, e não 13... Logo, a barra atual (no caso, 0, pois você usou ArraySetAsSeries como true) deve ser incluída na contagem, uma vez que você usa a posição inicial 0 dentro de CopyHigh e CopyLow;

2) como você já deve ter percebido, tanto ArrayMaximum quanto ArrayMinimum retornam a máxima/mínima mais recente, logo, no caso de dois preços iguais você sempre terá o índice daquela barra mais recente;

3) ao invés de trabalhar com a posição das máximas e mínimas, porque não trabalhar diretamente com o preço? Um simples for-loop poderia, nesse caso, ser utilizado para checar a máxima/mínima dos últimos "n" preços e comparar essa informação com o preço obtido no candle 13 de sua contagem ...

Abraços,
Malacarne 


Bom dia,

Cheguei a este fórum devido a mesma necessidade que o Gui Santos, pois, Também sou aprendiz iniciante em programação, fiz um código seguindo a 3 sugestão do Malacarne.

este código está correto?

codigo


MqlRates mrate[];  
//COPIANDO INFORMAÇÕES DAS BARRAS ===============================================================      
    p_cierre = mrate[1].close;
    p_low    = mrate[1].low;
    p_high   = mrate[1].high;
    p_open   = mrate[1].open;
    for(int i =1; i<totalbarras;i++)
       {
       max = mrate[i].high > mrate[i-1].high ? mrate[i].high : mrate[i-1].high;
       }
    for(int i =1; i<totalbarras;i++)
       {
       min = mrate[i].low < mrate[i-1].low ? mrate[i].low : mrate[i-1].low;
       }
 
Marcos Gabriel:

Bom dia,

Cheguei a este fórum devido a mesma necessidade que o Gui Santos, pois, Também sou aprendiz iniciante em programação, fiz um código seguindo a 3 sugestão do Malacarne.

este código está correto?

Olá Marcos Gabriel,

A princípio me parece que está correto!

Abraços,
Malacarne

Razão: