Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 116

 
novichok2018:

Gracias. El descanso parece haber ayudado. Veamos qué ocurre a continuación.

No, no ha servido de nada. Sólo funciona si se abre un tipo de posición. Si, por ejemplo, se abre una posición de venta y aún no se cierra, y simultáneamente se abre y cierra una posición de compra, la posición de venta no ve condiciones para cerrarse antes de que se abra y cierre otra posición de venta (según sus condiciones). Y si BAY abre y cierra de nuevo, vuelve a incumplir sus condiciones de cierre. He intentado determinar la presencia deposiciones abiertas después de cerrar BAY utilizando la función ExistPositions() de I.Kim, pero no entiendo dónde insertarla y dónde colocar Print para controlar la ejecución. Alguna pista.

 
novichok2018:

No, no ha servido de nada. Sólo funciona si se abre el mismo tipo de posición. Si, por ejemplo, primero se abre una posición de venta y aún no se cierra, y al mismo tiempo se abre y cierra una posición de compra, entonces la posición de venta no ve sus condiciones de cierre hasta que se abra y cierre otra posición de venta (según sus condiciones). Y si BAY abre y cierra de nuevo, vuelve a incumplir sus condiciones de cierre. He intentado determinar la presencia deposiciones abiertas después de cerrar BAY utilizando la función ExistPositions() de I.Kim, pero no entiendo dónde insertarla y dónde colocar Print para controlar la ejecución. ¿Puedes darme una pista?

¿Nadie conoce la solución? No lo sé.

 
novichok2018:¿Nadie conoce la solución? No lo sé.

He entrado en el foro y veo que estás hablando solo... Dónde está el comienzo de su conversación y de qué se trata, es difícil de entender. Para depurar un programa, es mucho más conveniente utilizar Alerta en lugar de Imprimir, ya que aparece en la pantalla de una vez. Estas Alertas se colocan antes de que se compruebe la condición if. Otro método de depuración con un lápiz: recorrer el programa tal y como debe ejecutarse y anotar los valores de las variables. Si cambia, tacha el valor anterior y escribe el nuevo. Así es como se hacía antes. Ahora el MetaEditor tiene un depurador, en el que puedes controlar los valores de las variables. Las construcciones más sencillas deben comprobarse por separado escribiendo una secuencia de comandos

 
novichok2018:

¿Nadie conoce la solución? No lo sé.

Inténtalo de esta manera:

//+------------------------------------------------------------------+
void OnTick()
  {
   int total=OrdersTotal();
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(TimeCurrent()>OrderOpenTime()+100)
           {
            switch(OrderType())
              {
               //_______________________________________________________________________
               case OP_BUY:
                 {
                  if(OrderMagicNumber()==101 && MathAbs(WPR1)<5)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==111 && MathAbs(WPR1)<20)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
               //_______________________________________________________________________                 
               case OP_SELL:
                 {
                  if(OrderMagicNumber()==222 && MathAbs(WPR1)>97.55)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==201 && MathAbs(WPR1)>96)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//_______________________________________________________________________
void ClosePosBySelect(int slip,color col) 
  {
   RefreshRates();
   if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), slip, col);
   if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slip, col);
  }
//_______________________________________________________________________
 
¿De dónde obtiene iCustom sus datos?
 
Igor Makanu:

pruébalo de esta manera:

Gracias, lo he probado - no cierra ninguna posición incluso después de algunos ajustes para que el compilador no jure.

 
STARIJ:

He entrado en el foro y te veo hablando solo... Es difícil entender por dónde has empezado y de qué estás hablando. Para la depuración de programas es más conveniente utilizar Alerta en lugar de Imprimir, ya que se muestra en la pantalla de una vez. Estas Alertas se colocan antes de que se compruebe la condición if. Otro método de depuración con un lápiz: recorrer el programa tal y como debe ejecutarse y anotar los valores de las variables. Cuando cambie, tache el valor anterior y escriba el nuevo. Así es como se hacía antes. Ahora el MetaEditor tiene un depurador, donde se pueden rastrear los valores de las variables. Las construcciones más sencillas deben comprobarse por separado escribiendo un script

Gracias por las recomendaciones, pero para mi situación no son del todo correctas. Sólo para aclarar, a continuación está el código de una función de cierre personalizada

 

No funciona correctamente - elcierre de las posicionesse produce bajo las condiciones de la primera posición abierta. Es decir, si primero se abrió una posición de compra o venta con la condición 1 y luego se abrió una segunda posición con la condición 2, la condición de cierre se ignora y la segunda posición también se cierra con la condición 1 a pesar de tener un número mágico diferente.

He aplicado la ruptura tras el cierre de la orden pero la solución ha sido a medias:sólo si se abre una posición del mismo tipo. Si, por ejemplo, se ha abierto primero una posición de venta y aún no se ha cerrado, mientras que se está abriendo y cerrando una posición de compra, la posición de venta no ve ninguna condición para cerrarse hasta que se abra y cierre otra posición de venta (de acuerdo con sus condiciones). Y si BAY abre y cierra de nuevo, vuelve a incumplir sus condiciones de cierre. ¿Y qué hacer?

void ClosePoz()
  { RefreshRates();
         double WPR0 = iWPR(NULL,0,bars,0);
         double WPR1 = iWPR(NULL,0,bars,1);
         bool rez = false;
           
  int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
              if(TimeCurrent()>OrderOpenTime()+300)
               {
               if(OrderMagicNumber==101 || OrderMagicNumber==102 || OrderMagicNumber==103 || OrderMagicNumber==104)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 break; 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<17) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break; 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>97)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==202)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
                
                } 
              }
       break;  
      }
  }
 
Mickey Moose:
¿De dónde obtiene iCustom sus datos?

de los búferes del indicador personalizado, la práctica, por ejemplo en la MA

novichok2018:

He aplicado la ruptura después de cerrar una orden, pero la solución es a medias:sólo si se abre una posición del mismo tipo. Si, por ejemplo, se abre una posición BOY y aún no se cierra, mientras se abre y se cierra una posición BAY, la posición BAY no ve ninguna condición para cerrarse hasta que se abra y se cierre otra posición BAY (con sus propias condiciones). Y si BAY abre y cierra de nuevo, vuelve a incumplir sus condiciones de cierre. ¿Y qué hacer?

intente sustituir break por continue

es extraño que mi código de ejemplo no cierre nada, quizás se trate de la normalización de precios

 
Igor Makanu:


intente sustituir break por continue


Reemplazado. Error maldito 138(requotes). Luego devolví el descanso, y es 138 de nuevo. Es extraño, tal vez no me di cuenta antes.

 
Igor Makanu:

de los topes del indicador personalizado, practicar con el MA, por ejemplo


¿Es del campo que aparece en la ventana de datos del terminal?