Carteras Blog        Login      Registrarse        

Síguenos en:   RSS   Facebook  Twitter   Linkedin   

Resultados 1 al 21 de 21
Like Tree1Likes
  • 3 Post By especulator

Tema: Pequeños scripts

  1. #1
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Pequeños scripts

    Aquí voy a ir poniendo pequeños Scripts que nos facilitarán y/o ayudaran en la confección de nuestro robot, si bien hay algunos que son bobadas, otros sin embargo pueden ser de gran utilidad.

    También intentaré explicar que es lo que hace de manera detallada.

    Se aceptan sugerencias y/o comentarios.
    alain, alain and alain like this.

  2. The Following 4 Users Say Thank You to especulator For This Useful Post:

    bocanegra (29/05/2015),LEO91 (27/05/2015),LeoCV (27/05/2015),SrPiPaS (28/05/2015)

  3. #2
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Empezamos por uno que lo que hace es cerrar todas las posiciones abiertas y las pendientes.

    Tal cual está solo hay que copiar y pegar en el MetaEditor y darle a compilar, ccon lo que nos creará el archivo mt4 que será el que hay que poner dentro de la carpeta MQL4/Experts.
    Código:
    //+------------------------------------------------------------------+
    //|                                                  Cerrar_todo.mq4 |
    //+------------------------------------------------------------------+
    
    #property copyright "Elverge"
    #property version   "1.00"
    
    extern int     num_magic =                    0; // SI TENEMOS MAS DE UN ROBOT, HAY QUE CAMBIAR EL NUMERO MÁGICO
    extern bool    Tancar =                   false; // CUANDO QUERAMOS CERRAR LAS POSICIONES SE CAMBIA POR VERDADERO
    
    int start() 
    {
       if (Tancar == true)
       {
          Tancar();
          return (0);
       }
    }
    
    int Tancar()
    {
       int total = OrdersTotal();
       for(int i=total-1;i>=0;i--)
       {
          OrderSelect(i, SELECT_BY_POS,MODE_TRADES);
          if ( OrderMagicNumber() == num_magic)
          {    
             int type   = OrderType();
             bool result = false;
             switch(type)
             {
                //CIERRA COMPRAS
                case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, CLR_NONE );
                                   break;
                //CIERRA VENTAS
                case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, CLR_NONE );
                                   break;
                //CIERRA ORDENES PENDIENTES
                case OP_BUYLIMIT  :
                case OP_BUYSTOP   :
                case OP_SELLLIMIT :
                case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
             }
        
             if(result == false)
             {
                Alert("Order " , OrderTicket() , " fallo al cerrar. Error:" , GetLastError() );
                Sleep(3000);
             }  
          }
       }
      
      return(0);
    }
    Última edición por especulator; 28/05/2015 a las 05:53

  4. The Following User Says Thank You to especulator For This Useful Post:

    LeoCV (27/05/2015)

  5. #3
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Decir que lo he preparado para que actúe como si fuera un robot, por lo que así es funcional al 100% para que cierre las posiciones habria que una vez cargado el EA, en el gráfico botón derecho del ratón-Asesores Expertos- Propiedades ( si pulsamos F7 también nos vale) dentro de propiedades tenemos tres pestañas, Acerca del programa, Común y entradas. En común tiene que estar activada la casilla de permitir operaciones en directo, si no no funcionará nunca ningún EA. La pestaña entradas son los valores que podemos modificar en este caso para cerrar las órdenes tenemos que cambiar donde pone Tradejar el false por el true, para lo que debemos hacer doble clic en donde pone false para que se abra un desplegable y cambiar por true.

  6. #4
    Master del Universo Avatar de BolsiaSicav
    Fecha de ingreso
    26 abr, 15
    Mensajes
    818
    Thanks
    103
    Thanked 157 Times in 136 Posts
    Poder de reputación
    5

    Smile Re: Pequeños scripts

    int start()
    {
    if (Tancar == true)
    {
    Tancar();
    return (0);
    }
    }

  7. #5
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Es que yo programo en Valenciano........

  8. The Following User Says Thank You to especulator For This Useful Post:

    BolsiaSicav (27/05/2015)

  9. #6
    Trader Senior Avatar de LeoCV
    Fecha de ingreso
    19 sep, 14
    Mensajes
    148
    Thanks
    116
    Thanked 32 Times in 25 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Cita Iniciado por BolsiaSicav Ver mensaje
    Código:
    int start() 
    {
        if (Tancar == true) 
        {
            Tancar();
            return (0);
        }
    }
    ¡Que curioso!: En MQL se puede definir una variable y un procedimiento o función con el mismo nombre...

    Por otra parte, una sugerencia: Si envuelves el código con la etiqueta [CODE] no se pierde la indentación, y queda más legible...

  10. The Following User Says Thank You to LeoCV For This Useful Post:

    especulator (28/05/2015)

  11. #7
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Gracias LeoCV, ya lo he editado y ahora queda mucho mejor.

  12. The Following User Says Thank You to especulator For This Useful Post:

    LeoCV (28/05/2015)

  13. #8
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Abrir un BUY,

    Este script tiene poca explicación...... Podemos controlar el tamaño del lote, y el valor del SL y del TP.
    Código:
    //+------------------------------------------------------------------+
    //|                                                          Buy.mq4 |
    //+------------------------------------------------------------------+
    #property copyright ""
    #property link      ""
    
    extern double        Lotes =                   0.1;
    extern int           TP =                     50;
    extern int           SL =                     200;
    int                  ticket =                 0;
    int                  exi_buy =                0;
    int start()
    {
       double         preu_SL;
       double         preu_TP;
    
     // COMPRA
       if (exi_buy == 0) 
       {
          preu_SL = (Bid - SL * Point);
          if (SL <= 0) preu_SL = 0;
          preu_TP = Ask + TP * Point;
          ticket=OrderSend(Symbol(),OP_BUY,Lotes,Ask,0,0,0,"COMPRA",0,0,CLR_NONE);
          exi_buy = 1;
     //MODIFICAMOS SL Y TP
          if(ticket>0)  
          {  
             OrderSelect(ticket,SELECT_BY_TICKET); 
             OrderModify(OrderTicket(),OrderOpenPrice(),preu_SL,preu_TP,0,CLR_NONE);  
          }
       }
       return(0);
    }

  14. #9
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Abrir un SELL,

    Este script igual que el anterior pero abre una venta
    Código:
    //+------------------------------------------------------------------+
    //|                                                         Sell.mq4 |
    //+------------------------------------------------------------------+
    #property copyright ""
    #property link      ""
    
    extern double        Lotes =                    0.1;
    extern int           TP =                       50;
    extern int           SL =                       200;
    int                  ticket =                   0;
    int                  exi_sell =                 0;
    int start()
    {
       double         preu_SL;
       double         preu_TP;
    
     // VENTA
       if (exi_sell == 0) 
       {
          preu_SL = Bid + SL * Point;
          if (SL <= 0) preu_SL = 0;
          preu_TP = Bid - TP * Point;
          ticket = OrderSend(Symbol(), OP_SELL,Lotes,Bid,0,0,0,"VENTA",0, 0, CLR_NONE);
          exi_sell = 1;
     //MODIFICAMOS SL Y TP
          if(ticket>0)  
          {  
             OrderSelect(ticket,SELECT_BY_TICKET); 
             OrderModify(OrderTicket(),OrderOpenPrice(),preu_SL,preu_TP,0,CLR_NONE);  
          }
       }
       return(0);
    }

  15. #10
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Os dejo ahora un script que sirve para que automáticamente nos detecte si trabajamos con una plataforma con 3, 4 o 5 decimales y se ajusten solo los valores del TP y SL. Porqué si utilizamos alguno de los dos anteriores con un Broker que utiliza 5 decimales y le ponemos un TP de 50 pips , realmente le estamos diciendo que ponga un TP de 5 pips, para que lo ponga de 50 pips habría que poner 500, 50 pips seria para un Broker con 4 decimales, por lo que este script nos despreocupa de si tiene 3,4 o 5 decimales.

    Código:
    //+------------------------------------------------------------------+
    //|                                            AJUSTAR DECIMALES.mq4 |
    //|                                                          Elverge |
    //|                                                                  |
    //+------------------------------------------------------------------+
    #property copyright "Elverge"
    #property link      ""
    #property version   "1.00"
    #property strict
    
    double               volumen =               0.0;
    string               valorlote;
    int                  TP=                     0;
    int                  SL=                     0;
    
    extern int           num_magic =             1;
    extern double        Lotes =                 0.1;
    extern int           tp =                    50;
    extern int           sl =                    200;
    
    int init() 
    {
       volumen =     Lotes;
       valorlote = DoubleToStr (volumen, 2);
       if (Digits == 3) 
       {
          TP = 10.0 * tp;
          SL = 10.0 * sl;
       } 
       else 
       {
          if (Digits == 5) 
          {
             TP = 10.0 * tp;
             SL = 10.0 * sl;
          } 
          else 
          {
             TP =  tp;
             SL = sl;
          }
       }
       return (0);
    }

  16. #11
    Trader Senior Avatar de LeoCV
    Fecha de ingreso
    19 sep, 14
    Mensajes
    148
    Thanks
    116
    Thanked 32 Times in 25 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Cita Iniciado por especulator Ver mensaje
    Abrir un BUY,

    Este script tiene poca explicación...... Podemos controlar el tamaño del lote, y el valor del SL y del TP.
    Código:
    //+------------------------------------------------------------------+
    //|                                                          Buy.mq4 |
    //+------------------------------------------------------------------+
    #property copyright ""
    #property link      ""
    
    extern double        Lotes =                   0.1;
    extern int           TP =                     50;
    extern int           SL =                     200;
    int                  ticket =                 0;
    int                  exi_buy =                0;
    int start()
    {
       double         preu_SL;
       double         preu_TP;
    
     // COMPRA
       if (exi_buy == 0) 
       {
          preu_SL = (Bid - SL * Point);
          if (SL <= 0) preu_SL = 0;
          preu_TP = Ask + TP * Point;
          ticket=OrderSend(Symbol(),OP_BUY,Lotes,Ask,0,0,0,"COMPRA",0,0,CLR_NONE);
          exi_buy = 1;
     //MODIFICAMOS SL Y TP
          if(ticket>0)  
          {  
             OrderSelect(ticket,SELECT_BY_TICKET); 
             OrderModify(OrderTicket(),OrderOpenPrice(),preu_SL,preu_TP,0,CLR_NONE);  
          }
       }
       return(0);
    }
    Tengo dudas (soy nuevo en esto)...

    1. En el parámetro Slippage de OrderSend pones 0. ¿No se tiene en cuenta, por si el precio de compra resulta ser mucho mayor del esperado?
    2. Tras ejecutar la orden, si es correcta, veo que ajustas los valores de Stop Loss (SL) y Take Profit (TP). ¿No lo podías haber hecho en el OrderSend, pues esta sentencia de MQL tieen dos parámetros para ello?
    3. ¿En qué se miden SL y TP?, porque los multiplicas por la variable Point. ¿O es que Point es igual a pip?

  17. #12
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    La estructura de la función OrderSend() es la siguiente:

    int OrderSend (
    string symbol,
    int cmd,
    double volume,
    double price,
    int slippage,
    double stoploss,
    double takeprofit,
    string comment=NULL,
    int magic=0,
    datetime expiration=0,
    color arrow_color=CLR_NONE)

    Detallo cada parametro a continuación:

    int OrderSend: Lo primero que vemos de esta función, es que devuelve un numero entero cuando se ejecuta. Si la orden se ejecuta exitosamente, devuelve el número de la orden. Viene a ser como el identificador único de esa orden con el que más adelante podremos modificar o cerrar esta orden. Si la orden es rechazada, la función devolverá -1. Para saber por qué se dio el error hay que utilizar la función GetLastError();.

    Parámetros de OrderSend();

    symbol: En este parámetro hay que colocar la divisa en la que queremos operar y tiene que ser un string. Por ejemplo, “EURUSD” “EURJPY” “USDJPY”. Pero es más fácil utilizar la función Symbol() que nos devuelve automáticamente la divisa donde está funcionando el EA.

    cmd: Acá colocamos el tipo de operación que queremos efectuar. Hay unas constantes que simplifican eso, aunque también se pueden colocar los números directamente.
    Serian:
    OP_BUY 0 Buy o compra
    OP_SELL 1 Sell o venta
    OP_BUYLIMIT 2 Orden pendiente BUY LIMIT
    OP_SELLLIMIT 3 Orden pendiente SELL LIMIT
    OP_BUYSTOP 4 Orden pendiente BUY STOP
    OP_SELLSTOP 5 Orden pendiente SELL STOP

    volume: Es la cantidad de lotes con los que queremos operar.

    price: Es el precio en el que vamos a comprar o vender o colocar una orden pendiente. Puede darse el caso que el precio cambio desde que se hace la petición hasta que se es aceptada. Si esto pasa la orden se rechaza. Pero para solucionar este problema hay una opción que es dar un rango de desviación del precio permitido.

    slippage: slippage o desvío. Siguiendo con el parámetro anterior, “price”, uno tiene la opción de dar un rango de desviación del precio. Por ejemplo si el precio está en 1.561 y cambia un pip a 1.562 o a 1.560, uno puede dar un slippage de 1 pip para que acepte este rango de precios.

    stoploss: Acá uno coloca el stop loss, ósea el precio donde uno quiere para la perdida y la posición entra en perdidas.

    takeprofit: Acá uno coloca el limite o takeprofit. Ósea el precio donde uno quiere cerrar la posición en ganancia si la posición está dando beneficios.

    comment: Esta es par que aparezca un coemntario cuando pasamos con el raton encima de la orden.

    magic: Decíamos que la función OrderSend() si es aceptada por el servidor, devuelve como una especie de numeró de identificación. Con el parámetro magic, pasa algo parecido. Uno puede colocar un número propio para identificar la orden. La idea es que sea mas fácil encontrar la identificación de una orden si utilizamos mas de un ronbot hay que poner el número mágico distinto para que solo opere en el robot deseado y no en todas las ordenes.

    expiration: Acá uno puede colocar una fecha para que se cierre la posición automáticamente. Algunos broker no permiten esto. Si se coloca 0 o se deja en blanco que es lo mismo, no pasa nada y la posición solo se cierra cuando nosotros le indiquemos.

    arrow_color: Acá indicamos el color de la flecha que indica donde se abrió la posición. Si no se coloca nada o se coloca CLR_NONE que es lo mismo, no se muestra la flecha.


    Respecto al desvío, al ser una orden directa, es decir la hago yo, no lo tengo en cuenta ya que no me importa demasiado, si estuviera programando un robot, si que podría poner un desvío de 5 pips.

    El SL y TP no se pueden poner directamente en la orden porque los Brokers ECN no lo permiten, no dejan que lances la orden con los parámetros puestos, por lo que hay que lanzar la orden para posteriormente modificarla..... Cuestión de normativa.....

    La variable point, tiene que ver con los decimales que tiene el PAR que estamos tradeando, no es lo mismo el EUR/USD que el NZD/JPY no tienen los mismos decimales por lo que el point es para adecuar la orden a los decimales.
    Última edición por especulator; 29/05/2015 a las 17:24

  18. The Following 2 Users Say Thank You to especulator For This Useful Post:

    bocanegra (29/05/2015),LeoCV (29/05/2015)

  19. #13
    Trader Senior Avatar de LeoCV
    Fecha de ingreso
    19 sep, 14
    Mensajes
    148
    Thanks
    116
    Thanked 32 Times in 25 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Una explicación tremendamente detallada. Muchas gracias, especulator.

    Por cierto, espero que también seas Elverge, por el copyright del primer script, jejeje...

  20. #14
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    De nada hombre.
    Si, si, elverge y especulator somos la misma persona, de hecho si te fijas en el avatar es la cara y la cruz de la ptimera Peseta rubia.

  21. The Following User Says Thank You to especulator For This Useful Post:

    LeoCV (29/05/2015)

  22. #15
    elverge
    Guest Avatar de elverge

    Re: Pequeños scripts

    Lo ves, somos la cara y la cruz.

    La verdad es que Elverge ( que es el apodo familiar) es el nick que utilizaba en los foros de Forex y el de especulator lo utilixo solo en este foro, pero ya no se quien es el bueno o el malo.....

  23. #16
    Trader Senior Avatar de LeoCV
    Fecha de ingreso
    19 sep, 14
    Mensajes
    148
    Thanks
    116
    Thanked 32 Times in 25 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Cita Iniciado por elverge Ver mensaje
    Lo ves, somos la cara y la cruz.

    La verdad es que Elverge ( que es el apodo familiar) es el nick que utilizaba en los foros de Forex y el de especulator lo utilixo solo en este foro, pero ya no se quien es el bueno o el malo.....
    Muy original lo del avatar, pero eso del bueno y el malo me recuerda un poco a Jekyll y Hyde... Por si las moscas, perdona si me separo un poco de tí... Jejeje

  24. #17
    Trader Senior Avatar de LeoCV
    Fecha de ingreso
    19 sep, 14
    Mensajes
    148
    Thanks
    116
    Thanked 32 Times in 25 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    En el EA de pruebas que estoy preparando abría posiciones con OrderSend(Symbol(), OP_BUY, ...), y las cerraba con OrderSend(Symbol(), OP_SELL, ...), y en el proceso me preguntaba para qué podría servir el "ticket" que devolvía la función. Al utilizar el "Strategy Tester" de Metatrader he visto que lo que en realidad hacía era abrir posiciones largas y cortas, respectivamente....

    He mirado tu ejemplo de cerrar posiciones y ahora ya está claro el tema: He de cerrar la posición con OrderClose, utilizando como parámetro ese "ticket" que hasta ahora no me había valido para nada....

    Asi que: Un nuevo hurra por este tema...

  25. #18
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    De eso se trata, de ir aprendiendo cosas poco a poco con ejemplos prácticos, poco a poco voy a ir juntando todo para crear un pequeño EA semiautomático que podria servir de base para un EA totalmente automatizado.

  26. #19
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    una cosa que hay que tener claro es que si queremos iniciar algo, ya sea un script o queremos inicializar variables utilizaremos

    Código:
    int init()
    {
    }
    Esta función solo se ejecuta una vez, mientras que para el cuerpo del programa debemos utilizar:

    Código:
    int start()
    {
    }

  27. #20
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Este script es muy cómodo para no estar pendiente de la pantalla, ya que lo que hace es enviarnos un correo electrónico cuando ocurre determinada acción, yo he puesto que me avise cuando llegue a x € de pérdida, pero se puede cambiar por otra cosa.

    Código:
    //+------------------------------------------------------------------+
    //|                                               AVISO PÉRDIDAS.mq4 |
    //|                                                          Elverge |
    //|                                                                  |
    //+------------------------------------------------------------------+
    #property copyright " "
    #property link      " "
    #property version   "1.00"
    
    
    double         orden_abierta=              0.0;
    int            perdidas =                  0;
    
    
    extern int     Perdidas =                  50;
    
    int OnInit()
      {
          orden_abierta = (AccountBalance() - AccountEquity());
          if (ordren_abierta >= Perdidas) 
          { 
             perdidas = AccountProfit ();
             if (NovaBarra())SendMail( " PERDIDAS ALTAS ", "  en la cuenta : " +AccountNumber() +Symbol() +" hay unas perdidas de aproximadamente "  + perdidas + " euros");
          }
       return(INIT_SUCCEEDED);
      }
    bool NovaBarra()
    {
       static datetime ti = 0;
       if (ti != Time[0])
       {
          ti = Time[0]; Sleep(100);
          return(true);
       }
       return(false);
    }

  28. #21
    Master del Universo Avatar de especulator
    Fecha de ingreso
    09 nov, 12
    Ubicación
    Ontinyent (Valencia)
    Mensajes
    765
    Thanks
    10
    Thanked 147 Times in 111 Posts
    Poder de reputación
    5

    Re: Pequeños scripts

    Para configurar la plataforma para que nos envíe un correo seria:

    Pestaña Herramientas/opciones y se abrirá una ventana tal como la que detallo a continuación:

    -configurar-correo.png

    luego le damos al botón probar y nos deberá de enviar un correo de prueba si todo ha sido Ok,

    de esta manera ya tenemos configurado el servidor de correo para lo que necesitemos.

  29. The Following User Says Thank You to especulator For This Useful Post:

    LeoCV (02/06/2015)

Información de tema

Usuarios viendo este tema

Actualmente hay 1 usuarios viendo este tema. (0 miembros y 1 visitantes)

Marcadores

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •