Testando 'CopyTicks'. - página 17

 
fxsaber:
O volume da barra de carrapatos é um rudimento? Um indicador que, em princípio, não significa nada sobre a troca. Você não pode usá-lo conscientemente. É uma bobagem.

Na verdade, o volume da bolsa de valores é o número de barbatanas. Ou seja, o número real de negócios.

 
Slawa:

Na verdade, o volume da bolsa de valores é o número de barbatanas. Ou seja, o número real de negócios.

Portanto, a barra não muda quando entra um comércio que é completamente idêntico ao anterior.
 
fxsaber:
Portanto, a barra não muda quando entra um comércio que é completamente idêntico ao anterior.
Carrapato e mudança de volumes reais
 
O Expert Advisor escreve novos traços de história e revela o N-ésimo terceiro bug em 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);
}

Desta vez escrevi comentários detalhados, portanto o resultado deve 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
O problema não é apenas com COPY_TICKS_ALL mas também com outros modos (LAST, INFO).
 
fxsaber:
O Expert Advisor completou a escrita de novos traços de história e encontrou o nono bug em CopyTicks.

Desta vez escrevi comentários detalhados, portanto o resultado deve ser claro.

O problema afeta não apenas o COPY_TICKS_ALL, mas também outros modos (LAST, INFO).

Tentei adicionar carrapatos via From == 0. Não funciona! - Bugs no CopyTicks.

Caros desenvolvedores, eu preciso muito desta função (para adicionar um novo histórico de dados). Que seja retardado por enquanto, mas vai funcionar. Por favor, escreva aqui sua versão de trabalho.

Você terá que corrigir bugs no CopyTicks por um longo tempo e não um único build. Como outros usam CopyTicks - Eu não entendo. Aparentemente, eles não os utilizam de forma alguma. Falta-lhes imaginação.

 

Você diria claramente o que você considera exatamente como um bug.

 
Renat Fatkhullin:

Você diria claramente o que você considera exatamente como um bug.

Respondeu muito claramente em código. Criei um aplicativo para o Service Desk, onde escrevi ainda mais detalhes.
 
fxsaber:
Respondeu muito claramente a esta pergunta através do código. Fiz um pedido ao Service Desk onde descrevi tudo em detalhes.

O erro reside no fato de que na matriz de carrapatos recentemente obtida as primeiras entradas contêm lances zero, ask ou último. enquanto na matriz anterior os mesmos carrapatos no final da matriz não contêm zeros, mas contêm os valores então atuais de lance, ask e último

Este erro no CopyTicks foi corrigido depois que a construção foi liberada. Agora as entradas iniciais de ticks após a chamada do CopyTicks não conterão zeros, mas valores atuais de lances, solicitações e duram no momento solicitado.

Infelizmente, os consertos não foram incluídos na construção atual.

 
Slawa:

O erro consiste no fato de que na matriz de carrapatos recentemente obtida as primeiras entradas contêm zero lances, ask ou últimos valores, enquanto na matriz anterior os mesmos carrapatos no final da matriz não contêm zeros, mas contêm os valores atuais de lance, ask e último

Este erro no CopyTicks já foi corrigido após o lançamento da construção. Agora os registros iniciais de ticks após a chamada do CopyTicks não conterão zeros, mas os valores atuais de licitação, pedido e último no tempo solicitado

Não estou entendendo você. Você está dizendo que você tem seu próprio formato interno de armazenamento de história. E CopyTicks pega um pedaço dele a cada pedido e gera sua própria seqüência de MqlTick? As mesmas bandeiras são calculadas por CopyTicks, e não são armazenadas na história? Algumas almofadas, que também calcula algo, e não apenas o converte em formato utilizável.

Eu não preciso do CopyTicks para preencher algo lá, dependendo do tempo do pedido. Eu só quero ter a história sem distorções. E acrescente sem nenhum problema.

Infelizmente, não há consertos na construção atual.

Por favor, libere o beta build em seu servidor. Tenho certeza de que encontrarei mais inconsistências. Vamos lamber este CopyTicks para que ele possa finalmente ser confiável!

 
fxsaber:
O Expert Advisor completa os novos carrapatos históricos e identifica o Nth CopyTicks bug
Se você só precisa de uma fita (COPY_TICKS_TRADE - tempo_msc, último, volume e bandeiras), então esta solução é completamente adequada - sem bugs detectados.