Mira cómo descargar robots gratis
¡Búscanos en Telegram!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Asesores Expertos

Money Fixed Margin - Asesor Experto para MetaTrader 5

Visualizaciones:
939
Ranking:
(27)
Publicado:
2017.04.27 16:30
Actualizado:
2018.02.22 13:43
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Ejemplo de cálculo del tamaño del lote con un nivel fijo de margen. Es decir, si establecemos un 10%, se abrirá un tamaño del margen que será el 10% del margen libre.

Parámetros de entrada:

  • StopLoss (in pips) — nivel de StopLoss
  • % risk — tamaño del margen de la posición, en tanto por ciento del margen libre

Para la simulación comercial se ha organizado el siguiente ciclo:

   static long count=-21;
   if(count%980==0) // we pass 980 tics
     {
      //--- getting lot size for open long position (CMoneyFixedMargin)

El valor inicial count=-21 se establece únicamente para el "calentamiento" del simulador de estrategias. A continuación, se calcula el resto de la división de la variable count por el número 980 (una cifra tomada al azar). En otras palabras, cada 980 ticks se realiza la pasada en el ciclo de cálculo del lote teniendo en cuenta los riesgos de la transacción.

El propio ciclo de cálculo de lote dependiendo del riesgo de la transacción (cálculo para la posición Buy) representa:

Primer paso

      //--- getting lot size for open long position (CMoneyFixedMargin)
      double sl=0.0;
      double check_open_long_lot=0.0;
      //--- variant #1: StopLoss=0.0
      sl=0.0;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=0.0",
            ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", Balance: ",    DoubleToString(m_account.Balance(),2),
            ", Equity: ",     DoubleToString(m_account.Equity(),2),
            ", FreeMargin: "DoubleToString(m_account.FreeMargin(),2));
      //--- variant #2: StopLoss!=0.0
      sl=m_symbol.Bid()-ExtStopLoss;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=",DoubleToString(sl,m_symbol.Digits()),
            ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", Balance: ",    DoubleToString(m_account.Balance(),2),
            ", Equity: ",     DoubleToString(m_account.Equity(),2),
            ", FreeMargin: "DoubleToString(m_account.FreeMargin(),2));
      if(check_open_long_lot==0.0)
         return;

en la variable check_open_long_lot con la ayuda del método CheckOpenLong de la clase CMoneyFixedMargin obtenemos el tamaño calculado del lote para la posición Buy teniendo en cuenta el StopLoss:

      double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss);

En el diario de expertos se imprimen estos parámetros: el StopLoss, el tamaño calculado del lote dependiendo del riesgo de la transacción, el balance de la cuenta comercial en el momento del cálculo, la cantidad de recursos en la cuenta en el momento del cálculo, el tamaño de los recursos reservados como fianza en el momento del cálculo. 

Si el cálculo ha retornado el valor "0.0", salimos:

      if(check_open_long_lot==0.0)
         return;

Segundo paso

En la variable chek_volime_lot con la ayuda del método CheckVolume de la clase CTrade obtenemos el tamaño del lote para la posición Buy, para la que nos bastarán los recursos. Aquí rehacemos estos parámetros: m_symbol.Name() nombre del símbolo, check_open_long_lot volumen de la posición que queremos abrir (este parámetro lo hemos calculado con anterioridad): 

      //--- check volume before OrderSend to avoid "not enough money" error (CTrade)
      double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY);

Tercer paso

Si el método CheckVolume ha retornado algo diferente a "0.0", tenemos que comprobar la condición: no tenemos suficientes recursos para abrir una posición del lote calculado teniendo en cuenta el riesgo.

      if(chek_volime_lot!=0.0)
         if(chek_volime_lot>=check_open_long_lot)
            m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss,m_symbol.Bid()+ExtStopLoss);
      else
         Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_long_lot,2),
               ", CTrade lot = ",DoubleToString(chek_volime_lot,2));

Si hay recursos suficientes, abrimos las posiciones, si no los hay, en el diario de expertos se registrará el tamaño del lote calculado teniendo en cuenta el riesgo de la transacción (DoubleToString(check_open_long_lot,2)) y el tamaño de lote para el que hay recursos suficientes (DoubleToString(chek_volime_lot,2)).

Ejemplo de apertura de posición Buy, con un 10% de riesgo en el margen libre:

Money Fixed Margin open.png

En este caso, se registrará en el diario:

Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=0.0, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=1.05792, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade   2016.11.28 00:03:31   instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 (1.06042 / 1.06076 / 1.06042)
Trades  2016.11.28 00:03:31   deal #2 buy 0.28 EURUSD at 1.06076 done (based on order #2)
Trade   2016.11.28 00:03:31   deal performed [#2 buy 0.28 EURUSD at 1.06076]
Trade   2016.11.28 00:03:31   order performed buy 0.28 at 1.06076 [#2 buy 0.28 EURUSD at 1.06076]
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:31   CTrade::OrderSend: instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 [done at 1.06076]

Preste atención a que al calcular el lote dependiendo del riesgo de margen libre, el StopLoss no importa.

Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/17282

Buy sell volume Buy sell volume

Volúmenes Buy y sell.

Corr velocity Corr velocity

Indicador Velocity "corregido" (Momentum suavizado).

RSI EA RSI EA

RSI EA - comercio con los niveles de sobrecompra/sobreventa según el indicador iRSI (Relative Strength Index, RSI).

MA Reverse MA Reverse

Comercio con Moving Average. Comprobando si hay fondos suficientes.