Probando 'CopyTicks' - página 17

 
fxsaber:
¿Es el volumen de la barra de ticks un rudimento? Un indicador que, en principio, no significa nada en la bolsa. No puedes usarlo conscientemente. Es una basura.

Bueno, en realidad, el volumen de ticks en la bolsa es el número de flippers. Es decir, el número real de operaciones.

 
Slawa:

Bueno, en realidad, el volumen de ticks en la bolsa es el número de flippers. Es decir, el número real de operaciones.

Así, la barra no cambia cuando entra una operación completamente idéntica a la anterior.
 
fxsaber:
Así, la barra no cambia cuando entra una operación completamente idéntica a la anterior.
Cambio de volúmenes reales y de garrapatas
 
El Asesor Experto escribe nuevos ticks de la historia y revela el N-ésimo error en CopyTicks
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

string GetTickFlag( uint tickflag )
{
  string flag = "";

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
     
  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

#define  TOSTRING2(A) #A + " = " + (string)A

int AddFreshTicks( MqlTick &Ticks[], const string Symb = NULL, const uint flags = COPY_TICKS_ALL )
{
  int Res = 0;
  const int Amount = ArraySize(Ticks);
  
  MqlTick NewTicks[];  
  const int NewAmount = (Amount == 0) ? CopyTicks((Symb == NULL)? Symbol() : Symb, NewTicks, flags) :
                                        CopyTicks((Symb == NULL)? Symbol() : Symb, NewTicks, flags, Ticks[Amount - 1].time_msc);
  
  if (NewAmount > 0)
  {
    if (Amount > 0)
    {
      // Взяли крайнее время из предыдущей истории
      const long LastTime = Ticks[Amount - 1].time_msc;
      
      int Count = 1;
      
      // Находим (Count) в предыдушей истории количество тиков со временем LastTime
      for (int i = Amount - 2; i >= 0; i--)
      {
        if (Ticks[i].time_msc < LastTime)
          break;
          
        Count++;
      }

      if ((Count < Amount) && (Count < NewAmount))      
      {
        // Если Count-тик c LastTime-временем в новой истории не равен самому последнего тику в старой истории, выводим в журнал
        if (_R(Ticks[Amount - 1]) != NewTicks[Count - 1]) // https://www.mql5.com/ru/code/16280
          Print(TOSTRING2(TickToString(Ticks[Amount - 1])) + "\n" +
                TOSTRING2(TickToString(NewTicks[Count - 1])) + "\n" + TOSTRING2(TickToString(NewTicks[Count])) + "\n");              

        Res = ArrayCopy(Ticks, NewTicks, Amount, Count);
      }
    }
    else
      Res = ArrayCopy(Ticks, NewTicks);
  }
  
  return(Res);
}

void OnTick( void )
{
  static MqlTick PrevTicks[];
  
  // Дописываем свежие тики
  AddFreshTicks(PrevTicks);
}

Esta vez escribí comentarios detallados, así que el resultado debería ser claro

2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count]) =  time = 2016.09.22 12:19:53.233 bid = 0.0 ask = 0.0 last = 98560.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY
2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count-1]) =  time = 2016.09.22 12:19:51.968 bid = 0.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(Ticks[Amount-1]) =  time = 2016.09.22 12:19:51.968 bid = 98550.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count]) =  time = 2016.09.22 12:19:51.968 bid = 98550.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count-1]) =  time = 2016.09.22 12:19:51.813 bid = 98550.0 ask = 0.0 last = 0.0 volume = 0 TICK_FLAG_BID
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(Ticks[Amount-1]) =  time = 2016.09.22 12:19:51.813 bid = 98550.0 ask = 98560.0 last = 0.0 volume = 0 TICK_FLAG_BID
El problema no es sólo con COPY_TICKS_ALL sino también con otros modos (LAST, INFO).
 
fxsaber:
El Asesor Experto ha añadido nuevos ticks del historial y ha encontrado el noveno error en CopyTicks.

Esta vez escribí comentarios detallados, así que el resultado debería ser claro

El problema no sólo afecta a COPY_TICKS_ALL, sino también a otros modos (LAST, INFO).

Intenté añadir ticks a través de From == 0. No funciona. - Errores en CopyTicks.

Estimados desarrolladores, necesito mucho esta función (para añadir un nuevo dato del historial). Que sea retrasado por ahora, pero que funcione. Por favor, escriba aquí su versión de trabajo.

Tendrá que arreglar los errores de CopyTicks durante mucho tiempo y no una construcción. No entiendo cómo otros utilizan CopyTicks. Al parecer, no los utilizan en absoluto. Les falta imaginación.

 

Deberías decir claramente qué es lo que consideras exactamente un error.

 
Renat Fatkhullin:

Deberías decir claramente qué es lo que consideras exactamente un error.

Respondió muy claramente en clave. Creé una solicitud a Service Desk, donde escribí aún más detalles.
 
fxsaber:
Responde a esta pregunta de forma muy clara con el código. He hecho una solicitud al Service Desk donde he descrito todo con detalle.

El error radica en que en la matriz de ticks recién obtenida las primeras entradas contienen cero en la oferta, la demanda o la última. mientras que en la matriz anterior los mismos ticks al final de la matriz no contienen ceros, sino que contienen los valores actuales de la oferta, la demanda y la última

Este error en CopyTicks se solucionó después de que se publicara la compilación. Ahora las entradas de ticks iniciales después de la llamada de CopyTicks no contendrán ceros, sino valores actuales de bid, ask y last en el momento de tiempo solicitado.

Lamentablemente, las correcciones no se han incluido en la versión actual.

 
Slawa:

El error consiste en que en la matriz de ticks recién obtenida las primeras entradas contienen valores cero de oferta, demanda o última, mientras que en la matriz anterior los mismos ticks al final de la matriz no contienen ceros, sino que contienen los valores actuales de oferta, demanda y última

Este error en CopyTicks fue corregido ya después de la publicación de la versión. Ahora los registros de ticks iniciales después de la llamada de CopyTicks no contendrán ceros, sino los valores actuales de bid, ask y last en el momento solicitado

No te entiendo. Usted está diciendo que tiene su propio formato interno de almacenamiento de la historia. ¿Y CopyTicks toma un trozo en cada petición y genera su propia secuencia de MqlTick? ¿Los mismos indicadores son calculados por CopyTicks, y no son almacenados en el historial? Alguna almohadilla, que también calcule algo, y no sólo lo convierta en un formato fácil de usar.

No necesito CopyTicks para llenar algo allí, dependiendo del tiempo de la solicitud. Sólo quiero obtener la historia sin distorsiones. Y añadirlo sin problemas.

Lamentablemente, no hay correcciones en la versión actual.

Por favor, libere la versión beta en su servidor. Estoy seguro de que encontraré más incoherencias. ¡Vamos a lamer este CopyTicks para que por fin se pueda confiar en él!

 
fxsaber:
El Asesor Experto completa los ticks históricos frescos y detecta el error N-th CopyTicks
Si sólo necesita la cinta (COPY_TICKS_TRADE - time_msc, last, volume and flags), entonces esta solución es completamente adecuada - no se han detectado errores.