Descargar MetaTrader 5

¿Cómo copiar señales con la ayuda de un asesor según sus propias normas?

13 junio 2016, 18:18
Vladimir Karputov
0
1 519

Índice

 

Advertencia sobre riesgos

Antes de aplicar este método hay que apoyarse ante todo en el sentido común, ya que el aumento del coeficiente de copiado conllevará el aumento de posibles riesgos.

El método del aumento del coeficiente de copiado de una señal se puede aplicar cuando el proveedor comercia con un lote mínimo, usted tiene en los ajustes establecida una carga sobre el depósito del 95% (es decir, el uso máxino del depósito), y aun así el coeficiente de copiado de operaciones es de todas formas demasiado pequeño para que tenga sentido utilizar una suscripción. Podrá conocer de antemano el futuro coeficiente de copiado de las operaciones al suscribirse a una señal que le guste con la ayuda del artículo Calculadora de señales.

El asesor-ayudante de copiado de señales comerciales presentado en este artículo se puede descargar del Mercado de forma gratuita:


1. Preparación

Antes de comenzar a trabajar, por favor, eche un vistazo a estos vídeos tutoriales:

  1. Elegir una señal comercial
  2. Suscribirse a una señal
  3. Alquiler de un hosting virtual
  4. Migración de suscripciones y asesores al hosting virtual


1.1. La idea del copiador

El copiador funciona en el hosting virtual, en la cuenta comercial que está suscrita a la señal. Su principal tarea es aumentar las posiciones que abre el servicio "Señales" en la cantidad establecida de veces. En la fig. 1 se muestra la idea de un copiador fijado a una cuenta con cobertura:


Fig. 1. Idea del copiador en una cuenta con cobertura

La fig. 2 demuestra la idea de un copiador trabajando en una cuenta comercial con un registro de posición basado en la compensación:

 

Fig. 2 Idea de un copiador en una cuenta con compensación 

De esta forma, en cuanto el servicio "Señales" realice con éxito una operación en la cuenta del suscriptor, el copiador ejecutará la operación de inmediato, cuyo volumen se determina con la fórmula:

(volumen de la operación realizada por el servicio "Señales") * "Deal multiply by"

El parámetro "Deal multiply by", responsable de la cantidad de veces que hay que aumentar las operacioenes, se define en los parámetros de entrada:


Fig. 3. Parámetros de entrada 

Al trabajar en una cuenta comercial con compensación en MetaTrader 5, las acciones del copiador conllevan el aumento del volumen de la posición copiada. En una cuenta comercial con cobertura en MetaTrader 5, las acciones del copiador conllevan la apertura de una nueva posición con un aumento del volumen. Más abajo se muestra un ejemplo del funcionamiento del copiador para las cuentas con compensación y cobertura de MetaTrader 5, en este se ha elegido un parámetro de aumento de las operaciones "Deal multiply by" igual a 5 :

Acciones del servico "Señales" Acciones del copiador en
una cuenta con cobertura
Acciones del copiador en
una cuenta con compensación
Se ha copiado una operación de BUY EURUSD de 0.01 lote Se ha abierto una nueva posición de BUY EURUSD de 0.05 lote, de esta forma el suscriptor tiene dos posiciones, BUY EURUSD de 0.01 lote y BUY EURUSD de 0.06 lote Se ha abierto una operación de BUY EURUSD de 0.05 lote, de esta forma, el suscriptor tiene una posición de BUY EURUSD de 0.06 lote

 

2. Peculiaridades del servicio "Señales"

2.1. Propio - ajeno

Puesto que el copiador realiza un seguimiento de todas las operaciones que efectúa el servicio "Señales", será necesario conocer ciertas particularidades del funcionamiento del servicio "Señales". Por ejemplo, este servicio solo acompaña "sus propias" posiciones, aquellas que han sido copiadas a través del servicio.

El servicio "Señales", si el suscriptor abre con éxito una posición, anota en los comentarios a la operación el nombre de la señal que se ha copiado, y en el campo Magic Number de la operación, un identificador único.

En consecuencia, será precisamente por este identificador con el que se reconocerán las operaciones abiertas a través del servicio "Señales" en las siguientes sincronizaciones de la suscripción.

Este es el aspecto de un comentario para la operación BUY 0.01 EURUSD, copiada de la señal "Test3443431", si ponemos el cursor del ratón en la operación copiada, en la pestaña "Historia" de la ventana "Instrumentos" :

 

Fig. 4. Comentarios de la operación copiada (pestaña "Historia")

Aquí en la figura tenemos:

  1. "#69801797" — ticket de la operación;
  2. "Test3443431" — nombre de la señal desde la que se ha copiado esta operación;
  3. "361104976048745684" — Magic Number — identificador de la operación.

En la pestaña "Trading"  se puede ver que la posición actual del suscriptor tiene la misma descripción, solo que sin ticket:


Fig. 5. Comentario de la operación copiada (pestaña "Trading")

En otras palabras, el servicio "Señales" realiza el registro de posiciones del lado del suscriptor a través del campo Magic Number de la operación. Las posiciones registradas se reconocerán como "propias". Solo con sus "propias" posiciones el servicio de "Señales" puede realizar semejantes acciones comerciales: cambiar el volumen de la posición o cerrar una posición.

Las posiciones no registradas se reconocerán como "ajenas". El servicio "Señales" no tiene poder alguno sobre tales posiciones.

2.2. ¿Reemplazar el Número Mágico o no hacerlo?

En el terminal MetaTrader 5 se puede conectar tanto una cuenta comercial con cobertura, como una con compensación. Dependiendo del tipo de cuenta conectada, el comportamiento del copiador en lo que respecta a la sustitución del Número Mágico de la posición copiada se diferenciará de forma cardinal. Para responder a esta cuestión, veremos la figura siguiente:


Fig. 6. Cuenta con compensación sin sustiruir el Número Mágico 

Como se puede ver, en la cuenta con compensación, el copiador ha aumentado la posición sin sustituir el Número Mágico, y esto ha conllevado que la posición se convirtiera en "ajena" para el servicio "Señales". Es decir, el funcionamiento del copiador en una cuenta con compensación sin sustitción del Número Mágico es un error. Esto significa que en la cuenta con compensación el copiador, al aumentar la posición, siempre deberá sustituir el Número Mágico. En lo que respecta a la cuenta con cobertura, todo funciona al contrario: cuando aumenta la posición, el copiador debe poner su propio Número Mágico

2.3. ¿Qué sucederá con una posición "ajena" si el proveedor cierra la posición?

Un ejemplo de una cuenta con cobertura: en la cuenta comercial del suscriptor se ha copiado una posición BUY 0.01 EURUSD. Después el suscriptor ha decidido intervenir en el trabajo del servicio y ha abietro una posición BUY 0.01 EURUSD. Durante una de las siguientes sincronizaciones, el servicio "Señales" ha dado el error siguiente:

Signal  '3447880': local positions do not correspond to signal provider [#85639429 buy 0.04 EURUSD 1.11697]

Es decir, la posición BUY 0.01 EURUSD, que el suscriptor ha abierto manualmente, ha sido valorada por parte del servicio "Señales", como "ajena". Ahora veamos qué sucederá cuando el proveedor cierra su posición: el servicio "Señales" también cerrará "su propia" posición, pero la posición abierta manualmente BUY 0.01 EURUSD  permanecerá en el terminal. Por cierto, sobre la inconveniencia de intervenir en el funcionamiento del servicio "Señales" se habla directamente en las nromas:

IV. Suscripción a las señales

   20. La ejecución de sus propias operaciones de trading en una cuenta suscrita a una Señal se considera como una intervención y puede llevar a unas consecuencias impredecibles.


3. Cómo detectar la aparición de una operación

El método de detección de la aparición de una operación, por una parte influye en la velocidad de reacción del copiado, y por otra, puede conllevar gastos financieros adicionales en forma de pago del spread en el caso de abrir por error una operación con volumen aumentado.

Conviene recordar que estamos suscritos a una señal, y esto significa que el servicio "Señales" realizará el seguimiento de los eventos comerciales del proveedor de la señal. En caso necesario, este servicio abrirá o cerrará una posición/posiciones. Cualquier apertura/cierre de posición/posiciones conlleva un cambio en la cuenta comercial del suscriptor. Y precisamente este cambio vamos a monitorear con la ayuda del evento OnTradeTransaction().

3.1. Seguimiento a través de OnTradeTransaction()

¿Por qué hemos elegido OnTradeTransaction(), y no OnTrade()? Porque OnTradeTransaction() incluye una información muy útil: el tipo de transacción comercial. De todos los tipos posibles de transacción a nosotros solo nos interesa uno:

TRADE_TRANSACTION_DEAL_ADD, la adición de la operación a la historia. Se efectúa como resultado de la ejecución de una orden o la realización de operaciones en una cuenta con balance.

Es decir, el copiador espera el momento cuando la operación se añada a la historia (y esto es una garantía de la ejecución de una operación comercial con éxito en la cuenta del suscriptor), y solo después comenzará a procesar la situación. 


4. Cuándo la suscripción es posible, y cuándo no

La suscripción puede tener éxito solo si ambas cuentas tienen el mismo sistema de registro:

Suscripción Resultado
Proveedor - cuenta con compensación, suscriptor - cuenta con cobertura

Cualquier intento de suscribirse a un proveedor con un sistema de compensación de registro desde una cuenta comercial con sistema de cobertura de registro, terminará en fracaso. 

2016.05.11 11:15:07.086 Signal  '*******': subscribe to signal [*****] started
2016.05.11 11:15:07.141 Signal  '*******': subscription/renewal prohibited

Cuando el proveedor tiene una cuenta con compensación y el suscriptor tiene una con cobertura, no se podrá formalizar la suscripción.

Proveedor: registro con cobertura, suscriptor: - registro con compensación

Cualquier intento de suscribirse a un proveedor con un sistema de cobertura de registro en una cuenta comercial con sistema de compensación de registro, terminará en fracaso. 

2016.05.11 11:39:54.506 Signal  '*******': subscribe to signal [******] started
2016.05.11 11:39:54.560 Signal  '*******': subscription/renewal prohibited

Cuando el proveedor tiene una cuenta con cobertura y el suscriptor tiene una con compensación, no se puede formalizar la suscripción.

Proveedor: registro con cobertura, suscriptor: registro con cobertutra Suscripción exitosa. 
Proveedor - registro con compensación, suscriptor - registro con compensación Suscripción exitosa. 

5. Guardando la información sobre el copiado

¿Dónde es mejor guardar la información sobre las copias realizadas? Y una pregunta más global: ¿es necesario en general guardar esa información? En esta versión del copiador, he decidido guardar la información sobre las copias en la estructura. Declarando una estructura:

//+------------------------------------------------------------------+
//| Structure of congruences of positions of the terminal and        |
//| positions of the copier                                          |
//+------------------------------------------------------------------+
struct correlation
  {
   long              POSITION_IDENTIFIER_terminal; // Position identifier (terminal)
   //+------------------------------------------------------------------+
   //| Position identifier is a unique number that is assigned          |
   //| to every newly opened position and doesn't change during         |
   //| the entire lifetime of the position.                             |
   //| Position turnover doesn't change its identifier.                 |
   //+------------------------------------------------------------------+
   double            POSITION_VOLUME_terminal;     // Volume of the position opened by the Signals service
   long              POSITION_IDENTIFIER_copier;   // Position identifier (copier)
   //+------------------------------------------------------------------+
   //| Position identifier is a unique number that is assigned          |
   //| to every newly opened position and doesn't change during         |
   //| the entire lifetime of the position.                             |
   //| Position turnover doesn't change its identifier.                 |
   //+------------------------------------------------------------------+
   ulong             DEAL_ticket;                  // Deal ticket, if the deal is executed.
  };

En la estructura solo hay cuatro elementos:  

  1. "POSITION_IDENTIFIER_terminal" — en este elemento se guarda el identificador de la posición que ha abierto el terminal (servicio "Señales")
  2. "POSITION_VOLUME_terminal" —  aquí se guarda el volumen de la posición que ha abierto el terminal (servicio "Señales")
  3. "POSITION_IDENTIFIER_copier" — en este elemento se guarda el identificador de la posición que ha abierto el copiador
  4. "DEAL_ticket" — aquí se anota el ticket de la operación que ha abierto el copiador, si esta operación ha resultado con éxito

El copiador realiza todas las acciones solo desde la función OnTradeTransaction, y solo si el tipo de transacción comercial es igual a TRADE_TRANSACTION_DEAL_ADD. De cumplirse estas condiciones, siempre buscaremos la operación que haya generado esta transacción, y obtendremos sus parámetros:

//+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      double   deal_volume       =0;
      string   deal_symbol       ="";
      long     deal_type         =0;
      long     deal_magic        =0;
      long     deal_positions_id =0;
      string   deal_comment      ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_volume=HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_positions_id=HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);
         deal_comment=HistoryDealGetString(trans.deal,DEAL_COMMENT);
         //if(deal_magic==0 && SignalInfoGetString(SIGNAL_INFO_NAME)!=HistoryDealGetString(trans.deal,DEAL_COMMENT))
         //   return;
        }
      else
         return;
...

En el recuadro mostrado más abajo se representa la lógica del funcionamiento del copiador con cuentas con cobertura y compensación:

el símbolo  significa que en este elemento de la estructura se ha hecho una anotación

el símbolo  significa que el copiador no ha introducido cambios en los elementos de la estructura

Terminal POSITION_IDENTIFIER terminal POSITION_VOLUME terminal POSITION_IDENTIFIER copier deal_ticket
Cobertura. Compensación. DEAL_ENTRY_IN
Búsqueda según el elemento de la estructura deal_ticket del valor trans.deal.
Si no hay coincidencias: aumentamos la estructura en 1 ... 0 0 0 0
... y lo valoramos como una operación del servicio, por eso abrimos la posición (DEAL_VOLUME * coeficiente), y siCTrade.ResultDeal() != 0, entonces anotamos en el elemento POSITION_IDENTIFIER_terminal el valorDEAL_POSITION_ID, el valor CTrade.ResultDeal() lo anotamos en el elemento deal_ticket, y deal_volume, en POSITION_VOLUME_terminal. 0
Si lo encontramos, significa que es una operación abierta por el copiador, por eso anotamos su DEAL_POSITOIN_ID en el elemento POSITION_IDENTIFIER_copier.

Cobertura. Compensación. DEAL_ENTRY_OUT
Búsqueda DEAL_POSITION_ID en los elementos de la estructura POSITION_IDENTIFIER_terminal y POSITION_IDENTIFIER_copier
Cobertura.
... hemos encontrado DEAL_POSITION_ID...
... ... en el elemento POSITION_IDENTIFIER_copier, no hacemos nada y salimos  ✔  ✔  ✔  ✔
... ... en el elemento POSITION_IDENTIFIER_terminal –...  ✔  ✔  ✔  ✔
... ... ... ¿esta posición aún existe? Si existe, cerramos la posición abierta por el copiador...  ✔  ✔  ✔  ✔
... ... ... ... abrimos la posición (volumen de la posición localizada * coeficiente) y si CTrade.ResultDeal() != 0, entonces anotamos el valor CTrade.ResultDeal() en el elemento deal_ticket.  ✔  ✔  ✔  ✔
... ... ... no, esta posición ya no existe. Cerramos la posición abierta por el copiador.  ✔  ✔  ✔  ✔
Compensación.
... hemos encontrado DEAL_POSITION_ID...
... ... en el elemento POSITION_IDENTIFIER_terminal  (en este momento en la estructura se guarda el volumen anterior, abierto por el servicio "Señales") calculamos el nuevo volumen, y si CTrade.ResultDeal() != 0, entonces anotamos el valor CTrade.ResultDeal() en el elemento deal_ticket.  ✔  ✔  ✔  ✔

Conclusión

Si usted se ha suscrito a una señal comercial y ha alquilado un hosting virtual incorporado, pero el proveedor comercia con un lote mínimo (o muy pequeño), usted podrá enviar el copiador que se analiza en este artículo al hostig virtual incorporado, y de esta forma, todas las operaciones aumentarán de forma proporcional a los ajustes del copiador.

Atención: el archivo del copiador "copier.mq5" y el archivo de inclusión "languages.mqh" deberán encontrarse en la misma carpeta.


Traducción del ruso hecha por MetaQuotes Software Corp.
Artículo original: https://www.mql5.com/ru/articles/2438

Archivos adjuntos |
Copier.mq5 (18.85 KB)
Languages.mqh (6.19 KB)
Creando un ayudante para el comercio manual Creando un ayudante para el comercio manual

El número de robots comerciales para trabajar en los mercados de divisas está creciendo últimamente como una bola de nieve. En ellos se implementan diferentes conceptos y estrategias, pero nadie ha conseguido hasta el momento crear una muestra perfecta de inteligencia artificial que nunca tenga pérdidas. Por eso, muchos tráders se mantienen fieles al comercio manual. Precisamente para esos especialistas se crean los ayudantes robotizados, los llamados paneles comerciales. Este artículo es otro ejemplo más de la creación de un panel comercial partiendo "desde cero".

Hablando de nuevo sobre los mapas de Kohonen Hablando de nuevo sobre los mapas de Kohonen

El artículo describe los métodos de funcionamiento de los mapas de Kohonen. Le resultará interesante tanto a los investigadores del mercado con habilidades básicas de programación en MQL4 y MQL5, como a los programadores expertos que sufren dificultades con la aplicación de los mapas de Kohonen en sus proyectos.

Por dónde comenzar a crear un robot comercial para la Bolsa de Moscú MOEX Por dónde comenzar a crear un robot comercial para la Bolsa de Moscú MOEX

Muchos tráders de la Bolsa de Moscú querrían automatizar sus algoritmos comerciales, pero no saben por dónde empezar. El lenguaje MQL5 propone no solo un conjunto enorme de funciones comerciales, sino también clases preparadas, que facilitan al máximo los primeros pasos en el trading automático.

Interfaces gráficas V: Control "Lista" (Capítulo 2) Interfaces gráficas V: Control "Lista" (Capítulo 2)

En el primer capítulo de la quinta parte de la serie hemos desarrollado las clases para la creación de los controles como la barra de desplazamiento vertical y horizontal. En este artículo vamos a aplicarlas en la práctica. Esta vez diseñaremos la clase para la creación del control “Lista”, y la barra de desplazamiento vertical será su parte integrante.