AYUDA !!!! convertir un indicador de MT4 a MT5. - página 5

 

Hola, estoyintentando convertir un indicador de mql4 a mql5. Básicamente necesito una notificación sonora en la IMF cuando aparece una barra roja. ¿Cómo puedo adjuntar este código de sonido ahora al nuevo mfi?

Adjunto un ejemplo de la antigua versión de trabajo:

Archivos adjuntos:
 

Dime la forma correcta, esto es un cálculo de Heiken Ashi

Es un recorte de la norma

for(i=pos/*pos=1*/; i<rates_total ;i++)
  {
   haOpen=(ExtOpenBuffer0[i-1]+ExtCloseBuffer0[i-1])/2; // <<<
   haClose=(Open[i]+High[i]+Low[i]+Close[i])/4;
   haHigh=MathMax(High[i],MathMax(haOpen,haClose));
   haLow=MathMin(Low[i],MathMin(haOpen,haClose));

La pregunta que se plantea es la siguiente: si Open debería buscarse por la barra anterior, ¿por qué se busca por la siguiente barra del código?

Probablemente sea correcto así, o estoy entendiendo algo mal:

haOpen=(ExtOpenBuffer0[i+1]+ExtCloseBuffer0[i+1])/2;
Gracias.
 
Vitaly Muzichenko:

Dime la forma correcta, esto es un cálculo de Heiken Ashi

Es un recorte de la norma

for(i=pos/*pos=1*/; i<rates_total ;i++)
  {
   haOpen=(ExtOpenBuffer0[i-1]+ExtCloseBuffer0[i-1])/2; // <<<
   haClose=(Open[i]+High[i]+Low[i]+Close[i])/4;
   haHigh=MathMax(High[i],MathMax(haOpen,haClose));
   haLow=MathMin(Low[i],MathMin(haOpen,haClose));

La pregunta que se plantea es la siguiente: si Open debería buscarse por la barra anterior, ¿por qué se busca por la siguiente barra del código?

¿Esto debe ser correcto, o estoy entendiendo algo mal?

haOpen=(ExtOpenBuffer0[i+1]+ExtCloseBuffer0[i+1])/2;
Gracias.
En mql5, la dirección de la indexación de las barras se hace por defecto. Por lo tanto, [i-1] será sólo la primera barra a la derecha.
 
Vitaly Muzichenko:

Dime la forma correcta, esto es un cálculo de Heiken Ashi

Es un recorte de la norma

for(i=pos/*pos=1*/; i<rates_total ;i++)
  {
   haOpen=(ExtOpenBuffer0[i-1]+ExtCloseBuffer0[i-1])/2; // <<<
   haClose=(Open[i]+High[i]+Low[i]+Close[i])/4;
   haHigh=MathMax(High[i],MathMax(haOpen,haClose));
   haLow=MathMin(Low[i],MathMin(haOpen,haClose));

La pregunta que se plantea es la siguiente: si Open debería buscarse por la barra anterior, ¿por qué se busca por la siguiente barra del código?

Probablemente sea la forma correcta, o estoy entendiendo algo mal:

haOpen=(ExtOpenBuffer0[i+1]+ExtCloseBuffer0[i+1])/2;
Gracias.

Para ver exactamente qué índice tiene la barra más a la derecha y la más a la izquierda en el gráfico, utilice este sencillo método:

En cualquier indicador, en el MetaEditor, ponga un punto de interrupción en la primera operación dentro de OnCakculate() (paso 1):

comprobación de la indexación

Inicie la depuración de los datos históricos. Tan pronto como empiece a depurar en su punto de ruptura, la depuración se detendrá. A continuación, añada dos expresiones a la observación: "tiempo[rates_total-1]" y "tiempo[0]" (pasos 2 y 3). Ahora podemos ver fácilmente que en esta situación (el array time[] tiene la dirección de indexación por defecto, no se ha aplicado ArrayAsSeries), el elemento time[rates_total-1] será la barra más a la derecha del gráfico (paso 4).

Espero que este método sencillo y claro le ayude a comprobar rápidamente la dirección de la indexación en los indicadores.

 
Alexey Viktorov:
En mql5 la dirección de la indexación de las barras se hace por defecto. Por lo tanto, [i-1] será la primera barra desde la derecha.

A grandes rasgos lo entiendo, para no olvidarme del uso de ArraySetAsSeries.

La pregunta es que tanto en el código mql4 como en el mql5 se aplica el mismo cálculo "i-1", ¿por qué la resta si la fórmula dice barra anterior y no barra futura?

Vladimir Karputov:

Para ver exactamente qué índice tiene la barra más a la derecha y a la izquierda del gráfico, utilice este sencillo truco:

En cualquier indicador, en el MetaEditor, ponga un punto de interrupción en la primera operación dentro de OnCakculate() (paso 1):

Inicie la depuración de los datos históricos. Tan pronto como empiece a depurar en su punto de ruptura, la depuración se detendrá. A continuación, añada dos expresiones a la observación: "tiempo[rates_total-1]" y "tiempo[0]" (pasos 2 y 3). Ahora podemos ver fácilmente que en esta situación (el array time[] tiene la dirección de indexación por defecto, no se ha aplicado ArrayAsSeries), el elemento time[rates_total-1] será la barra más a la derecha del gráfico (paso 4).

Espero que este método sencillo y claro ayude a comprobar rápidamente la dirección de la indexación en los indicadores.

Gracias, no lo sabía.

¿Tiene alguna sugerencia sobre la corrección del cálculo?

 
Hola.
Necesito hacer una alerta para el indicador CCI ARROWS.
Necesito que se señale inmediatamente después de que aparezca la flecha.
MT5
 

¡¡¡Hola a todos!!! Empecé a modificar el indicador en MT5, pero no puedo entender la función iTime, no puedo conseguir que funcione, puede alguien dopilizar el indicador a una condición de trabajo?????

El indicador lee el archivo, que se encuentra en la carpeta MQL5\Files\\\Ndevolución-dvoid\N.

Después de descargarlo, cámbiale el nombre a .csv

Gracias de antemano.

Archivos adjuntos:
 

Buenos días a todos, no soy programador, pero uno de mis amigos dice que en el código del indicador Índice de Facilitación del Mercado de Bill Williams (BW MFI) los cálculos no se hacen estrictamente según la fórmula clásica: BW MFI = (ALTO - BAJO) / VOLUMEN Y además se utilizan algunas correcciones de datos adicionales. De hecho, se trata de un error y, en consecuencia, el indicador muestra datos incorrectos¡!

Por favor, indique cómo solucionar este error en el indicador (eliminar la corrección de datos adicionales) y recibir
indicador que funciona estrictamente según la fórmula: BW MFI = (ALTO - BAJO) / VOLUMEN ?????


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

//| MarketFacilitationIndex.mq5 ||

//| Copyright 2009, MetaQuotes Software Corp.

//| http://www.mql5.com |

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

#property copyright "2009, MetaQuotes Software Corp.

#enlace de propiedad "http://www.mql5.com"

//--- ajustes del indicador

#property indicador_separar_ventana

#property indicator_buffers 2

#property indicator_plots 1

#property indicator_type1 DRAW_COLOR_HISTOGRAM

#property indicator_color1 Lima,MarrónSilla,Azul,Rosa

#property indicator_width1 2

//--- parámetro de entrada

input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; //volúmenes

//---- buffers

doble ExtMFIBuffer[];

doble ExtColorBuffer[];

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

//| Función de inicialización de indicadores personalizada |

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

void OnInit()

{

//---- indicadores

SetIndexBuffer(0,ExtMFIBuffer,INDICATOR_DATA);

SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX);

//--- nombre para DataWindow

IndicatorSetString(INDICATOR_SHORTNAME, "BWMFI");

//--- establecer la precisión

IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

//----

}

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

//| |

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

void CalcularMFI(const int inicio,const int tasas_total,

const double &high[],

const double &low[],

const long &volume[])

{

int i=inicio;

bool mfi_up=true,vol_up=true;

//--- calcular los primeros valores de mfi_up y vol_up

si(i>0)

{

int n=i;

while(n>0)

{

if(ExtMFIBuffer[n]>ExtMFIBuffer[n-1]) { mfi_up=true; break; }

if(ExtMFIBuffer[n]<ExtMFIBuffer[n-1]) { mfi_up=false; break; }

//--- si los valores de mfi son iguales continuar

n--;

}

n=i;

while(n>0)

{

if(volumen[n]>volumen[n-1]) { vol_up=true; break; }

if(volumen[n]<volumen[n-1]) { vol_up=false; break; }

//--- si los volúmenes reales son iguales continuar

n--;

}

}

//---

while(i<total de tarifas && !IsStopped())

{

if(volumen[i]==0)

{

if(i>0) ExtMFIBuffer[i]=ExtMFIBuffer[i-1];

si no ExtMFIBuffer[i]=0;

}

si no ExtMFIBuffer[i]=(alto[i]-bajo[i])/_punto/volumen[i];

//--- calcular los cambios

si(i>0)

{

if(ExtMFIBuffer[i]>ExtMFIBuffer[i-1]) mfi_up=true;

if(ExtMFIBuffer[i]<ExtMFIBuffer[i-1]) mfi_up=false;

if(volumen[i]>volumen[i-1]) vol_up=true;

if(volumen[i]<volumen[i-1]) vol_up=false;

}

//--- establecer colores

if(mfi_up && vol_up) ExtColorBuffer[i]=0.0;

if(!mfi_up && !vol_up) ExtColorBuffer[i]=1.0;

if(mfi_up && !vol_up) ExtColorBuffer[i]=2.0;

if(!mfi_up && vol_up) ExtColorBuffer[i]=3.0;

i++;

}

}

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

//| Función de iteración de indicadores personalizada |

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

int OnCalculate(const int rates_total,

const int prev_calculado,

const datetime &time[],

const double &open[],

const double &high[],

const double &low[],

const double &close[],

const long &tick_volume[],

const long &volume[],

const int &spread[])

{

//---

int inicio=0;

//---

if(inicio<prev_calculado) inicio=prev_calculado-1;

//--- calcular con volúmenes de ticks o reales

if(InpVolumeType==VOLUME_TICK)

CalcularMFI(inicio,tasas_total,alta,baja,volumen_tick);

si no

CalcularMFI(inicio,tasas_total,alta,baja,volumen);

//--- normalizar el último valor de mfi

if(rates_total>1)

{

datetime ctm=TimeTradeServer(),lasttm=time[rates_total-1],nexttm=lasttm+datetime(PeriodSeconds());

if(ctm<nexttm && ctm>=lasttm && nexttm!=lasttm)

{

double corrección_koef=double(1+ctm-lasttm)/double(nexttm-lasttm);

ExtMFIBuffer[rates_total-1]*=corrección_koef;

}

}

//---

return(rates_total);

}

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

 

Por favor, dígame qué tipo de código es y cómo hacer esto en un indicador de MT5?


/Este es un indicador basado en el volumen. Asegúrese de utilizar la entrada de volumen adecuada.


/Las barras de la plaza son una batalla de los toros y los osos, con muchas compras y ventas pero poco movimiento de precios.
/Una barra de sentadilla será una de las tres barras superiores O inferiores el 85% de las veces al final de una tendencia.
//Si bien todas las tendencias terminan con un descenso, todos los descensos NO son el final de una tendencia.

study("Barras de sentadilla Williams", shorttitle="Barras de sentadilla", overlay=true)
r_hl=roc((alto-bajo)/volumen,1)
r_v=roc(volumen,1)
squat_f=(r_hl < 0) y (r_v > 0)
barcolor(squat_f ? azul : na)
 
Olexiy Polyakov:

Por favor, dígame qué tipo de código es y cómo hacer esto en un indicador de MT5?


/Este es un indicador basado en el volumen. Asegúrese de utilizar la entrada de volumen adecuada.


/Las barras de la plaza son una batalla de los toros y los osos, con muchas compras y ventas pero poco movimiento de precios.
/Una barra de sentadilla será una de las tres barras superiores O inferiores el 85% de las veces al final de una tendencia.
//Si bien todas las tendencias terminan con un descenso, todos los descensos NO son el final de una tendencia.

study("Barras de sentadilla Williams", shorttitle="Barras de sentadilla", overlay=true)
r_hl=roc((alto-bajo)/volumen,1)
r_v=roc(volumen,1)
squat_f=(r_hl < 0) y (r_v > 0)
barcolor(squat_f ? azul : na)

BW MFI Squat bar , 3 buffer ( si la memoria no me falla)