Errores:
- El bucle debe ser invertido.
- PositionSelect debe ser eliminado del código.
Errores:
- El bucle debería invertirse.
- PositionSelect debería eliminarse del código.
Argumentos para el estudio.
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?
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.

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
eaBreakeven:
Autor: Alexey Lopatin