Asesores Expertos: eaBreakeven

 

eaBreakeven:

Este Asesor Experto pasa el Stop Loss de la posición al punto muerto.

Autor: Alexey Lopatin

 

Errores:

  1. El bucle debe ser invertido.
  2. PositionSelect debe ser eliminado del código.

 
fxsaber:

Errores:

  1. El bucle debería invertirse.
  2. PositionSelect debería eliminarse del código.


Argumentos para el estudio.

 
Alexey Lopatin:

Argumentos, por favor.

Se necesita mucho tiempo para explicar sobre el bucle. Y PositionSelect es innecesario después de PositionGetSymbol, porque la selección ya se ha hecho, si LastError está bien. Pero PositionSelect también es malo en una cuenta de cobertura.

La mejor opción es usar siempre este en lugar de los anteriores.

if (PositionGetTicket(i))


También latest_price para cualquier dirección de posición podría tomarse a través de POSITION_PRICE_CURRENT.


Y esta condición

if(latest_price.bid-price_open>=Breakeven*point && new_stoploss>stoploss && latest_price.bid-new_stoploss>stop_level)

puede ser activada incluso en casos (debido a las peculiaridades dobles) cuando nada necesita ser modificado.


En general, se puede reescribir un poco más compacto y sin errores. Yo lo haría al estilo MT4.

#include <MT4Orders.mqh>     // https://www.mql5.com/es/code/16006
#include <Price_Compare.mqh> // https://www.mql5.com/es/code/16169

input int    Breakeven           = 15;           //Breakeven en puntos
input int    Distance            = 5;            //Distancia de equilibrio en puntos desde el precio de apertura de la posición
input int    MagicNumber         = 16112017;     //Número mágico
input bool   EnableSound         = true;         /Activar/desactivar la reproducción del sonido cuando se establece el umbral de rentabilidad
input string SoundFile           = "alert1.wav"; //Nombre del archivo de sonido

void OnTick()
{
  DoBreakeven();
}

double GetNewStopLoss()
{
  const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);  
  const double stop_level = SymbolInfoInteger(OrderSymbol(), SYMBOL_TRADE_STOPS_LEVEL) * point;
  
  const double price_open = OrderOpenPrice();
  const double latest_price = OrderClosePrice();  
  const double stoploss = OrderStopLoss();

  double new_stoploss = 0;
  
  //--- Mover el stop-loss al precio de breakven + Distancia, si el beneficio de la posición es mayor que los puntos de Breakeven 
  return(((OrderType() == OP_BUY)  && (CP(latest_price - price_open, point) >= Breakeven * point) &&
                                      (CP(new_stoploss = price_open + Distance * point, point) > stoploss) &&
                                      (CP(latest_price - new_stoploss, point) > stop_level)) ||
         ((OrderType() == OP_SELL) && (CP(price_open - latest_price, point) >= Breakeven * point) &&
                                      ((CP(new_stoploss = price_open - Distance * point, point) < stoploss) || !stoploss) &&
                                      (CP(new_stoploss - latest_price, point) > stop_level))
         ? NormalizeDouble(new_stoploss, (int)SymbolInfoInteger(OrderSymbol(), SYMBOL_DIGITS)) : 0);
}

void DoBreakeven()
{
//Si el umbral de rentabilidad es negativo, desactive la función de umbral de rentabilidad
  if (Breakeven >= 0)      
  //Bucle por posiciones
    for (int i = OrdersTotal() - 1; i >= 0; i--)
      if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (!MagicNumber || (OrderMagicNumber() == MagicNumber)))
      {
        const double new_stoploss = GetNewStopLoss();
        
        if (new_stoploss)      
        {
          if (!OrderModify(OrderTicket(), OrderOpenPrice(), new_stoploss, OrderTakeProfit(), OrderExpiration()))
            Print(GetLastError());
          else if(EnableSound)
            PlaySound(SoundFile);
        }
      }
}
 

Gracias por la respuesta con el ejemplo. Siempre contento de aprender algo nuevo para mí.

Pero aquí sería interesante saber por qué PositionSelect es malo en una cuenta de cobertura?

 
Alexey Lopatin:

Pero aquí sería interesante saber ¿por qué PositionSelect en el recuento de hash es malo?

Porque el símbolo no define unívocamente la posición.

 
caolyhuynh:
 
5000000
 
caolyhuynh: