¿Cómo implementar el cierre de posiciones de una en una después de N minutos?

 

mql4
Por ejemplo, han pasado 5 minutos después de la apertura de la orden, y esta orden debería cerrarse.
El código es demasiado engorroso para memorizar el ticket a cerrar y la hora de apertura para calcular los minutos de cada pedido por separado.
Puede haber 1,2,3-10 posiciones, comprar y vender al mismo tiempo.

¿Puede sugerir una función para almacenar estos datos en una matriz para comparar y cerrar en el ticket requerido?


 
Al fin y al cabo, todas las entradas y los horarios de apertura ya están presentes en las matrices estándar.
Recorre todas las posiciones por temporizador y compara TimeCurrent()-OrderOpenTime()>=300
 
Taras Slobodyanik:
Al fin y al cabo, todas las entradas y los horarios de apertura ya están presentes en las matrices estándar.
Recorremos todas las posiciones por temporizador y comparamos TimeCurrent()-OrderOpenTime()>=300

¿Qué son esas matrices estándar?
¿Puede explicarlos con más detalle?

 
funciones MQL estándar, no matrices
Торговые функции - Справочник MQL4
Торговые функции - Справочник MQL4
  • docs.mql4.com
Торговые функции могут использоваться в экспертах и скриптах. Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete(), изменяющие состояние...
 

¿Cómo puedo utilizar estas funciones para cerrar las posiciones individualmente y no todas a la vez después de 5 minutos?

Está la primera posición abierta, hemos registrado la hora y el ticket
en la variable, luego la segunda posición abierta, la vemos en el bucle como la última y la registramos en la variable hora y ticket
, pero todas estas acciones se sobreescriben y resulta que los datos se almacenan sólo desde la última posición

 
Natalya Dzerzhinskaya:

¿Cómo puedo utilizar estas funciones para cerrar las posiciones individualmente y no todas a la vez después de 5 minutos?

Está la primera posición abierta, la registramos en la variable tiempo y ticket
luego la segunda posición abierta, la vemos en el bucle como la última y la registramos en la variable tiempo y ticket
pero todas estas acciones se sobreescriben y resulta que los datos se almacenan sólo desde la última posición

La condición de seleccionar sólo un pedido de entre los que deben cerrarse no antes de 5 minutos después de la apertura no está del todo clara.

Por lo tanto, no sé qué responder.

Si hay una condición, debemos empezar con ella.

Por el momento, todos ellos han sido prácticamente seleccionados y se cerrarán en una pila, uno tras otro.

La primera orden abierta tiene esto: TimeCurrent()-OrderOpenTime() será el mayor, por ejemplo, su OrderTicket().

Puede recorrer todas sus órdenes de mercado en el siguiente bucle

int i;      
     for (i=OrdersTotal()-1; i>=0; i--)
         {
            if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               {
                  ............
               }
         }
 
Natalya Dzerzhinskaya:

mql4
Por ejemplo, han pasado 5 minutos desde la apertura de la orden y ésta debe cerrarse.

Echa un vistazo a las funciones de Kim Igor.

Aquí, a simple vista, la función devuelve el número de segundos transcurridos desde que se abrió la última posición.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t=0;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

Revísela para adaptarla a su tarea. Añade la función que cierra una posición.

 
Renat Akhtyamov:

No está del todo claro si se trata de una orden que debe cerrarse al menos 5 minutos después de la apertura.

Permítanme explicarlo de forma más sencilla:

Existe el primer pedido en el mercado, luego el segundo, el tercero y así sucesivamente.
El tiempo de la primera orden ha expirado y debemos cerrarla, luego la segunda orden es la primera de la serie, el tiempo ha expirado y debemos cerrarla, etc.
De hecho, debemos elegir la orden más antigua para cerrarla si es >=5*60
Pero para seleccionarlo de una serie a cerrar por el ticket, deberíamos definir de alguna manera el valor más pequeño del ticket en las órdenes abiertas y determinar el tiempo de existencia.

Aleksandr Volotko:

Echa un vistazo a las funciones de Kim Igor.

Aquí, a simple vista, la función devuelve el número de segundos transcurridos desde que se abrió la última posición.

No encaja. Interesado en la primera posición en el mercado.

 
Natalya Dzerzhinskaya:

Lo haré sencillo:

Existe el primer pedido en el mercado, luego el segundo, el tercero y así sucesivamente.
El tiempo de la primera orden ha expirado, entonces la segunda orden es la primera de la serie, el tiempo ha expirado, debe ser cerrada, etc.
De hecho, debemos elegir la orden más antigua para cerrarla si es >=5*60
Pero para seleccionarlo de una serie a cerrar por el ticket, deberíamos definir de alguna manera el valor más pequeño del ticket en las órdenes abiertas y determinar el tiempo de existencia.

No cabe. Interesado en el primer puesto del mercado.


¿Cuál es el problema?

  1. Encuentre la orden más antigua abierta por el Asesor Experto. Tiene el menor OrderOpenTime().
  2. Compare el tiempo transcurrido desde el momento de la apertura de esta orden hasta la hora actual. Si es igual o mayor que el tiempo especificado, ciérrelo.
int nOlderTicket = -1;
datetime dtOlderOrderTime = D'3000.12.30';
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())
      continue;

   if (OrderMagicNumber() != i_nMagicNumber)
      continue;

   if (nOlderTicket < 0 || OrderOpenTime() < dtOlderOrderTime)
   {
      nOlderTicket = OrderTicket();
      dtOlderOrderTime = OrderOpenTime();
   }
}

if (TimeCurrent() - dtOlderOrderTime >= время в секундах)
{
   // Закрыть ордер nOlderTicket
}


 
Natalya Dzerzhinskaya:

Lo haré sencillo:

El primer pedido está en el mercado, luego el segundo, el tercero y así sucesivamente.
El tiempo de la primera orden ha expirado y debemos cerrarla, luego la segunda orden es la primera de la serie, el tiempo ha expirado y debemos cerrarla, etc.
De hecho, debemos elegir la orden más antigua para cerrarla si es >=5*60
Pero para seleccionarlo de una serie a cerrar por el ticket, deberíamos definir de alguna manera el valor más pequeño del ticket en las órdenes abiertas y determinar el tiempo de existencia.

No cabe. Le interesa la primera posición en el mercado.

En cuanto al tiempo de existencia, puede seleccionar tanto la primera orden abierta como la más reciente. En este caso recordamos el billete y el número de segundos de existencia. Por ejemplo

int i, DeltaTimeOpen, prevDeltaMax, prevDeltaMin, TicketFirst, TicketLast, DeltaTimeClose;  
//---------------
prevDeltaMax=0; prevDeltaMin=9999999999999; TicketFirst=0; TicketLast=0; DeltaTimeClose = 5*60;     
     for (i=OrdersTotal()-1; i>=0; i--)
         {            
            if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               { 
                  DeltaTimeOpen = TimeCurrent()-OrderOpenTime();//возраст ордера в секундах
                  if(DeltaTimeOpen>=DeltaTimeClose)
                  {
                     if(DeltaTimeOpen>prevDeltaMax)
                     {                         
                         TicketLast=OrderTicket();//последний  
                         prevDeltaMax=DeltaTimeOpen;//возраст                    
                     }
                     if(DeltaTimeOpen<prevDeltaMin)
                     {
                         TicketFirst=OrderTicket(); //первый
                         prevDeltaMin=DeltaTimeOpen;//возраст                                              
                     }
                  }
               }
         }
if(TicketFirst>0)
{
//ну и пошло-поехало...
}

 

La forma más sencilla es introducir en el campo de comentarios la hora a la que debe cerrarse el pedido.

Entonces sólo hay que recordar la hora más cercana al cierre (e incluso entonces, es la optimización).

Cuando llegue el momento de la "revisión", con un temporizador o lo que quieras, haz un bucle con las órdenes abiertas y cierra aquellas cuya duración supere el tiempo especificado en el comentario

Razón de la queja: