Metatrader 4 ... Operador return()

 

Publi

... Operador return()

 

Publi

Resultados 1 al 10 de 26


Vista híbrida

  1. #1

    Re: ... Operador return()

    Cita Iniciado por indovinello Ver mensaje
    Toda función debe devolver un valor de acuerdo con el tipo de la misma. Por ejemplo:

    int MiFuncion()

    Debe devolver un entero en todos los casos.

    Al utilizar la sentencia return dentro del código de la función estás indicando que quieres salir de la misma y, entre paréntesis especificas el valor. Por tanto, mejor especificarlo, el código es más claro.

    Ahora bien, el lenguaje permite ciertos atajos como los que indicas como son que un return, si va sin valor, devuelve un valor por defecto o bien, diferentes tipos de cast como es el caso de funciones lógicas que has mencionado que devuelven valores como 0 ó 1.

    Saludos.

    Solo añadir que, toda función, excepto si es una función de tipo void. Las de tipo void, como sabes mucho mejor que yo están hechas precisamente para eso, para que no retornen ningún valor. (Es porque cualquier lapsus puede llevar a confusión a nuestro amigo y a gente que parte de cero, como yo mismo estaba hace 4 días, y casi que sigo estando, jajajaja).

    Saludos campeón
    Foro de Forex Trading United

  2. #2
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 12

    Espana
    Mensajes: 312
    Créditos: 126

    Re: ... Operador return()

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

    Muchas gracias robertomar y indovinello.

    Os he dado reputación a ambos.

    He entendido perfectamente el 99% de lo que me habéis explicado.

    Según entiendo para una función personalizada ... si se pone return(0) si que importa según las variables que hayamos referenciado por que devuelve el valor 0. Además debe ser del tipo referenciado int, double, bool , date time, string (no sé si me dejo alguno).

    Si es de tipo void se puede omitir el return por que este tipo de función no retorna nada. En todo caso si ponemos return, return() o return(0) no ocurriría nada porque no cogería ningún valor ¿correcto?. ¿no daría ningún tipo de error ?... ¿simplemente ignoraria el return (lo que sea) ?.

    Pero si es tipo Función especial Oninit(), OnDeinit(), OnTick()) si debe ponerse obligatoriamente el operador return al acabar la función especial pero dá igual poner return; () (0) (1) (2) etc... porque en estas funciones especiales no coge ningún valor que pueda haber entre paréntesis después del return , ¿correcto?.

    Los del tipo boleano no los entiendo muy bién. Seguramente se utilizaran en la mayoría de los casos los condicionantes if y else. Pero el valor de retorno para false debe ser return(false) o return(0) y para true debe ser return(true) o return(1) ??? . ¿podríais ponerme algún ejemplo para el tipo boleano ?.

    Gracias. Ya casi lo tengo.

    Saludos.
    Foro de Forex Trading United

  3. #3
    Avatar de indovinello



    Reputación:
    Poder de reputación: 24

    Bolivia
    Mensajes: 3.773
    Créditos: 12.975

    Re: ... Operador return()

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

    Muchas gracias robertomar y indovinello.

    Os he dado reputación a ambos.

    He entendido perfectamente el 99% de lo que me habéis explicado.

    Según entiendo para una función personalizada ... si se pone return(0) si que importa según las variables que hayamos referenciado por que devuelve el valor 0. Además debe ser del tipo referenciado int, double, bool , date time, string (no sé si me dejo alguno).

    Si es de tipo void se puede omitir el return por que este tipo de función no retorna nada. En todo caso si ponemos return, return() o return(0) no ocurriría nada porque no cogería ningún valor ¿correcto?. ¿no daría ningún tipo de error ?... ¿simplemente ignoraria el return (lo que sea) ?.

    Pero si es tipo Función especial Oninit(), OnDeinit(), OnTick()) si debe ponerse obligatoriamente el operador return al acabar la función especial pero dá igual poner return; () (0) (1) (2) etc... porque en estas funciones especiales no coge ningún valor que pueda haber entre paréntesis después del return , ¿correcto?.

    Los del tipo boleano no los entiendo muy bién. Seguramente se utilizaran en la mayoría de los casos los condicionantes if y else. Pero el valor de retorno para false debe ser return(false) o return(0) y para true debe ser return(true) o return(1) ??? . ¿podríais ponerme algún ejemplo para el tipo boleano ?.

    Gracias. Ya casi lo tengo.

    Saludos.
    El return debería existir en todos los casos, es la manera de decir al compilador que salga de la función, aunque pueda haber alguna versión del compilador que admita otro tipo de salida.

    Si la función retorna void, no importa, el return debe existir para salir de la función, aunque, en ese caso no hay que retornar nada.

    Repecto a las funciones que retornan un valor lógico, pues hay que especificar un return(true) ó return(false) . Lo que pasa es que internamente el compilador los maneja como integers. Algunos programadores se valen de esa "anomalía" del compilador y especifican return(1) ó return(0) respectivamente.

    SAludos.
    Foro de Forex Trading United




  4. #4
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 12

    Espana
    Mensajes: 312
    Créditos: 126

    Re: ... Operador return()

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


    No veo claro respecto a la función tipo boleano... si retornar return(false) y return(0) sería valido tanto uno como el otro para darle el valor a la función tipo bool, como pasaría también con return(true) y return(1) equivaldría a lo mismo. Osea, pregunto si daria igual poner una cosa o la otra.

    ¿ return es la manera de decir al compilador que salga de la función ? ... yo pensaba que el return lo que hace es darle un valor a la función y quien realmente le dice al compilador que salga es la última llave } de la función.... no el operador return.

    ¿Me estoy equivocando ?.


    Gracias. Un saludo.

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Foro de Forex Trading United
    Última edición por Vinisius; 21:32 a las


  5. #5

    Re: ... Operador return()

    Efectivamente Vinisius, tal como te comenté y tal como tú también comentas en el post anterior, el cierre de la llave implica implícitamente un return a secas sin valor o expresión asignado (que es como hay que hacerlo con las variables void). Por eso en tales variables mucha gente no pone return por ninguna parte.

    Aquí el enlace donde lo explica: Return Operator - MQL4 Documentation


    Si le asignas un valor en el return a una varibale void, dependiendo del compilador y de si le has metido arriba el modificador de compatibilidad del lenguaje viejo con el nuevo (denominado #property strict), unas veces te dará error y otras te dará alerta pero no error. Pero vamos que no asignes ningún valor (no le pongas return(0) a una void, sino return a secas o cierre de llave directamente).

    OJO!!, que en lenguaje viejo las funciones init(), deinit() y start() eran de tipo int, por lo que tenían que retornar valor, pero en el código nuevo OnDeinit(), OnStart() y OnTick() han de ser de tipo void forzosamente, por lo que no deben retornar valor alguno (puedes poner el return a secas o no poner nada, sino el cierre de llave directamente), y la función OnInit() puede ser void o int, según lo que se necesite, por lo que debería retornar valor o no, según se haya definido.

    Respecto a las bool, efectivmante, según ésto, parece que da lo mismo si le pones true que 1, y también da igual si le pones false que 0, tal como te comenta Indovinello: Bool Type - MQL4 Documentation

    Creo que esas eran las preguntas por el momento, o me dejé alguna???, jajaja

    Saludos y abrazos
    Foro de Forex Trading United
    Última edición por robertomar; 08:19 a las


  6. #6
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 12

    Espana
    Mensajes: 312
    Créditos: 126

    Re: ... Operador return()

    Muchas gracias robertomar.


    Osea si declaro una variable tipo boleana la puedo referenciar con true o false o 0 o 1.

    ¿ Pero indistintamente ?. Quiero decir:

    Declaro variable tipo boleano .... bool prueba=FALSE.

    Luego en el código puedo ponerle su valor numérico, por ejemplo cambiarle el valor de FALSE a true ... prueba=1
    Y si le cambio nuevamente el valor puedo ponerlo igualmente en valor númerico ... por ejemplo para volverlo de nuevo a FALSE estaría bién así ... prueba=0.

    ¿ De las 2 maneras estaría bién aunque en un principio la variable haya sido declarada con FALSE y no con 0 ?.


    Estoy destripando Robots y en uno de tipo martingala donde cuando se llega a la última progresión se abre otra operación en sentido contrario con el mismo numero de lotes en forma de protección y luego el trader manualmente decide si cerrar las operaciones o no. Pués bién, me encuentro lo siguiente:

    Declara una variable al comienzo de tipo integer (int). Esta decompilado (por eso salen esos nombres raros).

    int gi_196 = 0;


    Salta a la luz que no es del tipo boleano. Pero cuando me lo vuelvo a encontrar en el código parece que sea boleano ... no lo entiendo.

    Todas las referencias:

    if (gi_196 == FALSE) {
    Comment("\nCopyright 2011\n", "Cuenta Forex:", AccountServer(),
    "\n", "Fecha: ", Month(), "-", Day(), "-", Year(), " Hora servidor: ", Hour(), ":", Minute(), ":", Seconds());
    }

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

    if (ticket_0 == 0 && gi_196 == FALSE) {
    if (ticket_8 != 0) OrderDelete(ticket_8);
    if (ticket_16 != 0) OrderDelete(ticket_16);
    price_32 = Ask - gi_208 * Point;
    if (gi_208 <= 0) price_32 = 0;
    price_40 = Ask + gi_204 * Point;
    g_ticket_112 = OrderSend(Symbol(), OP_BUY, g_lots_144, Ask, 0, 0, 0, "COMPRA ", num_magic, 0, CLR_NONE);
    if (g_ticket_112 > 0) {
    OrderSelect(g_ticket_112, SELECT_BY_TICKET);
    OrderModify(OrderTicket(), OrderOpenPrice(), price_32, price_40, 0, CLR_NONE);
    }

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

    if (ticket_4 == 0 && gi_196 == FALSE) {
    if (ticket_12 != 0) OrderDelete(ticket_12);
    if (ticket_20 != 0) OrderDelete(ticket_20);
    price_32 = Bid + gi_208 * Point;
    if (gi_208 <= 0) price_32 = 0;
    price_40 = Bid - gi_204 * Point;
    g_ticket_112 = OrderSend(Symbol(), OP_SELL, g_lots_144, Bid, 0, 0, 0, "VENTA ", num_magic, 0, CLR_NONE);
    if (g_ticket_112 > 0) {
    OrderSelect(g_ticket_112, SELECT_BY_TICKET);
    OrderModify(OrderTicket(), OrderOpenPrice(), price_32, price_40, 0, CLR_NONE);
    }

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

    Y así unos cuantos más de if (ticket_? == 0 && gi_196 == FALSE { ... etc

    Pero es que además, luego más adelante en el codigo, cambia su valor a TRUE. Si está declarado como integer como es que se comporta como tipo boleano ?.



    for (int pos_160 = 0; pos_160 < OrdersTotal(); pos_160++) {
    if (OrderSelect(pos_160, SELECT_BY_POS, MODE_TRADES)) {
    if (OrderMagicNumber() == num_magic && gi_196 == FALSE && Max_Protec == TRUE) {
    if (OrderType() == OP_BUY) g_order_lots_160 = OrderLots();
    if (OrderType() == OP_SELL) g_order_lots_168 = OrderLots();
    if (g_order_lots_160 == MaxiLot) {
    f0_0();
    g_lots_224 = 2.0 * (g_order_lots_160 - g_order_lots_168);
    g_ticket_112 = OrderSend(Symbol(), OP_SELL, g_lots_224, Bid, 0, 0, 0, "PROTECCION COMPRAS", num_magic, 0, CLR_NONE);
    for (pos_152 = 0; pos_152 < OrdersTotal(); pos_152++) {
    bool sel4=OrderSelect(pos_152, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol() && OrderType() == OP_BUY && ticket_0 != 0 && OrderMagicNumber() == num_magic) bool mod4=OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, CLR_NONE);
    }
    Comment("\n Trading en cuenta : " + AccountNumber() + " ¡PROTEGIENDO COMPRAS! ");
    gi_196 = TRUE;
    }
    if (g_order_lots_168 == MaxiLot) {
    f0_0();
    g_lots_224 = 2.0 * (g_order_lots_168 - g_order_lots_160);
    g_ticket_112 = OrderSend(Symbol(), OP_BUY, g_lots_224, Ask, 0, 0, 0, "PROTECCION VENTAS", num_magic, 0, CLR_NONE);
    for (pos_152 = 0; pos_152 < OrdersTotal(); pos_152++) {
    bool sel5=OrderSelect(pos_152, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol() && OrderType() == OP_SELL && ticket_4 != 0 && OrderMagicNumber() == num_magic) bool mod5=OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, CLR_NONE);
    }
    Comment("\n Trading en cuenta : " + AccountNumber() + " ¡PROTEGIENDO VENTAS! ");
    gi_196 = TRUE;
    }
    }
    }
    }
    } else {
    Comment("ROBOT PARADO");
    return;
    }
    return;
    }


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

  7. #7

    Re: ... Operador return()

    Pues en este caso no lo se compañero, nunca había visto una variable bool definida como int, quizá sea por lo que te dijo Indovinello, que las bool internamente las maneja como int con únicamente 2 valores (0 = false y 1 = true), y por tanto han aprovechado eso y la han definido así, desconozco el motivo o el objetivo.

    Tendría que ver todo el código, o bien también puedes hacer una cosa, arriba donde la define, prueba a cambiarla (le pones bool gi_196 = 0, o bool gi_196 = false) y ver si todo funciona igual o no.

    De momento no se me ocurre otra cosa, jajaja.

    Saludos y abrazos
    Foro de Forex Trading United

  8. #8
    Avatar de indovinello



    Reputación:
    Poder de reputación: 24

    Bolivia
    Mensajes: 3.773
    Créditos: 12.975

    Re: ... Operador return()

    Cita Iniciado por Vinisius Ver mensaje
    Muchas gracias robertomar.


    Osea si declaro una variable tipo boleana la puedo referenciar con true o false o 0 o 1.

    ¿ Pero indistintamente ?. Quiero decir:

    Declaro variable tipo boleano .... bool prueba=FALSE.

    Luego en el código puedo ponerle su valor numérico, por ejemplo cambiarle el valor de FALSE a true ... prueba=1
    Y si le cambio nuevamente el valor puedo ponerlo igualmente en valor númerico ... por ejemplo para volverlo de nuevo a FALSE estaría bién así ... prueba=0.

    ¿ De las 2 maneras estaría bién aunque en un principio la variable haya sido declarada con FALSE y no con 0 ?.


    Estoy destripando Robots y en uno de tipo martingala donde cuando se llega a la última progresión se abre otra operación en sentido contrario con el mismo numero de lotes en forma de protección y luego el trader manualmente decide si cerrar las operaciones o no. Pués bién, me encuentro lo siguiente:

    Declara una variable al comienzo de tipo integer (int). Esta decompilado (por eso salen esos nombres raros).

    int gi_196 = 0;


    Salta a la luz que no es del tipo boleano. Pero cuando me lo vuelvo a encontrar en el código parece que sea boleano ... no lo entiendo.

    Todas las referencias:

    if (gi_196 == FALSE) {
    Comment("\nCopyright 2011\n", "Cuenta Forex:", AccountServer(),
    "\n", "Fecha: ", Month(), "-", Day(), "-", Year(), " Hora servidor: ", Hour(), ":", Minute(), ":", Seconds());
    }

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

    if (ticket_0 == 0 && gi_196 == FALSE) {
    if (ticket_8 != 0) OrderDelete(ticket_8);
    if (ticket_16 != 0) OrderDelete(ticket_16);
    price_32 = Ask - gi_208 * Point;
    if (gi_208 <= 0) price_32 = 0;
    price_40 = Ask + gi_204 * Point;
    g_ticket_112 = OrderSend(Symbol(), OP_BUY, g_lots_144, Ask, 0, 0, 0, "COMPRA ", num_magic, 0, CLR_NONE);
    if (g_ticket_112 > 0) {
    OrderSelect(g_ticket_112, SELECT_BY_TICKET);
    OrderModify(OrderTicket(), OrderOpenPrice(), price_32, price_40, 0, CLR_NONE);
    }

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

    if (ticket_4 == 0 && gi_196 == FALSE) {
    if (ticket_12 != 0) OrderDelete(ticket_12);
    if (ticket_20 != 0) OrderDelete(ticket_20);
    price_32 = Bid + gi_208 * Point;
    if (gi_208 <= 0) price_32 = 0;
    price_40 = Bid - gi_204 * Point;
    g_ticket_112 = OrderSend(Symbol(), OP_SELL, g_lots_144, Bid, 0, 0, 0, "VENTA ", num_magic, 0, CLR_NONE);
    if (g_ticket_112 > 0) {
    OrderSelect(g_ticket_112, SELECT_BY_TICKET);
    OrderModify(OrderTicket(), OrderOpenPrice(), price_32, price_40, 0, CLR_NONE);
    }

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

    Y así unos cuantos más de if (ticket_? == 0 && gi_196 == FALSE { ... etc

    Pero es que además, luego más adelante en el codigo, cambia su valor a TRUE. Si está declarado como integer como es que se comporta como tipo boleano ?.



    for (int pos_160 = 0; pos_160 < OrdersTotal(); pos_160++) {
    if (OrderSelect(pos_160, SELECT_BY_POS, MODE_TRADES)) {
    if (OrderMagicNumber() == num_magic && gi_196 == FALSE && Max_Protec == TRUE) {
    if (OrderType() == OP_BUY) g_order_lots_160 = OrderLots();
    if (OrderType() == OP_SELL) g_order_lots_168 = OrderLots();
    if (g_order_lots_160 == MaxiLot) {
    f0_0();
    g_lots_224 = 2.0 * (g_order_lots_160 - g_order_lots_168);
    g_ticket_112 = OrderSend(Symbol(), OP_SELL, g_lots_224, Bid, 0, 0, 0, "PROTECCION COMPRAS", num_magic, 0, CLR_NONE);
    for (pos_152 = 0; pos_152 < OrdersTotal(); pos_152++) {
    bool sel4=OrderSelect(pos_152, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol() && OrderType() == OP_BUY && ticket_0 != 0 && OrderMagicNumber() == num_magic) bool mod4=OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, CLR_NONE);
    }
    Comment("\n Trading en cuenta : " + AccountNumber() + " ¡PROTEGIENDO COMPRAS! ");
    gi_196 = TRUE;
    }
    if (g_order_lots_168 == MaxiLot) {
    f0_0();
    g_lots_224 = 2.0 * (g_order_lots_168 - g_order_lots_160);
    g_ticket_112 = OrderSend(Symbol(), OP_BUY, g_lots_224, Ask, 0, 0, 0, "PROTECCION VENTAS", num_magic, 0, CLR_NONE);
    for (pos_152 = 0; pos_152 < OrdersTotal(); pos_152++) {
    bool sel5=OrderSelect(pos_152, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol() && OrderType() == OP_SELL && ticket_4 != 0 && OrderMagicNumber() == num_magic) bool mod5=OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, CLR_NONE);
    }
    Comment("\n Trading en cuenta : " + AccountNumber() + " ¡PROTEGIENDO VENTAS! ");
    gi_196 = TRUE;
    }
    }
    }
    }
    } else {
    Comment("ROBOT PARADO");
    return;
    }
    return;
    }


    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Sí, indistintamente, pero mejor no lo hagas por que cuando otra persona con tu misma duda lea el código volverá a estar en la misma situación de incertidumbre: el código,cuanto más pulcro y claro mejor.

    Un integer también puede comportarse como un booleano. El compilador sabe hacer "cast" de tipos cuando estos son compatibles, pero habitualmente lanza un warning. Los cast funcionan bien Casi siempre, pero hay veces que un cast puede llevar a un bug o malfuncionamiento del programa.

    Saludos.
    Foro de Forex Trading United




This website uses 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.
     

 

Publi


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