Publi

Publi

Página 1 de 3 123 ÚltimoÚltimo
Resultados 1 al 10 de 25


  1. #1
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 309
    Créditos: 50

    ... Operador return()


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


    Buenas a tod@s.


    LLevo ya unas cuantas semanas estudiando el código MQL4 para intentar aprenderlo.
    Salve decir que nunca he estudiado programación de ningún tipo por lo que la pregunta o cuestión que voy a plantear seguramente les resultará a la mayoría de Ustedes irrisoría pero les aseguro que para mí no lo es.

    Mi duda es sobre el operador return().

    Simplemente quería preguntaros si hay alguna diferencia entre:

    return;
    return();
    return(0);

    A mi me parece que son lo mismo pero he pensado que mejor preguntarlo que no cuesta nada.

    También he leído por ahí, aunque en ingles y medio entendiéndolo, que return(0) retornaría false y return(1) retornaría true. Pero me parece que no es así, y lo abre entendido mal.


    A ver si podeis echarme una mano , please.

    Gracias.
    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: ... Operador return()

    Yo estoy igual que tú, metiéndole mano al código a saco en cuanto tengo un rato, jajaja.

    A ver, depende del tipo de función en la que estén puestas esas return.

    Por ejemplo, en las variables de tipo void, que son aquellas que no retornan nigún valor, es donde se usa :

    return;

    Así a secas, aunque también se podría omitir tal operador de retorno, ya que, el propio cierre de la llave de la función, es decir, el símbolo }, ya implica un return sin valor de retorno alguno. Por eso mucha gente lo que hace es no poner nada y cerrar la función directamente con la llave.

    En cuanto a return(valor que sea); pues obviamente nos retornará el valor que le hayamos asignado en cada caso (siempre que la función no sea de tipo void, claro, según lo que se ha comentado en el párrafo anterior.

    Por otro lado, return(0), retornaría el valor 0, o sea que dependiendo del tipo de función y el valor que estemos calculando en cada caso, nos asignará el valor 0 a la variable que estemos calculando o pidiéndole en la llamada a esa función. Por tanto, puede ser muy diferente a no retornar ningún valor.

    Imagina que tenemos una variable inicializada en valor 0:

    int variable = 0;

    Y en la siguiente línea llamamos a la función :

    Mi funcion();

    Y le asignamos a nuestra variable el valor que nos devuelva esa función:

    variable = Mi funcion();

    Vale, entonces se va a la funcion y nos pondrá en "variable" el valor que le demos en el return.

    En este caso imaginemos la función:

    int Mi funcion() {

    int a = 1;
    int b = 2;
    int c= a+b;

    return(c);
    }

    En este caso, el return nos devuelve el valor c (que en este ejemplo es 1+2, o sea 3) y por tanto nuestra variable quedará con valor 3.

    Es como si hubiésemos puesto arriba : int variable = 3;

    Por tanto, si lo que ponemos en el return es : return(0); la cosa cambia bastente, puesto que le asignamos a nuestra variable el valor 0 y no el resultado de a+b, o sea el valor 3 en este caso (como la teníamos asignada previamente en 0, pues se quedará igualmente en 0, pero imagina que antes de llamar a la función la tuviéramos asignada como valor 30, pues ahora se nos cambiaría a 0, en lugar de al resultado que hemos calculado en nuestra función)..

    Si le ponemos return;
    o bien le ponemos return();

    entonces no nos devolverá ningún valor y por tanto nuestra variable quedará como estaba, es decir, con el valor que tuviera asignado antes de llamar a nuestra función (en este caso la teníamos inicializada en 0, así que seguirá en 0).

    Ahora bien, esto es para las funciones definidas por nosotros en el código, pero existen como todo el mundo sabe unas funciones especiales que son el corazón del EA o indicador (init(), deinit() y start(); o en la nueva versión del código mql4 Oninit(), OnDeinit(), OnTick()). Ok, pues en estas el valor asignado en el return sí que se suele poner 0 (return(0), aunque según he leído en este tipo de funciones especiales da igual el valor que el pongas, porque no va a ningún sitio ese valor.

    Espero haber podido aclarar algo en la medida de mis modestas posibilidades.

    Saludos y abrazos compañero
    Foro de Forex Trading United
    Última edición por robertomar; 25-06-2014 a las 09:24

     

  4. #3
    Avatar de indovinello
    Neanderthalensis


    Reputación:
    Poder de reputación: 17

    Bolivia
    Mensajes: 3.792
    Créditos: 12.975

    Re: ... Operador return()

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


    Buenas a tod@s.


    LLevo ya unas cuantas semanas estudiando el código MQL4 para intentar aprenderlo.
    Salve decir que nunca he estudiado programación de ningún tipo por lo que la pregunta o cuestión que voy a plantear seguramente les resultará a la mayoría de Ustedes irrisoría pero les aseguro que para mí no lo es.

    Mi duda es sobre el operador return().

    Simplemente quería preguntaros si hay alguna diferencia entre:

    return;
    return();
    return(0);

    A mi me parece que son lo mismo pero he pensado que mejor preguntarlo que no cuesta nada.

    También he leído por ahí, aunque en ingles y medio entendiéndolo, que return(0) retornaría false y return(1) retornaría true. Pero me parece que no es así, y lo abre entendido mal.


    A ver si podeis echarme una mano , please.

    Gracias.

    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.
    Foro de Forex Trading United




  5. #4
    Avatar de robertomar
    Heidelbergensis


    Reputación:
    Poder de reputación: 9

    Espana
    Mensajes: 905
    Créditos: 15.929

    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

     

  6. #5
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 309
    Créditos: 50

    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

     

  7. #6
    Avatar de indovinello
    Neanderthalensis


    Reputación:
    Poder de reputación: 17

    Bolivia
    Mensajes: 3.792
    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




  8. #7
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 309
    Créditos: 50

    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; 25-06-2014 a las 21:32

     

  9. #8
    Avatar de robertomar
    Heidelbergensis


    Reputación:
    Poder de reputación: 9

    Espana
    Mensajes: 905
    Créditos: 15.929

    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; 26-06-2014 a las 08:19

     

  10. #9
    Avatar de Vinisius
    Erectus


    Reputación:
    Poder de reputación: 5

    Espana
    Mensajes: 309
    Créditos: 50

    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

     

  11. #10
    Avatar de robertomar
    Heidelbergensis


    Reputación:
    Poder de reputación: 9

    Espana
    Mensajes: 905
    Créditos: 15.929

    Re: ... Operador return()


    Publi
    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

     

Página 1 de 3 123 ÚltimoÚltimo
Publi
Publi


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