Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 242

 
Youri Lazurenko:

Eu não consigo resolver um problema aparentemente simples. Em algum lugar da tabela, havia uma passagem de MA. Encontramos um bar após a travessia. Como calcular o número de barras dessa barra para a barra atual?

O número daquele bar em particular. Não?
 
Youri Lazurenko:

Eu não consigo resolver um problema aparentemente simples. Em algum lugar da tabela, havia uma passagem de MA. Encontramos um bar após a travessia. Como calcular o número de barras desta barra para a barra atual?


Parece estar feito (pelo menos o comentário na tela está correto). Graças ao"número de barras", acho que encontrei a solução. Eu uso a função iTime para determinar a data e o horário da barra necessária. O esboço é parecido com este:

nulo OnTick()

{

int nBarsUp, nBarsDn;

datetime date_dn = iTime(NULL, 0, IntersectionDN());

datetime date_up = iTime(NULL, 0, IntersectionUp());

datetime date_1 = iTime(NULL, 0, 1);

nBarsUp = Bars(Symbol(), 0, date_up, date_1);

nBarsDn = Bars(Symbol(), 0, date_dn, date_1);

Comentário ("Número de barras longas: " + nBarsUp + "\n" + "Número de barras curtas: " + nBarsUp + "\n")

"Número de barras curtas:" + nBarsDn);

}

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

IntersecçãoDN()

{

for(int i = 0; i < 36; i++)

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

retorno(i-1);

}

retorno(-1);

}

intersectionUp()

{

for(int i = 0; i < 36; i++)

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

retorno(i-1);

}

retorno(-1);

}

 
Youri Lazurenko:

Parece ter funcionado (pelo menos o comentário na tela está correto). Graças ao"número de barras", acho que encontrei uma solução. Usei a função iTime para determinar a data/hora da barra desejada. O esboço é parecido com este:

void OnTick()

{
   int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
   
   Comment("Количество длинных баров: " + nBarsUp + "\n"+
           "Количество коротких баров: " + nBarsDn);     
}

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

int IntersectionDN()

{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   }  
   return(-1);
}

int IntersectionUp()
{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   } 
   return(-1);  

}

Você está procurando um crossover no laço. E a partir da barra zero no fundo da história. Assim, sua função IntersectionXX() retorna o número da barra.

Para que serve tudo isso?

int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
 
Artyom Trishkin:

Você está procurando um crossover no laço. E desde a barra zero até o fundo da história. Então IntersectionXX() retorna o número da barra.

Para que serve tudo isso?


O número do bar, sim. Mas eu preciso saber o número de barras - desde esta barra no fundo da história até a barra zero. Em resumo, eu preciso do ângulo da inclinação da barra do MA. Mas como não pode ser calculado como me parece (preço na linha vertical e barras na linha horizontal colocadas a alguma distância uma da outra - são valores incompatíveis). Era uma vez uma sugestão sobre o fórum para introduzir um coeficiente - a diferença de preço dividida pelo número de barras. A idéia me parece razoável. Quero colocá-lo em prática, mas como eu mesmo sou um boneco, tento encontrar algo e experimentá-lo eu mesmo por tentativa e erro.

P.S. Como inserir código na MQL4 (como o seu, não como o meu)?
 

Alguém pode aconselhar como lidar com este problema?


Depois de mudar o TF, o painel é empenado

 
Youri Lazurenko:

O número de barras, sim. Mas eu preciso saber o número de barras - desde esta alguma barra no verso da história até a 0ª barra. Em resumo, eu preciso do ângulo da barra do MA. Mas como não pode ser calculado, me parece (preço na linha vertical e barras na linha horizontal colocadas a alguma distância uma da outra - são valores incompatíveis). Era uma vez uma sugestão sobre o fórum para introduzir um coeficiente - a diferença de preço dividida pelo número de barras. A idéia me parece razoável. Quero colocá-lo em prática, mas como um boneco eu mesmo, tento encontrar algo e me experimento por tentativa e erro.

P.S. Como inserir código na MQL4 (da maneira que você o tem, não da maneira que eu o tenho)?
Se esta é a décima barra, como posso saber a diferença entre a décima e a barra zero? 10-0=10
E para que serve a subtração?

 

Olá! Os doisnúmerosmenosq e wsão comparados incorretamente, quando são iguais, o se operador pensa que um é maior que o outro. Qual é o erro? Quando q = -0,0002 e w é também -0,0002, res12=falso, por quê?

 

Olá! Os doisnúmerosmenosq e wsão comparados incorretamente, quando são iguais, o se operador pensa que um é maior que o outro. Qual é o erro? Quando q = -0,0002 e w é também -0,0002, res12=falso, por quê?

static bool res12=true;

start()
{   

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред

   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}
 
Jenya77769:

Olá! Os doisnúmerosmenosq e wsão comparados incorretamente, quando são iguais, o se operador pensa que um é maior que o outro. Qual é o erro? Quando q = -0,0002 e w é também -0,0002, res12=falso, por quê?


Acho que precisamos normalizar e é isso, não se pode comparar as duplas sem normalização.

se NormalizeDuplo (q<=w)
 
Vyacheslav Kornev:

Acho que preciso normalizar e é isso, pois não é possível comparar o dobro entre eles sem a normalização.


Obrigado, funcionou, mas eu normalizei q e w separadamente!

if(NormalizeDouble(q,4)> NormalizeDouble(q,4))