Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 30

 
yaaarik777:
Apenas estoy aprendiendo, estoy tratando de usar la guía, pero me doy cuenta de que estoy recibiendo algunas tonterías, me gustaría ver un ejemplo de cómo hacerlo.
Lea este artículo, le será útilhttps://www.mql5.com/ru/articles/1399
События в МetaТrader 4
События в МetaТrader 4
  • 2006.05.29
  • Andrey Khatimlianskii
  • www.mql5.com
Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL 4.
 
yaaarik777:

¡Buenos días a todos! ¿Puede usted por favor aconsejar cómo establecer un borrado de órdenes en un EA?

La situación es la siguiente:

Colocamos 2órdenes pendientes en diferentes direcciones, en cuanto una de ellas se dispara, la otra se elimina y deja de estar expuesta.

Estaría muy agradecido por cualquier ayuda.

Gracias.

Algo así

   for(int pos=OrdersTotal()-1,ticket=0,trade=0;pos!=-1;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderType()>1)//Если найденный ордер отложенный
        {
         ticket=OrderTicket();//Запомним его тикет
        }
      else//Если ордер не отложенный
        {
         trade=1;//Запомним,что есть открытая позиция
        }
      if(ticket!=0 && trade==1)//И если известен отложенный и открыта позиция
        {
         int OD=OrderDelete(ticket);//Удаляем отложенный
        }
     }
 
Nikolay Gaylis:
¡"Vamos a seguir buscando" debe ser eliminado!
Puedes editar tus propios mensajes en el foro. Todo lo que has escrito en los posts anteriores por separado puede caber en uno solo.
 
Vitalie Postolache:
Puedes editar tus propios mensajes en el foro. Todo lo que has escrito en los posts anteriores por separado puede caber en uno solo.
Gracias.
 

Hola! He introducido una red de arrastre con fines de lucro utilizando el siguiente algoritmo:

if(total>0)
{for (int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magic && OrderSymbol()==asset& OrderType()==OP_BUY)
{
RefreshRates();
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
CONDICIÓN DE TOMA DE BENEFICIOS;
ORDENAR LA MODIFICACIÓN DE UNA NUEVA TOMA DE BENEFICIOS;
}
}
}
}

Pero el límite de tiempo no funciona por alguna razón y sucede que si una posición no se cierra en el marco de tiempo actual, también se arrastra en el siguiente marco de tiempo si se cumplen las condiciones.

¿Qué pasa con mi último if()?

 
владимир:

Hola! He introducido una red de arrastre con fines de lucro utilizando el siguiente algoritmo:

if(total>0)
{for (int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magic && OrderSymbol()==asset && OrderType()==OP_BUY)
{
RefreshRates();
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
CONDICIÓN DE TP DE ARRASTRE;
{ MODIFICACIÓN DE LA ORDEN A LA NUEVA TOMA DE BENEFICIOS;
}
}
}
}

Pero por alguna razón el límite de tiempo no funciona, y sucede que si la posición no se cierra en el marco de tiempo actual, se arrastra en el siguiente también, si se cumplen las condiciones.

¿Qué pasa con mi último if()?

Bueno, no sé, no he visto nada malo allí todavía. He eliminado la comprobación redundante del número de órdenes (ya está presente en las condiciones del bucle) y he añadido una comprobación para ambos tipos de posiciones (Compra y Venta)

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Donde // las condiciones de arrastre y modificación, inserte Print() con los valores de las variables de tiempo y vea lo que dice el registro.

 
Artyom Trishkin:

No sé, todavía no veo qué tiene de malo con un vistazo rápido. He eliminado la comprobación innecesaria del número de órdenes (ya está en las condiciones del ciclo) y he añadido la comprobación de ambos tipos de posiciones (compra y venta)

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Donde // condiciones de arrastre y modificación, inserte Print() con los valores de las variables de tiempo y vea lo que dice el registro.

Tengo diferentes condiciones para la venta, por lo que sólo he mostrado la compra.

" con variables de tiempo" - ¿se refiere a TimeCurrent()? Perdona si esto te sorprende: soy un cero a la izquierda en programación.

Y no entiendo esto -OrderType()>OP_SELL. ¿Por qué >? OrderType OP_SELL tiene valor = 1 yOP_BUY = 0. Por lo tanto debe ser <= ? Gracias.

 
владимир:

Tengo diferentes condiciones de arrastre para la VENTA, por lo que sólo mostré el BAI.

" con valores de variables de tiempo" - ¿se refiere a TimeCurrent()? Perdona si esto te sorprende: soy un cero a la izquierda en programación.

Y no entiendo esto -OrderType()>OP_SELL. ¿Por qué >? OrderType OP_SELL tiene valor = 1 yOP_BUY = 0. Por lo tanto debe ser <= ? Gracias.

Si el tipo es mayor que 1, entonces pasa a la siguiente iteración del bucle.
 

Saludos. ¿Podría decirme por qué en el caso de la siguiente entrada

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

El sistema genera constantemente errores

: billete no válido para la función OrderDelete

Error de OrderDelete 4051

Según el libro de referencia es

Valor no válido del parámetro de la función

Aunque los parámetros parecen ser los mismos.

Aunque si se elimina la condición y se deja sólo

OrderDelete(ticketD);

OrderDelete(ticketUP);

se borra con éxito (pero lo necesito por condición). ¿Qué estoy haciendo mal?

 
spoiltboy:

Saludos. ¿Podría decirme por qué en el caso de la siguiente entrada

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

El sistema genera constantemente errores

: billete no válido para la función OrderDelete

Error de OrderDelete 4051

Según el libro de referencia es

Valor no válido del parámetro de la función

Aunque los parámetros parecen ser los mismos.

Aunque si se elimina la condición y se deja sólo

OrderDelete(ticketD);

OrderDelete(ticketUP);

se borra con éxito (pero lo necesito por condición). ¿Qué estoy haciendo mal?

El error está en algún lugar por encima del código, en el área de selección de pedidos.
Razón de la queja: