Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 771

 
Igor Zakharov:

Sólo que no los de calendario. Barras de 30 días hacia atrás (domingos, sábados)

A juzgar por la función sin el parámetro de desplazamiento que está haciendo en el 5 y usted hizo la pregunta en el 4 :)

Sí, 30 bares son 21 días laborables si se cuenta desde ayer. (24.02.2019 - 25.01.2019)

Tengo

Para el mes, tamaño medio de las velas: 598

Para una semana, tamaño medio de la vela: 519

Y iATR() da números de diez dígitos...

Así que todavía no entiendo cómo usarlo.

 
Alexander Layzerevich:

Y iATR() produce números de diez dígitos...

Por lo general, fracciones decimales (es decir, como el precio. Para convertir a puntos hay que dividir por _Punto).

Véase la ilustración: euro/dólar a partir de hoy - 560 pips en base diaria para el mes.


 
Igor Zakharov:

Por lo general, fracciones decimales (es decir, como el precio. Para convertir a puntos, dividir por _Punto).

Véase la ilustración: euro/dólar a partir de hoy - 560 pips en base diaria durante un mes.


Lo he comprobado en MQL4:

iATR

 
Igor Zakharov:

Por lo general, fracciones decimales (es decir, como el precio. Para convertir a puntos, dividir por _Punto).

Véase la ilustración: euro/dólar a partir de hoy - 560 pips en base diaria durante un mes.


Lo he comprobado en MQL5. He escrito el siguiente código para comprobarlo:

//************************************************************************************************/
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);
}   
//************************************************************************************************/

Esto es lo que muestra:

iATR

Es decir, muestra un valor, pero muestra otro diferente...

 
Alexander Layzerevich:

Lo he comprobado en MQL5. Escribí este código para comprobarlo:

Esto es lo que produce:

Es decir, muestra un valor, pero muestra otro diferente...

En MQL5 esta forma de trabajar con el indicador no es adecuada

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

Primero tienes que crear un handle, y ya lo has hecho, y sólo después puedes obtener valoresdel 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:

En MQL5 esta forma de trabajar con el indicador no es adecuada

Primero tienes que crear un handle, y eso es lo que has hecho ahora, y después puedes obtener valoresdel CopyBuffer

Gracias, lo tendré en cuenta y reescribiré el código.

Solo lo estoy escribiendo en MT4 y usando #include <MT4Orders.mqh> para probarlo en MT5.

Tal vez la biblioteca no soporta Indicadores.

 
Alexander Layzerevich:

Gracias, lo tendré en cuenta y reescribiré el código.

Simplemente lo escribo en MT4 y uso #include <MT4Orders.mqh> para probarlo en MT5.

Puede que la biblioteca no admita Indicadores.

Sí, sólo funciones comerciales.

 
Alexander Layzerevich:

Gracias, lo tendré en cuenta y reescribiré el código.

Simplemente lo escribo en MT4 y uso #include <MT4Orders.mqh> para probarlo en MT5.

Puede que la biblioteca no admita Indicadores.

Es una forma muy rápida de combinar dos plataformas, funciona, pero es mejor no hacerlo en 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
 }

Y aplicar el indicador de la misma manera que en mql4

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

Esta es una opción muy rápida para combinar las dos plataformas, funciona, pero es mejor no hacerlo en mql5

Y aplicar el indicador de la misma manera que en mql4

Muchas gracias por el código.

Ha funcionado:

//************************************************************************************************/
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
 }
//************************************************************************************************/

Ahora tengo los datos promediados al principio del inicio del EA. Y estos datos se recalculan cada vez que accedo a la función.

Según tengo entendido, para limitar las llamadas, tengo que hacer un registro en el buffer con los datos calculados.

Por lo tanto, tenemos que establecer la condición para el recálculo. Los "lunes" y si no hay nada en el buffer.

Es decir, declarar la variable buferStep = -1; y enOnTick() si buferStep <0 o "Monday" entonces recalcular.

Aquí también estoy atascado, ¿cómo puede el Robot declarar que hoy es "lunes"?

 
Alexander Layzerevich:

Muchas gracias por el código.

Funcionó así:

Ahora tengo los datos promediados al inicio del EA. Y estos datos se recalculan cada vez que se llama a la función.

Según tengo entendido, para limitar las llamadas, tengo que hacer un registro en el buffer con los datos calculados.

Por lo tanto, tenemos que establecer la condición para el recálculo. Los "lunes" y si no hay nada en el buffer.

Es decir, declarar la variable buferStep = -1; y enOnTick() si buferStep <0 o "Monday" entonces recalcular.

Aquí también tengo un problema, ¿cómo puede Robot declarar que hoy es "lunes"?

No quiero usar el lunes, sólo quiero el número de días atrás. Y lo obtendría en cada nueva barra para no cargar el Asesor Experto con cálculos en cada tick.

Razón de la queja: