¿Cómo programar un indicador con OBV y su MA?
¿Cómo programar un indicador con OBV y su MA?

 

Publi

Resultados 1 al 9 de 9

Tema: ¿Cómo programar un indicador con OBV y su MA?

  1. #1
    4 Anexo(s) Hola a todos,

    Soy un novato en la programación de MQL4 con algunos conocimientos en otros lenguajes de programación. He estado luchando con este código aparentemente fácil que adjunto a continuación. Básicamente, lo que me gustaría lograr es tener el indicador OBV (On Balance Volume) con un promedio móvil (SMA, EMA, SMMA o LWMA) en una ventana de indicador separada en la parte inferior del gráfico. Así es como debería verse:


    Utilicé el OBV.mq4 para empezar y gradualmente comencé a desarrollar el código:Agregué las funciones SetIndexBuffer y SetIndexStyle en init() para el segundo búfer que contendrá mis valores MA Creé un bucle que mira hacia atrás MA_period = 200 unidades de tiempo en el pasado, toma los valores OBV de esos, los coloca todos en una matriz OBV_vals y luego usa la función iMAOnArray() para obtener el SMA, EMA, SMMA o LWMA. Coloqué el valor promedio móvil devuelto por iMAOnArray() en MABuffer con la esperanza de que apareciera en la ventana del indicador. Logré obtener todo hasta la línea donde guardo los promedios móviles en el búfer. Tengo los valores de MA, los imprimí en el diario y me parecieron válidos. Sin embargo, en el momento en que elimino el comentario de la línea MABuffer[i] = nOBVMA con la intención de mostrar estos valores MA en la pantalla del indicador, todo se corrompe como puede ver en esta imagen:


    Curiosamente, sin embargo, con la línea MABuffer[i] = nOBVMA comentada, el OBV funciona bien:


    Aquí está el fragmento de código, pero también adjunté el código completo a continuación.
    Código insertado/bucle mirando hacia atrás MA_period=200 períodos y tomando/los valores OBV correspondientes a esas velas for(int j=1; jlt;=MA_period; j ) { nOBV_vals#91;j-1#93; = iOBV(NULO, 0, PRECIO_CIERRE, i j); }/utilizando la matriz nOBV_vals recién rellenada,/esta línea calcula el MA nOBVMA = iMAOnArray(nOBV_vals, 0, MA_period, 0, MA_method, i);/imprime el valor promedio móvil Print (el valor OBV EMA es DoubleToStr (nOBVMA));/agregue el MA al MABuffer para que se muestre en la ventana del indicador/cuando esta línea está habilitada, ¡incluso los datos de OBVBuffer se corrompen! MABuffer#91;i#93; = nOBVMA;
    Si alguien pudiera ayudar a un novato entusiasta, ¡estaría extremadamente agradecido!
    Si tiene algún otro comentario que le venga a la mente al ver mi problema, no dude en compartirlo, estoy realmente decidido a mejorar mis habilidades de codificación de MQL4 de la manera más rápida y eficiente posible.

    PD: Soy consciente de que puedo agregar un promedio móvil a un indicador OBV en MetaTrader. Sin embargo, el OBV con MA será parte de un EA futuro que planeo programar y, por lo tanto, necesito el indicador con un OBV y un búfer de MA para pasar al resto del EA más adelante.

    ¡De antemano muchas gracias por tu ayuda!

    https://www.forosforex.com/attachmen...2255590709.mq4

  2.                         
    Publicidad
  3. #2
    2 Anexo(s) ¡Y victoria! ¡Logre resolverlo! El de arriba es mi indicador, el de abajo es el MT4 predeterminado.
    Sorprendentemente, en realidad fue más fácil de lo que hubiera pensado. Solo dos bucles for. También es importante que anteriormente, por error, puse todo en un solo ciclo for. El secreto fue poner todos los valores de OBV en una matriz y luego usar iMAOnArray() en todos los valores de OBV en un segundo bucle for. Dejo mi código aquí abajo, tal vez alguien necesite un OBV con MA en el futuro.

    https://www.forosforex.com/attachmen...8216145924.mq4

  4. #3
    2 Anexo(s) Muy bien, tengo buenas noticias. Sospeché que el código OBV original podría no haber sido del todo correcto, así que descargué otro y reinicié todo el proceso, agregando líneas una por una, compilando, ejecutando y comprobando si todo todavía tenía sentido. Así es como llegué aquí: se ve mucho mejor ahora, ¡buenas noticias de que MABuffer también funciona bien! En esta imagen, el indicador inferior es el volumen de balance predeterminado con la EMA 200 adjunta y el indicador superior es donde se encuentra mi indicador programado.
    Siento que el problema está en algún lugar del fragmento de código a continuación, aunque no puedo entender por qué no está haciendo lo que espero. La línea MA en mi indicador sube de 0 a aproximadamente 400 000 (que es aproximadamente el rango correcto) en la vela 200, que es equivalente al MA_period... El código completo actualizado se adjunta a continuación. Código insertado nLimit=Bars-nCountedBars-1; for(i=nLimit; igt;=0; i--) { for(int j=1; jlt;=MA_period; j ) { nOBV_vals#91;j-1#93; = iOBV(NULO, 0, PRECIO_CIERRE, i j); } nOBVMA = iMAOnArray(nOBV_vals, 0, MA_period, 0, MA_method, i); MABuffer#91;i#93; = nOBVMA; }
    https://www.forosforex.com/attachmen...1031865325.mq4

  5. #4
    Cita Iniciado por ;
    {quote} Sí, afortunadamente logré progresar mucho desde entonces y conseguí que iMAOnArray() funcionara, pero me topé con una pared con los búferes. Gracias por los códigos MA, intentaré combinarlos en mi código OBV-MA y ver si me lleva a otro lado.
    Entonces solo se está ajustando la vista. Si mira sus valores de impresión cuando MABuffer está comentado y luego mira cuando no está comentado, son los mismos y los valores OBV son los mismos. ¿Quizás necesitas hacer una escala lineal?

  6. #5
    Cita Iniciado por ;
    {quote}Estaba recordando del otro hilo que dijiste que solo devolvía cero.
    Sí, afortunadamente logré progresar mucho desde entonces y conseguí que iMAOnArray() funcionara, pero me topé con una pared con los búferes. Gracias por los códigos MA, intentaré combinarlos en mi código OBV-MA y ver si me lleva a otro lado.

  7. #6

    Cita Iniciado por ;
    {quote} Hola, para SMA es fácil, pero ¿también para EMA, SMMA, LWMA? Además, no creo que la mejor eegia sea simplemente evitar usar la función iMAOnArray por completo porque es una función bastante común y en realidad devuelve valores.
    Oh, mal, estaba recordando del otro hilo que dijiste que solo devolvía cero. Aquí están los códigos mql MA, pero no los códigos OnArray: Código insertado/ -------------------------------- ---------------------------------- /| Promedio móvil simple |/ -------------------------------------------------------- ------------------- double SimpleMA(const int position,const int period,const double precio#91;#93 {/--- double result= 0,0;/--- comprobamos la posición if(positiongt;=period-1 periodgt;0) {/--- calculamos el valor de(int i=0;ilt;period;i ) result =price#91;position-i# 93;; resultado/=período; }/--- retorno(resultado); }/ ---------------------------------------------- -------------------- /| Media Móvil Exponencial |/ -------------------------------------------------------- ------------------- double ExponentialMA(const int position,const int period,const double prev_value,const double precio#91;#93 {/-- - resultado doble=0.0;/--- calculamos el valor if(periodgt;0) { double pr=2.0/(period 1.0); resultado=precio#91;posición#93;*pr prev_value*(1-pr); }/--- retorno(resultado); }/ ---------------------------------------------- -------------------- /| Promedio móvil suavizado |/ -------------------------------------------------------- ------------------- double SmoothedMA(const int position,const int period,const double prev_value,const double precio#91;#93 {/-- - resultado doble=0.0;/--- comprobamos la posición if(periodgt;0) { if(position==period-1) { for(int i=0;ilt;period;i ) result =price#91;position-i#93;; resultado/=período; } if(posicióngt;=período) resultado=(prev_value*(período-1) precio#91;posición#93/período; }/--- retorno(resultado); }/ ---------------------------------------------- -------------------- /| Media móvil ponderada lineal |/ -------------------------------------------------------- ------------------- double LinearWeightedMA(const int position,const int period,const double precio#91;#93 {/--- double result= 0,0, suma=0,0; int i,wsum=0;/--- calculamos el valor if(positiongt;=period-1 periodgt;0) { for(i=period;igt;0;i--) { wsum =i; suma =precio#91;posición-i 1#93;*(período-i 1); } resultado=suma/wsum; }/--- retorno(resultado); }

  8. #7

    Cita Iniciado por ;
    Hola a todos, soy un novato en la programación de MQL4 con algunos conocimientos en otros lenguajes de programación. He estado luchando con este código aparentemente fácil que adjunto a continuación. Básicamente, lo que me gustaría lograr es tener el indicador OBV (On Balance Volume) con un promedio móvil (SMA, EMA, SMMA o LWMA) en una ventana de indicador separada en la parte inferior del gráfico. Así es como debería verse: {image} Utilicé OBV.mq4 para empezar y gradualmente comencé a desarrollar el código: agregué las funciones SetIndexBuffer y SetIndexStyle en init() para el segundo...
    En lugar de iMAOnArray, puede calcular los valores de MA usted mismo. La carpeta de inclusión de su instalación de MT4 tiene un código que puede usar, como cálculos MA.

  9. #8

    Cita Iniciado por ;
    {quote} En lugar de iMAOnArray, puede calcular los valores de MA usted mismo. La carpeta de inclusión de su instalación de MT4 tiene un código que puede usar, como cálculos MA.
    Hola Beerrun, para SMA es fácil, pero ¿también para EMA, SMMA, LWMA? Además, no creo que la mejor eegia sea simplemente evitar usar la función iMAOnArray por completo porque es una función bastante común y en realidad devuelve valores.

  10. #9
    @levix95 Muchas gracias por este OBV MA indi!!!! ¿Puedo molestarte en agregar otro MA, para que haya dos? Yo cuero cabelludo gráficos M1, y creo que un 200MA con un 34MA rápido junto con el OBV completará mi sistema de comercio Muy GRANDE POR FAVOR? Gracias de antemano PD En el tipo de campo de MA, nrs 1 a 4, supongo que está en la misma secuencia que en todos los demás MT4 Indies.

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  
Uso de cookies
Utilizamos cookies propias y de terceros para elaborar información estadística y mostrarle publicidad personalizada a través del análisis de su navegación. Si continúa navegando acepta su uso. Más información y política de cookies.
     

Aviso legal: Ni forosforex.com ni ninguna persona involucrada en forosforex.com aceptarán ninguna responsabilidad por cualquier pérdida o daño en el trading como resultado de la confianza en la información contenida en este sitio web, incluidos datos, cotizaciones, gráficos y señales de compra/venta. Por favor, infórmese plenamente de los riesgos y costes asociados a las operaciones en los mercados financieros, una de las formas de inversión que más riesgos entrañan.
forosforex.com le quiere recordar que los datos contenidos en este sitio web no son necesariamente en tiempo real ni exactos. forosforex.com no asume responsabilidad alguna por las pérdidas en que usted podría incurrir como resultado de la utilización de estos datos. Este acuerdo se rige por su versión en inglés, que prevalecerá siempre que haya alguna discrepancia entre la versión en inglés y la versión en español. Los CFD son un producto difícil de entender, varios organismos reguladores consideran que no es adecuado para inversores minoristas debido a su complejidad y riesgo.
Advertencia de riesgo: Los CFDs son un producto difícil de entender, y puede no ser adecuado para inversores minoristas debido a su complejidad y riesgo. Existe la posibilidad de sufrir una pérdida igual o superior a la inversión. Por lo tanto, no debe invertir o arriesgar dinero que no pueda permitirse perder. Debe asegurarse de que comprende todos los riesgos. Antes de abrir una cuenta en un broker por favor sea consciente e infórmese de los riesgos asociados con el trading. El contenido de este sitio web no debe interpretarse como asesoramiento personal. ForosForex recomienda que busque el consejo de un asesor financiero independiente.