Cualquier pregunta de un PROFI a un SUPER PROFI - 1. - página 42

 
swanhearts:

Hola, me han enviado un indicador MA con todos los niveles que necesito. El problema es que cuando paso el ratón por encima del indicador (cada MA), no muestra el periodo de esa MA. ¿Cómo solucionarlo? Hay un error de sintaxis constante al cambiar el nombreIndicatorShortName("MASHKI =)"); Por favor, ayuda.

El nombre de la memoria intermedia del indicador se establece mediante SetIndexLabel

 

1. ¿Cuál es la forma más económica de saber que la llamada a la función está en el mismo tick que la llamada anterior?

bool tick_already_processed()
{
   return( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return;

   // recalculate only once on each tick
}

void OnTick()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

El tiempo (TimeCurrent) puede permanecer igual, el tiempo en ms de SymbolInfoTick, teóricamente también.

Comparar los tiempos de oferta, demanda y ms es bastante costoso.

No sugiero organizar el control en el propio Asesor Experto, quiero conseguir una función universal independiente.


La misma pregunta se refiere a las operaciones comerciales. ¿Cómo sabemos que algo ha cambiado en la lista de órdenes/posiciones (incluyendo los niveles abiertos, SL y TP) desde la última ejecución?

Tendría que colocar alguna bandera en OnTrade (y restablecerla al terminar), es la forma más barata.

Pero, de nuevo, me gustaría una solución universal.


¿Quién tiene alguna idea?

 

Andrey Khatimlianskii: 

Ejemplo https://www.mql5.com/ru/code/16997

Archivo Resources.mqh.

Función IsNewPeriod


La idea básica es utilizar una función con estática en su interior.

Puedes almacenarlo en ID = GetMicroSecondsCount para recordar y comprobar los ticks

Para lo mismo con los pedidos - comprobar la magia

No he comprobado el pseudocódigo de abajo :)

bool IsNewTick(ulong newId) // GetMicrosecondCount() or magic
{
  static ulong id = 0;
  
  if (id != newId) 
  {
    id = newId;
    return true;
  }
  
  return false; 
}
 
Andrey Khatimlianskii:

2. pregunta similar para los oficios. ¿Cómo puedo saber si algo ha cambiado en la lista de órdenes/posiciones (incluyendo niveles abiertos, SL y TP) desde la última ejecución?

En A, tenemos que establecer algún tipo de bandera en OnTrade (y restablecerlo después de la ejecución), es la forma más barata.

Pero, de nuevo, me gustaría una solución universal.


¿Quién tiene alguna idea?

Añada aquí sus condiciones (SL/TP, etc.).

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Organizar un ciclo de desbordamiento de pedidos

fxsaber, 2017.10.18 12:29

struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}
 
Andrey Khatimlianskii:

1. ¿Cuál es la forma más económica de saber que la llamada a la función está en el mismo tick que la llamada anterior?

El tiempo (TimeCurrent) puede permanecer igual, el tiempo en ms de SymbolInfoTick, teóricamente también.

La comparación de los tiempos de la oferta, la demanda y la demanda es demasiado cara.

No sugiero organizar el control en el propio EA, quiero conseguir una función universal independiente.

La cuestión aquí no es la baratura, sino la fiabilidad de la numeración de las garrapatas. Hago las siguientes cosas en mi EA.

#ifdef __MQL5__
#else // __MQL5__
  // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
  static bool IsNotChange( const bool bInit = false )
  {
    static bool IsChange = false;
     
    if (bInit)
      IsChange = false;
      
  #ifdef  HISTORYTICKS_ISCHANGE
    if (bInit)
      HISTORYTICKS::IsChange();
    else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
  #endif // HISTORYTICKS_ISCHANGE
    
    return(!IsChange);
  }
#endif // __MQL5__

Esta es la versión de la función para MT4. Numeración mediante indicador de espía.


No incluyo la versión de la misma función para MT5 ya que hay que eliminar cosas innecesarias. Pero se basa en esta función.

  // Свежие тики с последнего вызова
  static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
    static long LastTime = 0;
    static int LastAmount = 0;

    if (dFrom)
    {
     ::Comment("Waiting Ticks from " + ::TimeToString(dFrom, TIME_DATE) + "...");

      LastAmount = 0;
    }
    
    ::ArrayFree(Ticks);
  
    int Size = (dFrom || LastTime) ? ::CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, dFrom ? (long)dFrom * 1000 : LastTime) : 0;
    
    if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1].time_msc;
      int NewLastAmount = 1;
      
      for (int i = Size - 2; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
      if (::ArrayRemove(Ticks, 0, LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
    else
      Size = ::ArrayResize(Ticks, 0);
    
    return(Size);
  }


Si devuelve un valor distinto de cero - nuevo tick.

 
...:

La idea básica es utilizar una función con estática en su interior.

Para recordar y conciliar los ticks se puede almacenar en ID = GetMicroSecondsCount

Gracias.

Todo el problema es este ID único (número de garrapata), que no existe.

GetMicroSecondsCount no ayudará, porque cambiará entre llamadas (para eso está diseñado), mientras que GetTickCount, teóricamente, puede no cambiar en 2 ticks adyacentes.

 
fxsaber:

El problema aquí no es la baratura, sino la fiabilidad de la numeración de las garrapatas. En un EA de combate lo hago así.

No, definitivamente será más lento que una comparación oferta/compra/ms.

¿Cuál es el problema de la fiabilidad? Lo único que importa es el hecho de cambiar algo.

 
fxsaber:

Añada aquí sus condiciones (SL/TP, etc.).

Inmediatamente recordé este código.

Pero el punto es sólo para evitar la enumeración innecesaria de todas las órdenes.

Está claro que podemos hacer de este bucle un único bucle para todo el EA. Pero en este caso debemos pasar a la función una señal de cambios (también podemos no llamarla).

 
Andrey Khatimlianskii:

No, definitivamente será más lento que una comparación oferta/compra/ms.

¿Cuál es el problema de la fiabilidad? Lo único que importa es que algo cambie.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Cualquier pregunta de PROFi a SUPER PROFi - 1.

Andrey Khatimlianskii, 2020.03.05 23:46

El tiempo (TimeCurrent) puede seguir siendo el mismo, el tiempo en ms de SymbolInfoTick, teóricamente, también.

Comparar la oferta, la demanda y el tiempo en msc es caro.

Especialmente relevante para MT4 donde el cambio de paso time_msc es de 1000ms.

 
Andrey Khatimlianskii:

Pero el objetivo es precisamente evitar la superposición innecesaria de todos los órdenes.

Está claro que podemos hacer que este ciclo sea único para toda la EA. Pero entonces tenemos que pasar a la función una señal de cambios (también podemos no llamarla).

No lo entiendo. Si algo ha cambiado en la base de datos, la única forma de averiguarlo es compararlo con el estado anterior de la base de datos.

Puede comparar cada elemento de la base de datos correspondiente. O puedes calcular el hash a partir de ellos y comparar los hashes.

Razón de la queja: