Mira cómo descargar robots gratis
¡Búscanos en Twitter!
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

Función para calcular el tamaño del lote a partir del riesgo por depósito - Asesor Experto para MetaTrader 5

Visualizaciones:
221
Ranking:
(4)
Publicado:
Exp_get_vol.mq5 (8.38 KB) ver
MQL5 Freelance ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

price_open - precio de apertura de una operación;

price_stoploss - precio del nivel de stop-loss;

risk_percent_equity - riesgo por operación en porcentaje del depósito;

double GetVolByRisk(double price_open, double price_stoploss, double risk_percent_equity)
  {
   double volume = {};
   double margin_risk = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100;
   double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
   double tick_value = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE);
   double min_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   double max_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);
   double lot_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
   double delta_stoploss = MathAbs(price_open - price_stoploss);
   double margin_risk_1lot = delta_stoploss / tick_size * tick_value;
   volume =  margin_risk / margin_risk_1lot;
   volume = MathFloor(volume / lot_step) * min_lot;
   if(volume == 0)
      volume = min_lot;
   if(volume > max_lot)
      volume = max_lot;
   return volume;
  }

Ejemplo de un Asesor Experto que opera aleatoriamente con esta función

input int stoploss_points = 100;/stop loss en pips
input double risk_percent_equity = 1;//riesgo en porcentaje del depósito
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE order_type = ORDER_TYPE_BUY;
double equity_open = {};
double profit_expected = {};
bool pos_open = false;
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!pos_open)
     {
      MqlTradeRequest request;
      MqlTradeCheckResult result_check;
      MqlTradeResult result_trade;
      ZeroMemory(request);
      ZeroMemory(result_check);
      ZeroMemory(result_trade);
      double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
      if(order_type == ORDER_TYPE_BUY)
         order_type = ORDER_TYPE_SELL;
      else
         order_type = ORDER_TYPE_BUY;
      if(order_type == ORDER_TYPE_BUY)
        {
         request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
         request.type = ORDER_TYPE_BUY;
         request.sl = request.price - tick_size * stoploss_points;
         request.tp = request.price + tick_size * stoploss_points;
        }
      else
        {
         request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
         request.type = ORDER_TYPE_SELL;
         request.sl = request.price + tick_size * stoploss_points;
         request.tp = request.price - tick_size * stoploss_points;
        }
      double volume = GetVolByRisk(request.price, request.sl, risk_percent_equity);
      request.action = TRADE_ACTION_DEAL;
      request.symbol = Symbol();
      request.volume = volume;
      request.deviation = 5;
      profit_expected = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100;
      equity_open = AccountInfoDouble(ACCOUNT_EQUITY);
      if(OrderCheck(request, result_check))
        {
         OrderSend(request, result_trade);
         pos_open = true;
        }
     }
  }
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
     {
      HistoryDealSelect(trans.deal);
      ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
      if(deal_entry == DEAL_ENTRY_OUT)
        {
         Print("==========");
         Print("volume= ", trans.volume);
         Print("equity_open= ", equity_open);
         Print("equity_close= ", AccountInfoDouble(ACCOUNT_EQUITY));
         Print("profit expected= +/- ", profit_expected);
         Print("profit real= ", HistoryDealGetDouble(trans.deal, DEAL_PROFIT));
         Print("==========");
         pos_open = false;
        }
     }
  }
//+------------------------------------------------------------------+
double GetVolByRisk(double price_open, double price_stoploss, double risk_percent_equity)
  {
   double volume = {};
   double margin_risk = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100;
   double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
   double tick_value = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE);
   double min_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   double max_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);
   double lot_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
   double delta_stoploss = MathAbs(price_open - price_stoploss);
   double margin_risk_1lot = delta_stoploss / tick_size * tick_value;
   volume =  margin_risk / margin_risk_1lot;
   volume = MathFloor(volume / lot_step) * min_lot;
   if(volume == 0)
      volume = min_lot;
   if(volume > max_lot)
      volume = max_lot;
   return volume;
  }
//+------------------------------------------------------------------+


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

    ATR Cycles ATR Cycles

    Un filtro de volatilidad basado en 3 ATR: un ATR rápido, un ATR medio y un ATR lento.

    KA-Gold Bot MT5 KA-Gold Bot MT5

    KA-Gold Bot es un avanzado asesor de trading diseñado específicamente para el oro, que utiliza la potente combinación de la estrategia del canal de Keltner y dos medias móviles exponenciales (EMA): la EMA de 10 periodos y la EMA de 200 periodos. Principio de funcionamiento: La EMA de 10 periodos representa el corte del precio medio por encima/por debajo de la banda de Keltner, confirmando una tendencia alcista/bajista. Que el precio esté por encima de la EMA de 200 periodos apoya la tendencia alcista/bajista. Esto indica que la tendencia alcista/bajista ha sido más fuerte que en los 10 periodos anteriores, teniendo en cuenta la volatilidad de los últimos 50 periodos. - Marco temporal: M15

    MathTicker - generador de ticks en modo matemático MathTicker - generador de ticks en modo matemático

    Registra los ticks en modo ticks reales y los lee en modo matemático llamando a tu estrategia con cada tick.

    SAR ADX Signal SAR ADX Signal

    Señal SAR ADX con notificación móvil, reescrito de la versión MT4 (fuente ya no se encuentra). Este es un indicador repintable, por favor tenga cuidado al usarlo.