Publi

Publi

Resultados 1 al 8 de 8


  1. #1
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 309
    Créditos: 50

    .... Funciones personalizadas.


    Publi
    -----------------------------------------------------------------------------------------------------------------------------------------


    Hola, muy buenas.


    Ando estudiando programación mql4 y comparando códigos de otros programas para ir aprendiendo.

    La verdad es que me he estancado bastante en el tema de las funciones personalizadas con valores dentro de los paréntesis.

    Ojeando un EA de estos que hay por internet a patadas que se les denomina edu (ya sabemos todos porque).

    En este EA, por ejemplo hay un mogollon de funciones personalizadas y en la mayoría de ellas aparece (int ai_0) que según donde se le ponga después pués no entiendo su valor.

    Copypaste:




    double f0_16(int ai_0) {
    double ld_4 = 0;
    double ld_24 = High[iHighest(NULL, 0, MODE_HIGH, albar, ai_0)];
    double ld_32 = Low[iLowest(NULL, 0, MODE_LOW, albar, ai_0)];
    ld_4 = ld_24 - ld_32;
    return (ld_4);
    }


    void f0_52(int ai_0, double ad_4, double ad_12) {
    if (!IsTesting()) {
    while (IsTradeContextBusy() == TRUE) {
    Sleep(100);
    RefreshRates();
    }
    }
    bool li_20 = OrderModify(ai_0, OrderOpenPrice(), ad_4, ad_12, 0, CLR_NONE);
    if (li_20 == FALSE) f0_27(f0_6(15), ai_0, OrderOpenPrice(), ad_4, ad_12, GetLastError());
    }



    En el primer caso entiendo que se le dá valor 0 según donde esta situado. En busca del alto y bajo desde 0 barras al valor albar.

    Pero en la segunda función, en el OrderModify se coloca ai_0 como valor del ticket de la orden ....¿ pero en que momento se le dá ese valor ?.


    Bufff es que no lo entiendo ... todo el código esta lleno de ai_0 pero siempre dentro de funciones personalizadas, nunca fuera de ellas.

    ¿ Alguien me lo pudiera aclarar please ?.


    Muchas gracias.


    Saludos.


    --------------------------------------------------------------------------------
    Foro de Forex Trading United

     

  2.                         
    Publi
  3. #2
    Avatar de robertomar
    Heidelbergensis


    Reputación:
    Poder de reputación: 9

    Espana
    Mensajes: 905
    Créditos: 15,929

    Re: .... Funciones personalizadas.

    Cita Iniciado por Vinisius Ver mensaje
    -----------------------------------------------------------------------------------------------------------------------------------------


    Hola, muy buenas.


    Ando estudiando programación mql4 y comparando códigos de otros programas para ir aprendiendo.

    La verdad es que me he estancado bastante en el tema de las funciones personalizadas con valores dentro de los paréntesis.

    Ojeando un EA de estos que hay por internet a patadas que se les denomina edu (ya sabemos todos porque).

    En este EA, por ejemplo hay un mogollon de funciones personalizadas y en la mayoría de ellas aparece (int ai_0) que según donde se le ponga después pués no entiendo su valor.

    Copypaste:




    double f0_16(int ai_0) {
    double ld_4 = 0;
    double ld_24 = High[iHighest(NULL, 0, MODE_HIGH, albar, ai_0)];
    double ld_32 = Low[iLowest(NULL, 0, MODE_LOW, albar, ai_0)];
    ld_4 = ld_24 - ld_32;
    return (ld_4);
    }


    void f0_52(int ai_0, double ad_4, double ad_12) {
    if (!IsTesting()) {
    while (IsTradeContextBusy() == TRUE) {
    Sleep(100);
    RefreshRates();
    }
    }
    bool li_20 = OrderModify(ai_0, OrderOpenPrice(), ad_4, ad_12, 0, CLR_NONE);
    if (li_20 == FALSE) f0_27(f0_6(15), ai_0, OrderOpenPrice(), ad_4, ad_12, GetLastError());
    }



    En el primer caso entiendo que se le dá valor 0 según donde esta situado. En busca del alto y bajo desde 0 barras al valor albar.

    Pero en la segunda función, en el OrderModify se coloca ai_0 como valor del ticket de la orden ....¿ pero en que momento se le dá ese valor ?.


    Bufff es que no lo entiendo ... todo el código esta lleno de ai_0 pero siempre dentro de funciones personalizadas, nunca fuera de ellas.

    ¿ Alguien me lo pudiera aclarar please ?.


    Muchas gracias.


    Saludos.


    --------------------------------------------------------------------------------



    Compi, tal como te he comentado por privado, la mejor opción para aprender a programar no es que cojas EAs decompilados, precisamente por eso, porque al decompilar te renombra todas las variables y es un follón para dilucidar a qué corresponde cada una. Mejor que te cojas EAs bien hechos (a ser posible hechos con código nuevo y que tengas el código sin necesidad de decompilar y lo verás todo más claro).

    Si hasta los que llevamos mucho tiempo programando nos cuesta descrifrar los decompilados, en este caso que has puesto se ve bastante claro, pero en otros casos, en los que una función llama a la otra, la otra a otra, la otra a nos e cual, tienes que hacerle un seguimiento de un lado al otro por todo el EA para ver de donde viene cada una y a qué puede corresponder, o sea lo que se dice "un trabajo de chinos", jajaja.

    En este caso que pones, obviamente es sencillo de ver a qué corresponde en cada caso, en la primera función, es el shift, y en el segundo caso, tal como has visto tú mismo es el Ticket.

    De donde sale ese ticket??, pues desde donde llame a esa función, ya previamente habrá Seleccionado la orden y le habrá pasado como parámetro a la función el valor de OrderTicket().

    En otros casos, te aseguro que no es tan sencillo de descifrar, jajaja.

    Al decompilar, como te comento, renombra todas las variables, y funciones.

    Por ejemplo, la segunda función que pones:

    void f0_52(int ai_0, double ad_4, double ad_12)

    En un EA normal que no se haya decompilado aparecería algo así:

    void SetSLTP(int ticket, double sl, double tp)

    A que así sería mucho más fácil de entender el código???. En cambio al decompilar, la función la renombra a "f0_52", y las variables que se pasan a la función (que se llaman atributos) las renombra a : ai_0 (lo cual quiere decir atributo integer_0), ad_4 (atributo double_4) y ad_12(atributo double_12). Al final les pone un número para distinguir unas de otras.

    Por eso te aparece muchas veces la int ai_0 en dentro de todas las funciones, cada vez que en una función tenga un atributo de tipo integer, lo renombra así, si tuvieras un segundo atributo integer en esa función, le pondría ai_4 por ejemplo, y así sucesivamente. Pero en cada caso corresponderá a una cosa, depende de la variable que se le haya pasado a la función al llamarla.

    Lo que pasa que con estos renombrados se hace muchísimo más difícil hacerle un seguimiento al no ser nombres inteligibles para el ser humano.

    Espero haberte aclarado un poco.

    Saludos y un abrazo.
    Foro de Forex Trading United

     

  4. #3
    Avatar de Wolfman
    Heidelbergensis


    Reputación:
    Poder de reputación: 15

    Mensajes: 2,052
    Créditos: 7,617

    Re: .... Funciones personalizadas.

    Cita Iniciado por Vinisius Ver mensaje
    -----------------------------------------------------------------------------------------------------------------------------------------


    Hola, muy buenas.


    Ando estudiando programación mql4 y comparando códigos de otros programas para ir aprendiendo.

    La verdad es que me he estancado bastante en el tema de las funciones personalizadas con valores dentro de los paréntesis.

    Ojeando un EA de estos que hay por internet a patadas que se les denomina edu (ya sabemos todos porque).

    En este EA, por ejemplo hay un mogollon de funciones personalizadas y en la mayoría de ellas aparece (int ai_0) que según donde se le ponga después pués no entiendo su valor.

    Copypaste:




    double f0_16(int ai_0) {
    double ld_4 = 0;
    double ld_24 = High[iHighest(NULL, 0, MODE_HIGH, albar, ai_0)];
    double ld_32 = Low[iLowest(NULL, 0, MODE_LOW, albar, ai_0)];
    ld_4 = ld_24 - ld_32;
    return (ld_4);
    }


    void f0_52(int ai_0, double ad_4, double ad_12) {
    if (!IsTesting()) {
    while (IsTradeContextBusy() == TRUE) {
    Sleep(100);
    RefreshRates();
    }
    }
    bool li_20 = OrderModify(ai_0, OrderOpenPrice(), ad_4, ad_12, 0, CLR_NONE);
    if (li_20 == FALSE) f0_27(f0_6(15), ai_0, OrderOpenPrice(), ad_4, ad_12, GetLastError());
    }



    En el primer caso entiendo que se le dá valor 0 según donde esta situado. En busca del alto y bajo desde 0 barras al valor albar.

    Pero en la segunda función, en el OrderModify se coloca ai_0 como valor del ticket de la orden ....¿ pero en que momento se le dá ese valor ?.


    Bufff es que no lo entiendo ... todo el código esta lleno de ai_0 pero siempre dentro de funciones personalizadas, nunca fuera de ellas.

    ¿ Alguien me lo pudiera aclarar please ?.


    Muchas gracias.


    Saludos.


    --------------------------------------------------------------------------------
    No estoy seguro Vinisius pero me parece que las funciones personalizadas estan definidas como bucles separarados, que dependiendo del caso la variable en cuestion puede tomar diferentes valores segun sea el caso.

    Por ejemplo recuerdo el lenguaje de programacion BASIC muy antiguo pero la base de muchos actuales donde programabas en orden de lineas pero si en un momento especificos querias que el programa saltare a otras lineas mas adelantes a evaluar algo hacias un llamado y podias evaluar si se cumplian las condociones lo mandabas a otra linea o en todo caso regresaba al inicio donde partia y continuaba.

    Es como programar en diferentes bucles o bucles anidados.

    saludos espero te sirva mi idea.

    saludos y mucha suerte.
    Foro de Forex Trading United



    "La mente es como un paracaídas, sólo funciona si se abre. Albert Einstein

  5. #4
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 309
    Créditos: 50

    Re: .... Funciones personalizadas.

    -----------------------------------------------------------------------------------------------------------------------------------------------------


    Hola.

    Gracias a ambos por contestar.

    Entiendo lo que me decis.


    Lo que pasa es que hasta ahora solo había trabajado o estudiado con funciones personalizadas sin nada dentro de los paréntesis y es eso lo que me confunde.

    En el ejemplo anterior debe coger el ticket de aquí:


    for (int li_72 = OrdersTotal() - 1; li_72 >= 0; li_72--) {
    if (OrderSelect(li_72, SELECT_BY_POS) != FALSE) {
    if (OrderMagicNumber() == gia_584[0] && Symbol() == OrderSymbol()) {
    ld_40 = OrderStopLoss();
    if (MathAbs(ld_16 - ld_40) > f0_30(10)) ld_40 = ld_16;
    ld_48 = OrderTakeProfit();
    if (MathAbs(ld_24 - ld_48) > f0_30(10)) ld_48 = ld_24;
    ld_40 = NormalizeDouble(ld_40, Digits);
    ld_48 = NormalizeDouble(ld_48, Digits);
    if (OrderStopLoss() != ld_40 || OrderTakeProfit() != ld_48)
    if (ld_40 != 0.0 && ld_48 != 0.0) f0_52(OrderTicket(), ld_40, ld_48);




    Entonces si lo entiendo bién;



    void f0_52(int ai_0, double ad_4, double ad_12)



    equivaldría:



    void f0_52(OrderTicket(), ld_40, ld_48)




    ¿ Es correcto ?.


    ------------------------------------------------------------------------------------------------------------------------------------------------
    Foro de Forex Trading United

     

  6. #5
    Avatar de robertomar
    Heidelbergensis


    Reputación:
    Poder de reputación: 9

    Espana
    Mensajes: 905
    Créditos: 15,929

    Re: .... Funciones personalizadas.

    Yes, justo eso. Le pasas a la función esos parámetros y la función hace lo que tenga que hacer en arreglo a los parámetros que le has pasado.

    Me alegro que ya se te haya resuelto la duda.

    Saludos y un abrazo.
    Foro de Forex Trading United

     

  7. #6
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 309
    Créditos: 50

    Re: .... Funciones personalizadas.

    --------------------------------------------------------------------------------------------------------------------------------------------------------------


    Ok.

    ¿ Y que ocurriría si en vez de



    void f0_52(int ai_0, double ad_4, double ad_12)



    ... le pusiera a secas.


    void f0_52()
    Foro de Forex Trading United

     

  8. #7
    Avatar de robertomar
    Heidelbergensis


    Reputación:
    Poder de reputación: 9

    Espana
    Mensajes: 905
    Créditos: 15,929

    Re: .... Funciones personalizadas.

    Cita Iniciado por Vinisius Ver mensaje
    --------------------------------------------------------------------------------------------------------------------------------------------------------------


    Ok.

    ¿ Y que ocurriría si en vez de



    void f0_52(int ai_0, double ad_4, double ad_12)



    ... le pusiera a secas.


    void f0_52()
    Pues que en el scope de esa función (área de visibilidad de la misma) el EA solo puede "ver" 3 tipos de variables:
    1 - Las que hayas declarado al principio en el scope global para todo el EA (fuera de todas las llaves de todas las funciones).
    2 - Las locales que hayas declarado dentro de las llaves de esa función.
    3 - Las que le hayas pasado como atributo (que es este caso).

    Si no se las pasas, dentro de esa función no tendrías ni el ticket ni el Sl que quieres poner ni el Tp, ya que éstos los has calculado con variables declaradas localmente en otras funciones, pero en esta función en concreto no tienes esos valores ni podrías ver esas variables, ya que no están declaradas en el scope global. No podrías modificar la orden, por tanto, ¿qué ticket le ibas a poner???, tendrías que hacer de nuevo una selección de órdenes como la que te hace en la otra función desde donde llama a ésta, y entonces calcular el SL y el TP, pero entonces repetirías el código y los cálculos 2 veces y el EA sería más lento y menos eficiente. Si ya los has calculado en otra función y ésta es solo para que ejecute la modificación de la orden, pues lo mejor es que le pases los valores calculados y no volver a calcularlos. Y esta función, con esos valores, solo se dedica a modificar la orden cuyo ticket le has enviado, para ponerle el SL y el TP que también le has enviado.

    Un abrazo.
    Foro de Forex Trading United

     

  9. #8
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 309
    Créditos: 50

    Re: .... Funciones personalizadas.


    Publi
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    Casi , casi lo tengo.

    Ahora mismo no .... porque llevo un dolor de cabeza increíble ... pero sé que mañana, cuando me levante lo asimilaré.... lo sé.


    Muchas gracias por todo.


    Me voy a dormir.


    Saludos.


    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Foro de Forex Trading United

     

Publi
Publi


Aviso Legal
Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal