Comprobación de la apertura de la vela - página 4

 
GumRai:

Pequeño cambio ya que se estaba comprobando el cierre de una orden cuando no la había.

Según el código no hay razón para que se abra una venta inmediatamente que se cierre una compra.

La condición para salir de una compra no es la misma que las condiciones para abrir una venta .

Recuerde que como sólo está comprobando la apertura de la vela, Close[0] será el valor de la oferta del primer tick recibido para la vela.

Hola GumRai,

Me preguntaba si podrías/deseas ayudarme un poco más con mi código. Si pudieras decirme qué códigos debo mirar, intentaré codificarlo yo mismo primero y luego volveré con cualquier pregunta.

Lo que quiero es que una vez que se coloque una operación, ponga un Stop loss en, digamos, 50 pips (que es lo que hace ahora). Sin embargo, una vez que el precio se mueve 60 pips en la dirección del comercio, se mueve SL a breakeven, y más adelante se convierte en un trailing stop 70 pips de distancia del comercio.

¿Cómo puedo hacer esto? Como siempre, cualquier ayuda será muy apreciada.

 

Para el punto de equilibrio, siempre muevo el SL al punto de equilibrio + 1 punto como mínimo. Así se evitan posibles problemas de comparación de dobles en comprobaciones posteriores

Se trata simplemente de comprobar 2 condiciones (para una compra)

OrderOpenPrice()>OrderStopLoss()

y

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

luego modificar la orden para que el SL sea el precio de apertura +1 punto o la cantidad que decida bloquear.

Para una venta son las condiciones opuestas, pero también se debe codificar para tener en cuenta si el SL es 0 inicialmente

OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()==0 
 
GumRai:

Para el punto de equilibrio, siempre muevo el SL al punto de equilibrio + 1 punto como mínimo. Así se evitan posibles problemas de comparación de dobles en comprobaciones posteriores

Se trata simplemente de comprobar 2 condiciones (para una compra)

y

luego modificar la orden para que el SL sea el precio de apertura +1 punto o la cantidad que decida bloquear.

Para una venta son las condiciones opuestas, pero también se debe codificar para tener en cuenta si el SL es 0 inicialmente

Muchas gracias. De hecho, lo que voy a hacer es añadir suficientes puntos para que justo (aproximadamente) cubra el coste del corretaje de la operación.

Para la segunda línea... ¿por qué utilizaría Orderclose price-OrderOpenPrice? No entendí bien ese código. ¿No debería usar Bid-OrderOpenPrice, ya que eso rastrearía cuánto se ha movido el precio?

¿Estoy cerca de lo que estoy haciendo aquí abajo?

 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

He declarado la comisión arriba como un externo. Y he utilizado Bid en su lugar.

Editar:

Así que supongo (basado en lo que he encontrado a continuación) que el código que he publicado arriba es incorrecto? Encontré lo siguiente en el libro/ayuda de MQL4... Parece ser sólo un trailing stop, mientras que lo que necesito es un Breakeven stop primero, seguido de trailing stop. ¿Cómo puedo modificar esto?

 int TrailingStop = 50;
               //--- modifies Stop Loss price for buy order 
            if(TrailingStop>0)
               {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
                if(Bid-OrderOpenPrice()>Point*TrailingStop)
                {
                if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                  bool res =OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,clrNONE);
                   if(!res)
                        Print("Error in OrderModify. Error code=",GetLastError());
                     else
                        Print("Order modified successfully.");
                    }
                 }
                 }
 
 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

Todo tu bloque de código es condicional a que BuyTicket==-1

Si se abre una orden, entonces BuyTicket no será = -1, por lo que no se hará ninguna comprobación para pasar a BE mientras la operación esté abierta.

if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))

¿Qué tiene que ver el número de ticket con el precio?

Debe seleccionar una orden antes de usar OrderOpenPrice()

OrderClosePrice() es el Bid en el momento en que la orden es seleccionada para una compra, ask para una venta. (mientras la orden sigue abierta)

 
SharkWaters:

Así que supongo (basado en lo que he encontrado a continuación) que el código que he publicado anteriormente es incorrecto? Encontré lo siguiente en el libro/ayuda de MQL4... Parece ser sólo un trailing stop, mientras que lo que necesito es un Breakeven stop primero, seguido de un trailing stop. ¿Cómo puedo modificar esto?

  int BreakEvenPoints=50;
  double BE_Decimal=BreakEvenPoints*Point;
//--- modifies Stop Loss price for buy order 
  if(BreakEvenPoints>0)
  {
   OrderSelect(BuyTicket,SELECT_BY_TICKET);
   if(Bid-OrderOpenPrice()>BE_Decimal)
     {
      if(OrderStopLoss()<OrderOpenPrice())
        {
         bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),
                              OrderTakeProfit(),0,clrNONE);
         if(!res)
            Print("Error in OrderModify to BE. Error code=",GetLastError());
         else
            Print("Order modified to BE successfully.");
        }
     }
  }
Pruebe esto
 
GumRai:
Prueba esto

Gracias por los puntos. He hecho los cambios necesarios. Cuando compilo, muestra una alerta de que "el valor de retorno de 'OrderSelect' debe ser comprobado". Esto, extrañamente, se traduce en que sólo se activa una compra y luego para el resto es un código de error 4108 de nuevo. La venta funciona bien (no he hecho ningún cambio al respecto).

Aquí está toda la sección del código de la compra, por si estoy haciendo algo mal - pero esa parte no debería ser, ya que todo lo que he añadido es este código en el medio. El resto estaba como antes, que funcionaba perfectamente bien. ¿Qué estoy haciendo mal aquí?

int start()
  {
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
               }
           }
   //Stop Order Modify for buy starts here
         int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                 }
              }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }
        

Actualización:

Busqué en Google un poco más y lo cambié por lo siguiente:

int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               if (OrderSelect(BuyTicket,SELECT_BY_TICKET))
               {
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                  }  
                 }
              }


Esto elimina el error generado cuando hago clic en compilar. Pero sigue creando el error 4108 de OrderModify en el Journal.

 

Todo su código está contenido en la condición if

 if(bar_time!=Time[0])  

por lo que sólo se ejecuta una vez por cada nueva barra.

 

Cuando BuyTicket == -1 está intentando seleccionar la orden con un número de ticket de -1 y por supuesto no existe

Compruebe que BuyTicket>0 antes de intentar seleccionar una orden

 
GumRai:

Todo su código está contenido en la condición if

por lo que sólo se ejecuta una vez por cada nueva barra.


Gracias por señalar esto.

Entonces, para esto, creé un corchete extra en la parte superior, justo después de Start como

int start() 
{
{

y luego cerré un corchete (que terminaba toda la secciónif(bar_time!=Time[0]) y luego coloqué el código al final seguido de un return (0); y un corchete final para cerrar el start().

No hay errores, ni en el código, ni en el diario de backtest, pero sólo tomó una operación de compra y eso es todo--que también se cerró justo en la apertura a pesar de que el precio no se movió más alto de la apertura--por no hablar de mover 50 pips.

Creo que esto podría tener que ver con el BuyTicket siendo == -1 que usted mencionó. Pero honestamente no tengo idea de cómo cambiar eso. Yo había puesto esa cosa -1 en base a su recomendación para el código inicial--que funcionó fantásticamente. Pero, ¿cómo podríacomprobar que BuyTicket>0 antes de intentar seleccionar un pedido?

 
SharkWaters:

¿Pero cómo puedocomprobar que BuyTicket>0 antes de intentar seleccionar un pedido?

Lo siento, pero si tienes que preguntar esto, estás intentando escribir un código demasiado complicado para tu nivel de conocimientos.

No puedo escribir tu código por ti poco a poco.

Razón de la queja: