David Diez  

Hola a todos, tengo problemas con esta función HardSL() para limitar las pérdidas pues parece que no siempre cierra en el porcentaje fijado en los parámetros pudiendo incluso caer hasta el stop out. Éste es el código que he programado:

void HardStop(){
   double TotalProfit=0,TotalLoss=0;
   double SymbolProfit=0,SymbolLoss=0;
   for(int i=0;i<PositionsTotal();i++){
      ulong iTicket=PositionGetTicket(i);
      double Balance=AccountInfoDouble(ACCOUNT_BALANCE);
      double PosProfit=PositionGetDouble(POSITION_PROFIT);
      if(PositionGetInteger(POSITION_MAGIC)==MagicNumber){
         TotalProfit+=PosProfit;if(TotalProfit<0){TotalLoss=TotalProfit;}
         if(PositionGetString(POSITION_SYMBOL)==_Symbol){
            SymbolProfit+=PosProfit;if(SymbolProfit<0){SymbolLoss=SymbolProfit;}
            }
         }
      if(HardStopLoss>0){ // Positive value sets HardSL true.
         if(MathAbs(TotalLoss)>=HardStopLoss*Balance/100){
            if(!trade.PositionClose(iTicket,ULONG_MAX)){
               Print("PositionClose error ",trade.ResultRetcode());
               return;
               }
            else{i--;}
            }
         //break;
         }
      }
   }

Aquí un ejemplo en OHLC,M1 de la curva que me da para un límite de pérdidas al 24%:

Como he mencionado, algunas caídas superan el porcentaje fijado y al final termina por stop out.

¿Alguna idea sobre qué está fallando aquí? Gracias de antemano.

Miguel Angel Vico Alba  
David Diez:

Usa Comment o Print y asegúrate de que está calculando todos los valores correctamente.

De todas formas en OHLC M1 por su propia naturaleza nunca es exacto y cuanto mayor sea el balance de la cuenta y por ende el volumen, mayor será el desfase.

En 1 minuto puede haber un desfase de varios pips que se traduce a decenas, cientos o incluso miles de $ según el caso.

David Diez  
Comentario #:
hola. estoy en MT4 hace poco tiempo y tengo ploblemas al colocar SL o TP o modificar orden.En todos los casos aparece la ventana pero no me permite ejecutar.Cual puede ser el problema???

Qué pasa contigo tío, abre tu propio hilo! jajaja

David Diez  
Miguel Angel Vico Alba #:

Usa Comment o Print y asegúrate de que está calculando todos los valores correctamente.

De todas formas en OHLC M1 por su propia naturaleza nunca es exacto y cuanto mayor sea el balance de la cuenta y por ende el volumen, mayor será el desfase.

En 1 minuto puede haber un desfase de varios pips que se traduce a decenas, cientos o incluso miles de $ según el caso.

Hola Miguel, gracias por tu respuesta. El caso es que he tocado y retocado el código de mil maneras y no consigo que funcione correctamente, te muestro dos resultados idénticos en Tick y OHLC:

OHLC

Todos los ticks

Esta vez el riesgo es del 20%:

      if(HardStopLoss==true){
         //HardStop=(int)MathRound(RiskFactor*MathPow(1.618,5));
         if(MathAbs(TotalProfit)>=20*Balance/100){ // HardStop.
            if(!trade.PositionClose(iTicket,ULONG_MAX)){
               Print("PositionClose error ",trade.ResultRetcode());
               return;
               }
            else{i--;}
            }
         //break;
         }
David Diez  

Edito: está programado para operar en la apertura de una nueva barra (M1), después de haber sacado la función de Stop() fuera de la condición NewBar() tengo resultados muy diferentes. Ahí estaba el problema.

Quiero aprovechar para lanzar otra pregunta:

Si un sistema se llega a multiplicar por 8 en poco tiempo como es el caso y, digamos que una vez al año, la cuenta se quema inevitablemente, ¿habría alguna forma de sacarle rendimiento mediante retiros periódicos? He visto una estrategia parecida con el Hamster que convenció a mucha gente.

Miguel Angel Vico Alba  
David Diez #:

Vayamos por partes...

Normaliza los números (NormalizeDouble), eso lo primero. Después como te comente yo usaría Comments y en el modo visual me aseguraría que cada cálculo como el balance, el resultado del TotalProfit, etc, lo está dando correctamente.

También date cuenta de que estás usando un void... asegurate de llamarlo en el momento correcto. Lo mejor es que el muestreo lo haga tick a tick sin ser llamado. Simplemente que si la input del HardSL es mayor a cero, que entre en juego la función sin necesidad de ser llamada y que por lo que sea no lo estés llamando correctamente.

Y por último...usa TesterWithdrawal() para simular retiros.

David Diez  
Miguel Angel Vico Alba #:

Vayamos por partes...

Normaliza los números (NormalizeDouble), eso lo primero. Después como te comente yo usaría Comments y en el modo visual me aseguraría que cada cálculo como el balance, el resultado del TotalProfit, etc, lo está dando correctamente.

También date cuenta de que estás usando un void... asegurate de llamarlo en el momento correcto. Lo mejor es que el muestreo lo haga tick a tick sin ser llamado. Simplemente que si la input del HardSL es mayor a cero, que entre en juego la función sin necesidad de ser llamada y que por lo que sea no lo estés llamando correctamente.

Y por último...usa TesterWithdrawal() para simular retiros.

Creo que la única manera de hacerlo bien (otra cosa es que luego dé mejores resultados haciéndolo mal), es insertar la llamada aquí:

   if(TestMode==CurrentSymbol){
      if(NewBar(Symbol())){
         Trade(Symbol());
         }
      HardStop();
      }
   return;

Porque NewBar trabaja sólo la apertura en M1, y así se provoca el deslizamiento que comentabas.

De todas formas voy a probar sólo normalizando los valores porque esos 8000 euros que daba son muy golosos.

Razón de la queja: