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

 
Igor Zakharov:

Apenas não as do calendário. Barras de 30 dias para trás (domingos, sábados)

A julgar pela função sem o parâmetro de deslocamento que você está fazendo em 5 e você fez a pergunta em 4 :)

Sim, 30 barras são 21 dias úteis, se você contar a partir de ontem. (24.02.2019 - 25.01.2019)

Eu tenho

Para o mês tamanho médio das velas : 598

Por uma semana, o tamanho médio das velas: 519

E o iATR() dá números de dez dígitos.

Portanto, ainda não entendo como utilizá-la.

 
Alexander Layzerevich:

E o iATR() produz números de dez dígitos.

Normalmente, frações decimais (ou seja, como o preço. Para converter em pontos você precisa dividir por _Ponto).

Veja ilustração: euro/dólar a partir de hoje - 560 pips em uma base diária para o mês.


 
Igor Zakharov:

Normalmente, frações decimais (ou seja, como o preço. Para converter em pontos, dividir por _Ponto).

Veja a ilustração: euro/dólar a partir de hoje - 560 pips por dia durante um mês.


Eu verifiquei na MQL4:

iATR

 
Igor Zakharov:

Normalmente, frações decimais (ou seja, como o preço. Para converter em pontos, dividir por _Ponto).

Veja ilustração: euro/dólar a partir de hoje - 560 pips por dia durante um mês.


Eu verifiquei na MQL5. Eu escrevi o seguinte código para verificá-lo:

//************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);
   int Awerage7 = (iATR (Symbol(),PERIOD_D1, 5));
   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2),0);
   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

Isto é o que mostra:

iATR

Isto é, mostra um valor, mas mostra um valor diferente.

 
Alexander Layzerevich:

Foi verificado em MQL5. Escreveu este código para verificá-lo:

Isto é o que ela produz:

Isto é, mostra um valor, mas mostra um valor diferente.

Na MQL5, tal construção de trabalhar com o indicador não é adequada

   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);

Primeiro você tem que criar um cabo, e já o fez, e só depois disso você pode obter valores como CopyBuffer

// этот код в Init()
      int handleATR=iATR(Symbol(),PERIOD_D1,21);
      if(handleATR==INVALID_HANDLE) return;

// это уже в сам советник/индикатор: OnTick()
      double hATR[];
      CopyBuffer(handleATR,0,0,1,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko:

Na MQL5, tal construção de trabalhar com o indicador não é adequada

Primeiro você tem que criar um cabo, e isso é o que você fez agora, e depois disso você pode obter valores como CopyBuffer

Obrigado, vou levá-lo em conta e reescrever o código.

Estou apenas escrevendo-o no MT4 e usando #include <MT4Orders.mqh> para testá-lo no MT5.

Talvez a biblioteca não suporte os Indicadores.

 
Alexander Layzerevich:

Obrigado, vou levá-lo em conta e reescrever o código.

Eu apenas o escrevo no MT4 e uso #include <MT4Orders.mqh> para testá-lo no MT5.

Talvez a biblioteca não suporte os Indicadores.

Sim, somente funções comerciais.

 
Alexander Layzerevich:

Obrigado, vou levá-lo em conta e reescrever o código.

Eu apenas o escrevo no MT4 e uso #include <MT4Orders.mqh> para testá-lo no MT5.

Talvez a biblioteca não suporte os Indicadores.

É uma maneira muito rápida de combinar duas plataformas, funciona, mas é melhor não o fazer em mql5

double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }

E aplicar o indicador da mesma forma que em mql4

double atr=ATR(Symbol(),PERIOD_D1, 30);
 
Vitaly Muzichenko:

Esta é uma opção muito rápida para combinar as duas plataformas, funciona, mas é melhor não o fazer em mql5

E aplicar o indicador da mesma forma que em mql4

Muito obrigado pelo código.

Funcionou:

//************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = (int)((ATR(Symbol(),PERIOD_D1,21,1))/Point());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = (int)((ATR(Symbol(),PERIOD_D1,5,1))/Point());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2/6),0);
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
//************************************************************************************************/

Agora eu obtive a média dos dados no início do início da EA. E estes dados são recalculados cada vez que eu acesso a função.

Entendo que, para limitar a chamada, preciso fazer um registro buffer com os dados calculados.

Portanto, precisamos definir a condição para o recálculo. Nas "segundas-feiras" e se não houver nada no buffer.

Ou seja, declare variável buferStep = -1; e emOnTick() se buferStep <0 ou "Monday", então recalcule.

Aqui novamente estou preso, como o Robô pode declarar que hoje é "segunda-feira" ?

 
Alexander Layzerevich:

Muito obrigado pelo código.

Funcionou assim:

Agora eu tenho os dados médios no início da EA. E estes dados são recalculados cada vez que a função é chamada.

Pelo que entendi, para limitar a chamada, preciso fazer um registro buffer com os dados calculados.

Portanto, precisamos definir a condição para o recálculo. Nas "segundas-feiras" e se não houver nada no buffer.

Ou seja, declare variável buferStep = -1; e emOnTick() se buferStep <0 ou "Monday", então recalcule.

Aqui novamente tenho um engate, como pode o Robô declarar que hoje é "segunda-feira" ?

Eu não quero usar segunda-feira, eu só quero o número de dias atrás. E eu o obteria em cada nova barra para não carregar o Expert Advisor com cálculos em cada carrapato.

Razão: