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

 
  1. El código fue escrito antes de la compilación 600. No se pueden usar puntos en los nombres de las variables desde febrero de 2014. Solo hay que sustituirlos por guiones bajos.
  2. Aquí hay un ejemplo de código independiente de la dirección
    double DIR, OOP, OCP, ISL;  int OP;
    
    if(     Bid > High[1]){
       DIR = +1; OOP = Ask; OCP = Bid; OP = OP_BUY;
    }
    else if(Bid <  Low[1]){
       DIR = -1; OOP = Bid; OCP = Ask; OP = OP_BUY;
    }
    else return;
    
    ISL = OCP -DIR* pips_to_change( extISL_Pips );
    ... OrderSend(...);
    Solo cambias Ask/Bid por precios de apertura/cierre y escribes todo lo demás como si fuera una compra: ISL está por debajo de OCP (OCP - ISL) y el -DIR* cambia el signo para una venta.
    Si necesita una comparación (A > B) utilice (A - B) *DIR> 0 para invertir la comparación para una venta.
 
GumRai:

Parece que tienes la idea.

Modifica y publica tu código y yo o alguien más lo comentará

Hola GumRai

Ha pasado un tiempo desde que publiqué una actualización aquí, pero he estado trabajando en el código y finalmente lo terminé - doloroso cuando se trabaja 10 horas al día. Sin embargo, tengo dos problemas principales. 1) No importa lo que haga, genera un código de error: "Unknown ticket XYZ for OrderCloseFunction" y 2) Hice un save-as del archivo, (Llamado un USDCAD, otro EURUSD), con diferentes magicnumbers etc, sin embargo, todavía toma sólo un comercio a la vez--y no trata los pares de forma independiente. De hecho, a continuación, crea un "billete no válido para OrderCloseFunction" error también.

Intenté buscar esto en Google pero fue en vano. Realmente apreciaría si usted podría guiarme en la dirección correcta con esto. ¿Qué estoy haciendo mal?

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//part with the extern int stating the terms of the MA removed to reduce space.

int MagicNumber = 1234;
int MagicNumber2 = 2345;
double Pips;
int BuyTicket;
int SellTicket;
int CloseTicket;
int CloseSellTicket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double Ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (Ticksize == 0.00001 || Ticksize == 0.001)
   Pips = Ticksize*10;
   else Pips = Ticksize;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
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);
      double PreviousPriceClose2=iClose(NULL,0,2);
      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
        
      else
      for(int i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(iClose(NULL, 0,0)<PreviousSlow)
        {
          CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         }
         }
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(OrdersTotal()==0)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
      for(i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if(iClose(NULL, 0,1)>PreviousSlow)
        {
          CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              }
     }
     }
    return(0);
    return(0); 
    }
//--------------

  

Muchas gracias de antemano.

 

Nunca utilice OrdersTotal()==0 como condición para introducir operaciones

Significa que si una operación ha sido abierta manualmente o por otro EA o el mismo EA unido a otro símbolo del gráfico, sólo se puede abrir 1 operación.

Tiene la variable global BuyTicket, inicialícela a -1

int BuyTicket=-1;

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

No haga un bucle a través de las órdenes antes de cerrar, es innecesario

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
  }

Ahora, cuando se usan variables declaradas globalmente para los números de ticket puede haber problemas si el terminal se cierra y se reinicia por alguna razón

Así que declare una nueva variable de ámbito global

 bool Recovery=true;

  
  if(Recovery)
     {
     //loop through open orders and check for magic number, symbol and type
     //if you find a buy order with the magic number and symbol
     BuyTicket=OrderTicket();
     //if you find a sell order with the magic number and symbol
     SellTicket=OrderTicket();
     Recovery=false;
     }

He escrito esto rápidamente, así que puedo haber cometido errores, pero es suficiente para darte la idea

 
GumRai:


La razón por la que puse el bucle fue porque me di cuenta de que cuando se cerraba la venta, no se activaba la compra por alguna razón.

He seguido adelante y hecho los cambios necesarios ... pero algo todavía parece mal. No está tomando ninguna operación larga ahora, y genera el código de error de la entrada no válida, y OrderClose error 4051. ¿Alguna sugerencia sobre lo que todavía está mal aquí?

Lo extraño es que tanto en el código anterior, como en el actual (sólo para la venta), tomaba las operaciones razonablemente bien (si sólo lo implemento en un gráfico).

¡No pensé que esto fuera tan difícil jaja! Supongo que me equivoqué al pensar que era algo muy simple y sencillo... comprar cuando la vela cruza y abre por encima de la MA, cerrar y vender cuando la vela cruza y va por debajo de la MA.


if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
        
      else
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
      {
      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;
            }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;
            }
            
    return(0);
    return(0); 
    }
 

Lo siento, pero realmente no sé lo que está tratando de hacer

if(OrderSelect(SELECT_BY_POS,MODE_TRADES))

No selecciona ningún orden. ¿Acaso el código compila?

      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;

Aquí el else se aplica si(OrderCloseTime()==0) es falso

       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;

Aquí se aplica si el OrderSelect falla, que ciertamente lo hace

 
GumRai:

Lo siento, pero realmente no sé lo que está tratando de hacer

No selecciona ningún orden. ¿Acaso el código compila?

Aquí el else se aplica si(OrderCloseTime()==0) es falso

Aquí se aplica si el OrderSelect falla, que ciertamente lo hace

Lo siento, la culpa es totalmente mía. No leí/apliqué correctamente tus sugerencias; muchas gracias por señalarlo. Aquí lo he hecho correctamente. No se genera ningún error en el informe. Lo único es que ahora, está introduciendo múltiples órdenes de venta y compra a veces, lo que impide cerrar las operaciones en los momentos adecuados.

Edición: Para ser precisos, sólo está saliendo en el SL y TP, no cuando el precio cruza el otro lado de la MA. ¿Tiene esto algo que ver con el bool?

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]
      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
      else
      if(OrderSelect(BuyTicket,MODE_TRADES))
      {
         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
               }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SellTicket,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else 
            SellTicket= -1; //Order has closed so reset variable
            }
    return(0);
    return(0); 
    }
 
if(OrderSelect(BuyTicket,MODE_TRADES))
Esto no selecciona un comercio, por favor siga el ejemplo que le di y hágalo correctamente
 
GumRai:
Esto no selecciona un trade, por favor sigue el ejemplo que te di y hazlo correctamente

Me siento... realmente estúpido. lol. ¡¡Gracias por encontrar eso!!

1) Dos cosas más... ahora crea un código de error de OrderClose 4108. ¿Pongo el código de nuevo? Es el mismo que el anterior con la corrección que habías indicado. Pero entra y sale según las reglas.

2) Y no entra en corto inmediatamente después de cerrar la posición larga como se muestra en la imagen. La flecha verde hacia abajo muestra donde debería haber entrado en corto. Tomó una compra, y la cerró con pérdidas una vez que cerró por debajo de la MA amarilla. Aquí, debería haber ido en corto. ¿Cómo puedo hacer un bucle de esto?

Muchas gracias GumRai. Sinceramente no habría llegado a ningún sitio tan cerca sin tu ayuda.

debería haber ido en corto 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]
      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),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
        }
      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
        }

      if(SellTicket==-1)
        {
         if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
           {
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(SellTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]>PreviousSlow)
              {
               bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
               if(CloseSellTicket)
                  SellTicket=-1;
              }
           }
         else
            SellTicket=-1; //Order has closed so reset variable
        }
     }
   return(0);
  }

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.

 
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.

Santo... ¡Lo has conseguido! Gracias una y otra vez GumRai. Eres el mejor.

No puedo adelantar la prueba ahora, pero una vez que se abran los mercados, creo que debería poder usar esto entonces, con los otros pares siempre y cuando tenga diferentes magic#s en la demo.