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

 
PolarSeaman:

Lo siento, no entiendo por qué no puedes.

puedes, pero no será exactamente un temporizador

if (IsTesting()) OnTimer();
 
PolarSeaman:

ahí tienes... ¿Qué pasa si la garrapata no viene? Hay que "empezar" sin garrapata.

el primer tick es para la sincronización, y si el tick de inicio no llegó, el mercado está cerrado, no hay nada que hacer allí

 

¡Buenas noches!

De nuevo tengo que pedir ayuda:

Una orden tiene que ser abierta en un cierto rango de tiempo, si una orden ya ha sido abierta en los últimos 30 minutos con esta magia, entonces ninguna orden tiene que ser abierta. Escribiendo así:

if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_MINUTES) <= TimeToStr(D'00:30',TIME_MINUTES))
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Si se deja sólo la primera parte, el problema es que si se cierra una posición de stop/toma en esa media hora, se abre otra. Así que añadí la 2ª parte para entrar en el historial de pedidos y si ya había un pedido en los últimos 30 minutos con esta revista, no abrirlo. Pero algo falla en la segunda parte: se sigue abriendo.

Por favor, aconséjeme.

 

hay que contar en segundos.

if ( TimeCurrent()-OrderOpenTime() <= 30*60 )
 
Taras Slobodyanik:

Hay que contar en segundos.

Por desgracia, no funcionó.

Lo he vuelto a intentar, pero tampoco:

  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_SECONDS) <= TimeToStr(30*60,TIME_SECONDS))
 
YanSay:

Por desgracia, no funcionó.

Lo he vuelto a intentar, pero tampoco ha funcionado:

¿Por qué comparas todas las líneas? Taras dijo correctamente - contar en segundos. Su versión no ha funcionado, porque todavía no has llegado al historial de la cuenta:

//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)

Este es un ciclo para las órdenes de trabajo. Si miramos el historial, el bucle será el siguiente:

//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)

Entonces debemos tomar la hora de cierre de la orden en lugar de su hora de apertura en el bucle.

 
Ihor Herasko:

¿Por qué comparas todas las líneas? Taras tenía razón cuando dijo que contara en segundos. Su versión no encajaba, porque nunca se llegó al historial de la cuenta:

Se trata de un ciclo de órdenes de trabajo. Si miramos el historial, el bucle será el siguiente:

Entonces, en el bucle, debemos tomar la hora de cierre de la orden y no su hora de apertura.


if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Si he entendido bien, te refieres a TimeToStr, es decir, lo has traducido a texto?

Lo he corregido, pero aún así:

Probador

Lo siento, si soy completamente estúpido.

 
YanSay:

Si lo he entendido bien, ¿se refiere a TimeToStr, es decir, traducido a texto?

Corregido, pero aún así:

Lo siento si soy completamente estúpido.

Di tu condición en voz alta y verás lo que pasa).

if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
 

Si a uno de los valores anteriores del buffer del indicador se le asigna un valor vacío, ¿se borrará del gráfico?

¿o habrá un valor vacío en el buffer y el dibujo permanecerá en el gráfico?

 
YanSay:

Si lo he entendido bien, ¿se refiere a TimeToStr, es decir, traducido a texto?

Sí. No tiene sentido convertir el tiempo en una cadena, porque el tiempo es un número de segundos. Este número es mucho más fácil y rápido de trabajar que las cadenas.

Corregido, pero aún así:

Lo siento si soy completamente estúpido.

Has corregido una cosa y has estropeado otra).

En la segunda parte en lugar de:

if (!OrderSelect(i, SELECT_BY_POS))
     continue;

tráelo de vuelta:

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     continue;

En su anterior intento tenía esta línea correcta.

Razón de la queja: