como puedo capturar el valor de una media en una variable
como puedo capturar el valor de una media en una variable

 

Publi

Resultados 1 al 10 de 10

Tema: como puedo capturar el valor de una media en una variable

  1. #1
    Hace tiempo escribí un EA que pretendía servir de plantilla de Expert Advisor para Metatrader 4 y lleva un montón de cosas programadas. Ese trabajo fue mi aprendizaje de MQL4.
    Esta plantilla sólo permite una operación a la vez en el mismo par de divisas (aunque puedes añadir el EA a más gráficos del mismo par, ponerle un MagicNumber diferente y así abrir más operaciones en el mismo par, esto ya depende de lo que persigas).
    Si quieres échale un vistazo, sólo tendrías que cambiar la función CheckForSignal() para llegar a los valores de estas variables:

    signalBuy: si es true y no hay una operación de compra abierta por el mismo EA y en el mismo par de divisas se abrirá una operación de compra.
    signalSell: si es true y no hay una operación de venta abierta por el mismo EA y en el mismo par de divisas se abrirá una operación de venta.
    goLong: si es true y hay una operación de venta, esta operación se cerrará. En el código actual goLong lo igualo a signalBuy pues doy como condición de cierre que se den las condiciones de operación contraria. Puedes hacer tu propia condición de cierre.
    goShort: si es true y hay una operación de compra, esta operación se cerrará. En el código actual goShort lo igualo a signalSell pues doy como condición de cierre que se den las condiciones de operación contraria. Puedes hacer tu propia condición de cierre.
    La función CheckForSignal() actual que tendrías que cambiar es:

    Code:
    void CheckForSignal()
    {
    if (time_now != Time[0])
    {
    time_now = Time[0];
    slowMA = iMA(NULL,0,SlowMAPeriod,SlowMAShift,SlowMAMode,Slo wMAApplyPrice,Bar);
    fastMA = iMA(NULL,0,FastMAPeriod,FastMAShift,FastMAMode,Fas tMAApplyPrice,Bar);
    }
    signalSell = false;
    signalBuy = false;
    if (fastMA>slowMA) signalBuy = true;
    if (fastMA

    Podrías hacer, por ejemplo:

    Code:
    void CheckForSignal()
    {
    if (time_now != Time[0])
    {
    time_now = Time[0];
    double MA_alta_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_HIGH, 1);
    double MA_baja_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_LOW, 1);
    }
    signalSell = false;
    signalBuy = false;

    //pon tus condiciones para abrir, segun te entiendo seria
    if (MA_alta_1 > MA_baja_1 && Price[1] > MA_alta_1) signalBuy = true;
    if (MA_alta_1 < MA_baja_1 && Price[1] < MA_baja_1) signalSell = true;//has tus comprobaciones de cierre o deja goLong = signalBuy y goShort = signalSell para que se cierren las oepraciones si se dan las operaciones de apertura en sentido contrario
    if(condicion_parra_cerrar_venta){
    goLong = true;
    }
    if(condicion_parra_cerrar_compra){
    goShort = true;
    }
    if (goLong || goShort) return;if (SearchPositions() != 0)
    {
    goLong = false;
    goShort = false;
    }
    }

  2.                         
    Publicidad
  3. #2
    Hola, muchas gracias por tu ayuda, ya que hace tiempo que no programaba y la verdad estoy refrescando conocimientos de programación de C. El código que estoy escribiendo tiene que cursar ordenes de compra o venta en función de que el precio de la última vela esté por encima o por debajo de la media superior o inferior, tal y como hemos comentado en post anteriores, te pongo el código a continuación para que le des un vistazo a ver que te parece, pero me surgen algunas dudas:

    ??? como lanzo la orden de compra o venta sin estableces un stoploss o un takeprofit?
    ??? cuando estoy comprado o vendido es mejor utilizar la orden OrderClose(order_id,1,Ask,3,Red) ya que esta me cierra la operación en curso?
    ??? te envio el algoritmo que quiero reflejar en MQL, un saludo.

    Code:
    //?????????????????????????????????????????????????? ??????????-
    //???????????????-cuerpo del programa principal???????????????
    //?????????????????????????????????????????????????? ??????????-
    int start()
    {

    double trend; //variable que almacena la tendencia
    double MA_alta_1, MA_baja_1, MA_media_1; //variables que me almacenan el valor de la media alta, media baja y media de medios
    double trendalcista, trendbajista;

    //?????????????????????????????????????????????????? ??????????-

    trend=calculotendencia(); //saltamos a la funcion que calcula la tendencia

    //?????????????????????????????????????????????????? ??????????-
    while(trend==0) //si tendencia es 0 no tenemos tendencia
    {
    trend=calculotendencia();
    }
    //?????????????????????????????????????????????????? ??????????-

    while(trend!=0)
    {
    //?????????????????????????????????????????????????? ?????????????
    while(trend>0) //si tendencia es >0 la tendencia es alcista
    {
    Comment (???la tendencia es alcista, y su valor es de???, trend);
    OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);
    MA_alta_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_HIGH, 1); //variable que toma el valor de la media alta en el cierre de la vela anterior

    while(Close[1]>MA_alta_1)//si el valor de cierre de la barra anterior está por encima de la media superior
    {
    MA_alta_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_HIGH, 1); //estamos viendo el ultimo tick de la vela
    }
    OrderSend(Symbol(),OP_SELL,0.1,Ask,3,Bid-15*Point,Bid+15*Point);
    trend=calculotendencia();
    }
    //?????????????????????????????????????????????????? ??????????-
    while(trend<0) //si tendencia es <0, la tendencia es bajista
    {
    Comment ("la tendencia es bajista, y su valor es de", trend);
    OrderSend(Symbol(),OP_SELL,0.1,Ask,3,Bid-15*Point,Bid+15*Point);//ahora la tendencia es bajista y tenemos que vender
    MA_baja_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_LOW, 1); //variable que toma el valor de la media baja en el cierre de la vela anterior

    while(Close[1]

  4. #3
    Con la última imagen que has subido ya tengo clarísimo que es lo que usas illy:. Aunque no se muy bien cuál es tu criterio para decidir si hay tendencia alcista o bajista.

    A ver si te puedo ayudar, como te dije no soy programador, sólo aficionado.

    Code:
    double MA_alta_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_HIGH, 1);
    En el código de arriba el último parámetro de la función iMA es 1. Esto indica ???valor de la media móvil en la vela anterior a la actual???, es decir, en la última vela completada. En definitiva, con lo que he puesto, la variable MA_alta_1 contendrá el valor de la media móvil exponencial al precio máximo alcanzado por la vela anterior a la actual. Cómo te dije lo de ???valor actual??? no tiene utilidad en la realidad, salvo contadas excepciones, porque se calcula a cada tick recibido. Pero si lo que quieres es el valor actual tan solo debes cambiar el ultimo parámetro de la función iMA por 0 (cero).

    Ahora puedes hacer algo similar con cada media móvil cuyo valor necesites:

    Code:
    double MA_alta_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_HIGH, 1);
    double MA_baja_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_LOW, 1);
    double MA_media_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_MEDIAN, 1);
    Haces la comparación que quieras con los valores de las medias móviles, por ejemplo en una función:

    Code:
    int calculartendencia(MA_alta,MA_baja){
    if((MA_alta ??? MA_baja) > 0){
    return 1; //tendencia alcista
    } elseif((MA_alta ??? MA_baja) < 0){
    return -1; //tendencia bajista
    } else {
    return 0; //sin tendencia
    }
    }
    Según he entendio quieres comprar si el precio de cierre de la vela es mayor a la media móvil alta y la tendencia es alcista. Como con la media móvil utilizo el precio de cierre de la última vela completa pues el precio de cierre de la vela actual no lo sabremos hasta que no se complete y cambia a cada nuevo tick recibido:

    Code:
    int start() {
    double MA_alta_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_HIGH, 1);
    double MA_baja_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_LOW, 1);
    double MA_media_1 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_MEDIAN, 1);
    int tendencia = calculartendencia(MA_alta_1,MA_baja_1);

    if(Close[1] > MA_alta_1 && tendencia > 0) {
    //se dan las condiciones de compra??????
    }
    if(Close[1] < MA_baja_1 && tendencia < 0) {
    //se dan las condiciones de venta......
    }
    }
    int calculartendencia(double MA_alta,double MA_baja){
    double diferencia = MA_alta - MA_baja;
    if(diferencia > 0){
    return(1); //tendencia alcista
    } else if(diferencia < 0){
    return(-1); //tendencia bajista
    } else {
    return(0); //sin tendencia
    }
    }

    ¿TE VOY PILLANDO?

  5. #4
    Hola, pues parece que el indicador que me dices es el mismo, lo que ocurre es que yo lo que hago es insertar tres medias móviles, una aplicada a los niveles altos, otra aplicada a los niveles bajos y una central, tal y como te indico en el dibujo adjunto, y tal y como te decia en anteriores post, lo que quiero es comparar el tick de cierre de la vela con la media superior para comprar, o con la media inferior para vender, siempre y cuando me acompañe la tendencia, un saludo.
    Imágenes adjuntadas Imágenes adjuntadas

  6. #5
    Saludos de nuevo???.la verdad que no me queda claro lo que quieres???.dices una media móvil exponencial alta y la misma media móvil baja y una de medios???..y no tengo ni idea de que es eso!!! Si miro tu dibujo lo que se ve creo que es un media móvil en el centro y a los lados una desviación de esta media movil hacia arriba y hacia abajo, tipo indicador envolopes. Es este indicador el que estás usando??

  7. #6
    Hola, muchísimas gracias por revisarme el código. Lo que quiero hacer es lo siguiente:
    Según el gráfico tengo una media móvil exponencial alta, la misma media móvil baja y una de medios, la idea es:
    1º Determinar la tendencia, para esto quiero comparar el valor actual de la media móvil con el valor de la media móvil anterior.
    2º Si la tendencia es alcista y el precio del tick del cierre de la vela verde está por encima de la media superior (punto 1), entraremos largos (compraremos).
    3º Si el último precio de la vela está por debajo de la media de medios venderemos (punto 2).
    Así sucesivamente para comprar y para ventas.
    La función que estamos tratando es para determinar la tendencia, pero aún falta el cuerpo del programa, que te envío tal y como lo tengo.

    Este es el código en el que estoy trabajando:

    Code:
    Código:
    //+??????????????????????????????????????????????????????????????????+
     //|                                nuevo sistema oficina trading.mq4 |
     //|                                         jose damian cabezas pozo |
     //|                                                                  |
     //+??????????????????????????????????????????????????????????????????+
     #property copyright ???jose damian cabezas pozo???
    //+??????????????????????????????????????????????????????????????????+
     //| expert initialization function                                   |
     //+??????????????????????????????????????????????????????????????????+
     //???????????????????????????int init()
     //???????????????????????????{
     //???-
     int start()
     {
    
     double tendencia, alcista, bajista;
     double trendalcista, trendbajista;
     double lastick, upmedia, downmedia, mediamedios;   //variables ultimotick, valor media alta, valor media baja
    
    //???-
     calculotendencia()=tendencia;    //saltamos a la funcion que calcula la tendencia
    
    //????????????????????????????????????????????????????????????-
     while(tendencia=0)    //si tendencia es 0 no tenemos tendencia
     {
     calculotendencia()=tendencia;
     }
     //????????????????????????????????????????????????????????????-
    
    while(tendencia=!0)
     {
     //???????????????????????????????????????????????????????????????
     while(tendencia>1)    //si tendencia es >1 la tendencia es alcista
     {
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);
     while(lastick>upmedia)
     {
     ver lasttick;
     }
     OrderSend(Symbol(),OP_SELL,0.1,Ask,3,Bid-15*Point,Bid+15*Point);
     calculotendencia()=tendencia;
     }
     //????????????????????????????????????????????????????????????-
     OrderSend(Symbol(),OP_SELL,0.1,Ask,3,Bid-15*Point,Bid+15*Point);  //como estamos dentro de tendencia ahora la tendencia debe ser bajista, y tenemos que vender
    
     while(lastick
    Imágenes adjuntadas Imágenes adjuntadas

  8. #7
    Gracias por dar las gracias, me gusta!!

    Estás con mql4 o mql5? Se me olvidó preguntarte antes.

    Bueno, el código que puse era de ejemplo y la verdad que no tendría ninguna utilidad real pero creo que hace más o menos lo que tu planteaste: el planteamiento del problema es primordial para encontrar la solución programada en cualquier lenguaje, como mql.

    El código que puse no compara el valor de cada tick con el tick anterior. Lo que pasa es que el valor ???actual??? de la media móvil se calcula a cada nuevo tick recibido, ya que este tick será el precio de cierre de la vela actual. Es decir, hasta que la vela actual no se termina, el precio de cierre varía a cada tick. Por ello no se suele utilizar el valor actual de ningún indicador. Por el contrario se suelen utilizar los valores de indicadores en velas ya completadas pues estas ya no van a cambiar y el valor del indicador tampoco.

    Y es más, desde mi punto de vista comparar el valor de una media móvil exponencial con el valor de la MISMA media móvil exponencial en un vela anterior tampoco tiene mucha utilidad. Pero todo depende de cuál es el fin que persigues. Si el fin es determinar la tendencia lo mejor es comparar el valor de medias móviles de distinto período, echale un vistazo a media móvil exponencial. Y vuelve a plantear el problema y el objetivo que persigues para que pueda echarte una mano. Además tienes bastantes errores en lo que a tipos de datos se refiere, como te dije en el anterior post.

    Por el momento, te dejo lo que he entendido que quieres que haga con algunas anotaciones para que veas algunos errores que tenías:

    Code:
    int start(){
    double trend = calculotendencia();
    /*tenemos que cambiar el tipo de datos de la funcion calculotendencia() a double,
    de lo contrario no podrá devolver el valor de una media movil que es tipo double y
    se eliminarían todos los decimales si se deja en tipo int*/

    //if(trend =! 0) erroneo, es !=
    //if(trend > 1) erroneo, si trend es la diferencia entre medias moviles también tomará valores entre 0 y 1, lo correcto sera if(trend > 0)

    if(trend != 0)
    {
    if(trend>0)
    {
    Alert (???la tendencia es alcista, y su valor es de???, trend);

    }
    if(trend < 0) //introducimos la comprobacion del caso de que trend sea menor a cero
    {
    Alert("la tendencia es bajista, y su valor es de", trend);
    }} else { //introducimos el esle para cuando trend sea igual a cero, si no la siguiente alerta saltaria siempreAlert("no tenemos tendencia, y el valor es de", trend);}return(0);}double calculotendencia() //no puede ser tipo int si queremos que devuelva el valor de una diferencia de medias moviles
    {
    int Periodo = 24; //o cualquier periodo que quieras usar
    double trendactual = iMA(NULL, 0, Periodo, 0, MODE_EMA, PRICE_CLOSE, 0);//como dije, este valor cambiara a cada nuevo tick recibido, es el "valor actual"
    double trendanterior = iMA(NULL, 0, Periodo, 0, MODE_EMA, PRICE_CLOSE, 1);//es el valor de la EMA en la vela inmediatamente anterior a la actualdouble tendencia = trendactual - trendanterior;return(tendencia); //Devuelve el valor de tendencia, que es la diferencia de las dos medias moviels}

    Nota: sólo soy un aficionado a la programación y aunque hablo con seguridad puede que esté muy equivocado, acepto correcciones con mucho agrado pues me harán aprender.

  9. #8
    Hola, muchas gracias por resolverme la duda, ahora me surge otro problema.
    Cuando aplico la función al gráfico en cuestión, tal y como se ve en la imagen, me calcula que no tenemos tendencia, y que tenemos tendencia, cuando la tendencia es claramente alcista.

    Lo que quiero yo es que me diga el resultado del valor de la media al cierre de la vela actual, y me lo compare con el valor de cierre de la vela anterior, y creo que lo que me hace es compararme el valor del tick de una vela, con el valor del tick anterior de la misma vela.

    Cómo podría hacer esto?

    Gracias por anticipado.

    P.D. Cómo puedo averiguar y almacenar en una variable al valor del último tick de una vela?
    Imágenes adjuntadas Imágenes adjuntadas

  10. #9
    Si te he entendido bien, lo que buscas es algo así?¿?¿?:

    Code:
    int calculotendencia()
    {
    int Periodo = 24; //o cualquier periodo que quieras usar
    double trendactual = iMA(NULL, 0, Periodo, 0, MODE_EMA, PRICE_CLOSE, 0); //0 ??? actual
    double trendanterior = iMA(NULL, 0, Periodo, 0, MODE_EMA, PRICE_CLOSE, 1); //1 ??? vela anterior al precio especificado, en este caso PRICE_CLOSE
    tendencia=trendactual-trendanterior;
    if(tendencia<0){
    return 0; //tendencia bajista
    } else {
    return 1; //tendencia alcista
    }
    }

    Cada indicador tiene su función específica en mql para obtener su valor. En esta dirección Technical Indiors - MQL4 Reference puedes acceder a la descipción de cada una de las funciones para cada indicador y los parámetros que necesita dicha función. Por ejemplo, el valor de una media móvil se obtiene con la siguiente función:

    Code:
    iMA(par_divisas,timeframe,periodo,modo,precio,shif t);
    En iMA - Technical Indiors - MQL4 Reference puedes ver que tipo de dato es cada parámetro de la función iMA() y los posibles valores que puede tomar. Con el valor de shift = 0 obtienes el valor actual, shift = 1 para el valor en la vela anterior, shift = 2 para el valor de hace dos velas, etc.

    Ahh, y ten en cuenta el tipo de datos. En el código que pusistes haces ???calculotendencia()=trend;??? pero declaras trend como tipo double y calculotendencia() como tipo int. Comparar datos de distintos tipos puede darte problemas si no lo manejas con cuidado. Recuerda: una variable int es un número entero, un dato tipo double es un número deciaml.

  11. #10
    Hola, empiezo ahora a programar en mql, aunque ya he programado antes en lenguaje C, veo que la estructura es muy similar, pero no estoy familiarizado con las funciones específicas de mql, el caso es que se me plantean dudas, a ver si podeis ayudarme compañeros:

    quiero llamar a una funcion que me calcule la tendencia actual, para esto la idea es insertar una media exponencial y capturar su valor actual y su valor anterior, después hacer la resta y en función de que me salga un valor positivo o negativo establecer si tenemos tendencia, la función sería algo como esto:

    Code:
    Código:
    int start()
     {
     double tendencia, trend;
     double trendactual, trendanterior;
    
     calculotendencia()=trend;    //saltamos a la funcion que calcula la tendencia
     if(trend=!0)
     {
     if(trend>1)
     {
     Alert (???la tendencia es  alcista, y su valor es de???, trend);
     }
     Alert(???la tendencia es bajista, y su valor es de???, trend);
     }
     Alert(???no tenemos tendencia, y el valor es de???, trend);
    
    return(0);
     }
    
    int calculotendencia() // Descripción de la función definida por el usuario
     {
     tendencia=trendactual-trendanterior;
     return(tendencia); // Contador de ticks
     }
    De qué forma puedo hacer que las variables trendactual y trendanterior me vayan almacentando estos valores?

    Muchísimas gracias por anticipado.

Etiquetas para este tema

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.