Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1151

 
Maksym Mudrakov:

El error podría estar en el número de dígitos después del punto decimal:


Este no es el error, los datos no se calculan en el historial, pero desde el momento en que se crea el símbolo todo se calcula correctamente, sospecho que la función de cálculo del historial no está funcionando correctamente, es decir, es un error.
 
Buenas tardes, señores.

Tengo un problema de este tipo: acabo de empezar en MT5, estoy transfiriendo mis indicadores desde MT4 y me he encontrado con algunos problemas. Necesito utilizar iMA en una línea y obtener el valor de un índice específico. He visto mensajes en el foro y utilizar la función iMAGet (así como la similar iATRGet, etc.). Como veo, las funciones ya no funcionan, entonces esta pregunta: ¿cómo obtener con gracia un solo valor de iMA? He intentado utilizar las funciones anteriores para hacerlo:

NormalizeDouble(iMAGet(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW), shift), Digits())

Sé que es malo sin comprobarlo, pero tengo que portar código antiguo de MT4, no se me ocurría otra forma de hacerlo más sencillo (tengo decenas de asistentes, y todos trabajan en diferentes marcos temporales). No puedo inicializar los asistentes en oninit, porque el código tiene tres pasos anidados y no puedo llamar al asistente necesario sin problemas. Así que, en resumen, mi objetivo es convertir

Este :

NormalizeDouble(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW, shift), Digits())

En algo que funcione en MT5 sin gestos drásticos.

 
Olga Miakhovich:
Buenas tardes, señores.

Tengo un problema, acabo de empezar con MT5 y tengo problemas cuando transfiero mis indicadores desde MT4. Necesito utilizar iMA en una línea y obtener el valor de un índice específico. He visto mensajes en el foro y utilizar la función iMAGet (así como la similar iATRGet, etc.). Como veo, las funciones ya no funcionan, entonces esta pregunta: ¿cómo obtener con gracia un solo valor de iMA? He intentado utilizar las funciones anteriores para hacerlo:


Sé que es malo sin comprobarlo, pero tengo que portar código antiguo de MT4, no se me ocurría otra forma de hacerlo más sencillo (tengo decenas de asistentes, y todos trabajan en diferentes marcos temporales). No puedo inicializar los asistentes en oninit, porque el código tiene tres pasos anidados y no puedo llamar al asistente necesario sin problemas. Así que, en resumen, mi objetivo es convertir

Este :

En algo que funcione en MT5 sin gestos drásticos.

Consulte los ejemplos en kodobase, como éste:https://www.mql5.com/ru/code/27161

Básicamente: crear un indicador en OnInit()

handle_iMA_High=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                       Inp_MA_ma_method,PRICE_HIGH);
//--- if the handle is not created
   if(handle_iMA_High==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator (\"Price High\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }

A continuación, copie los elementos necesarios en el portapapeles y trabaje con ellos

if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());

https://www.mql5.com/ru/docs/series/copybuffer

 
Vitaly Muzichenko:

Busque ejemplos en el kodobase, por ejemplo, este:https://www.mql5.com/ru/code/27161

Básicamente: Crear el mango del indicador en OnInit()

A continuación, se copian los elementos necesarios en la memoria intermedia y se trabaja con ellos

https://www.mql5.com/ru/docs/series/copybuffer

Como ya he escrito, la inicialización en OnInit no me conviene. Tengo que trabajar con todos los timeframes simultáneamente, tengo que inicializar todas las máscaras en cada TF, y luego en el código, donde uso algún valor, hacer algo como esto:

if(timeframe = PERIOD_M5)
        CopyBuffer(handle_ma_m5, ...)
if(timeframe = PERIOD_M15)
        CopyBuffer(handle_ma_m15, ...)
...

Y así con cada llamada de cada pulsera. El código se convertirá en una confusa diarrea.

¿Y cada nuevo bar tendrá que actualizarlo de alguna manera?

¿Existe una función como CopyBuffer, pero que no copie un array, sino un valor por índice requerido?

 
Olga Miakhovich:

Como ya he escrito, la inicialización en OnInit no me conviene. Tengo que trabajar con todos los timeframes simultáneamente, tengo que inicializar todas las máscaras en cada TF, y luego en el código, donde uso algún valor, hacer algo como esto:

Y así con cada llamada de cada pulsera. El código se convertirá en una diarrea enmarañada.

¿Y cada nuevo bar necesitará alguna forma de actualizarlo?

¿Existe una función como CopyBuffer, pero que no copie un array, sino un único valor por el índice correcto?

Hacer un array de asas enOnInit() y trabajar con ellas.

CopyBuffer(...) en la función para su uso, introduciendo el indicador y el índice requerido de la matriz, y la función devolverá el precio

 
Vitaly Muzichenko:

Hacer un array de asas enOnInit() y trabajar con ellas.

CopyBuffer(...) en una función para facilitar su uso, pasar el mango del indicador y el índice requerido de la matriz, y la función devolverá el precio

aunque muy inconveniente)

 
Olga Miakhovich:

(aunque es incómodo))

Más bien incómodo ))))

 
Vitaly Muzichenko:

Hacer un array de asas enOnInit() y trabajar con ellas.

CopyBuffer(...) en la función para su uso, allí se alimenta el mango del indicador y el índice requerido de la matriz, y la función devolverá el precio

El otro problema de CopyBuffer es que requiere un buffer indicador para sí mismo. Tengo cien indicadores en total y se utilizan en los cálculos para obtener un único indicador. ¿Tengo que crear cien buffers para almacenar estos valores?

 
Olga Miakhovich:

Otro problema de CopyBuffer es que requiere necesariamente un buffer indicador para sí mismo. Tengo menos de cien indicadores en total y se utilizan en los cálculos para obtener un único indicador. ¿Tengo que crear cien buffers para almacenar estos valores?

Busque ejemplos de código en el CodeBase de scriptor - todo está allí.
En realidad, se puede calcular la MA para cualquier barra.
 
Necesito un ejemplo para resolver el siguiente problema: hay un indicador ¹1 en el gráfico con una docena de buffers gráficos (no wavecaps y otras cosas) y el indicador ¹2 del sótano debe tomar algunos buffers del indicador ¹1 y mostrarlos como hixogramas (no importa cómo) ya en el sótano. Gracias de antemano, para MT5.