Тестируем 'CopyTicks' - страница 17

 
fxsaber:
Тиковый объем бара - это рудимент? Показатель, который, в принципе, ничего не значит на бирже. Воспользоваться им сознательно не получится. Мусор какой-то.

Ну вообще-то, тиковый объём на бирже - это количество ластов. То есть, реальное количество сделок.

 
Slawa:

Ну вообще-то, тиковый объём на бирже - это количество ластов. То есть, реальное количество сделок.

Так бар же не меняется, когда приходит сделка, полностью идентичная предыдущей.
 
fxsaber:
Так бар же не меняется, когда приходит сделка, полностью идентичная предыдущей.
Тиковый и реальный объёмы меняются
 
Советник дописывает свежие исторические тики и выявляет N-цатый баг 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);
}

На этот раз написал подробные комментарии, поэтому результат должен быть понятен

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
Проблема касается не только COPY_TICKS_ALL, но и остальных режимов (LAST, INFO).
 
fxsaber:
Советник дописывает свежие исторические тики и выявляет N-цатый баг CopyTicks

На этот раз написал подробные комментарии, поэтому результат должен быть понятен

Проблема касается не только COPY_TICKS_ALL, но и остальных режимов (LAST, INFO).

Попробовал дописывать тики через From == 0. Не получается! - Баги CopyTicks.

Уважаемые разработчики, мне эта функция (дописывать свежие исторические данные) очень нужна. Пусть будет пока тормозная, но рабочая. Напишите, пожалуйста, сюда рабочий ее вариант.

Баги CopyTicks править же долго будете и не один билд. Как другие пользуются CopyTicks- ума не приложу. Видимо, и не пользуются вовсе. Фантазии не хватает-с. 

 

Вы бы четко заявляли, что конкретно вы считаете багом.  

 
Renat Fatkhullin:

Вы бы четко заявляли, что конкретно вы считаете багом.  

Ответил очень четко кодом. Создал заявку в Сервисдеск, где еще подробнее все расписал.
 
fxsaber:
Ответил очень четко кодом. Создал заявку в Сервисдеск, где еще подробнее все расписал.

Ошибка заключается в том, что во вновь полученном массиве тиков первые записи содержат нулевые bid, ask или last. тогда как в предыдущем массиве эти же тики, находящиеся в конце масива, нулей не содержат, а содержат текущие на тот момент значения bid, ask и last

Эта ошибка в CopyTicks была исправлена уже после того, как был выпущен билд. Теперь и начальные записи тиков после вызова CopyTicks будут содержать не нули, а текущие на запрашиваемый момент времени значения bid, ask и last

К сожалению, исправления в текущий билд не попали.

 
Slawa:

Ошибка заключается в том, что во вновь полученном массиве тиков первые записи содержат нулевые bid, ask или last. тогда как в предыдущем массиве эти же тики, находящиеся в конце масива, нулей не содержат, а содержат текущие на тот момент значения bid, ask и last

Эта ошибка в CopyTicks была исправлена уже после того, как был выпущен билд. Теперь и начальные записи тиков после вызова CopyTicks будут содержать не нули, а текущие на запрашиваемый момент времени значения bid, ask и last

Что-то я не понял Вас. Хотите сказать, что у Вас есть свой внутренний формат хранения истории. А CopyTicks при каждом запросе берет оттуда кусок и генерит свою последовательность MqlTick? Флаги те же вычисляет CopyTicks, а не хранятся они в истории? Некая прокладка, которая еще и вычисляет что-то, а не просто конвертит в удобный для юзера формат.

Мне не нужно, чтобы CopyTicks что-то там заполнял в зависимости от времени запроса. Я только хочу получать историю без искажений. И дописывать ее без проблем. 

К сожалению, исправления в текущий билд не попали.

Выпустите, пожалуйста, бета-билд на своем сервере. Уверен, что найду еще несоответствия. Давайте вылижем этот CopyTicks, чтобы ему, наконец, можно было доверять! 

 
fxsaber:
Советник дописывает свежие исторические тики и выявляет N-цатый баг CopyTicks
Если нужна ТОЛЬКО лента (COPY_TICKS_TRADE - time_msc, last, volume и flags), то данное решение полностью подходит - баги не выявлены.
Причина обращения: