Библиотеки: MultiTester - страница 50

 
Получение количества тиков в календарном месяце нештатным способом.
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

#define PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{
  MqlTick Ticks[];
  
  // Количество тиков за каленарный месяц штатным способом.
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2025.08.01' * 1000, D'2025.09.01' * 1000 - 1));
  
  // Количество тиков за календарный месяц нештатным способом.
  PRINT(MTTESTER::GetAmountFileMonthTicks(D'2025.08.01'));
}


Результат.

CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2025.08.01' * 1000, D'2025.09.01' * 1000 - 1) = 10820615
MTTESTER::GetAmountFileMonthTicks(D'2025.08.01') = 10820615
 
fxsaber

Почему 30, а не 31? Вроде бы заголовок рассчитан на 31 день.

uint Buffer[64 + 12 * 30];

А если крипта?

 
Stanislav Korotky #:

Почему 30, а не 31? Вроде бы заголовок рассчитан на 31 день.

Индексы от 0 до 30 - 31 штука.

 
fxsaber #:

Индексы от 0 до 30 - 31 штука.

Именно, от 0 по 30, включительно - итого 31.

 
Stanislav Korotky #:

Именно, от 0 по 30, включительно - итого 31.

Т.е Вы поняли, что все правильно?

 
fxsaber #:

Т.е Вы поняли, что все правильно?

Нет. В заголовке файлов, насколько я вижу, зарезервирован массив под 31 день, что логично. Значит в коде должно быть 12*31. Где я ошибаюсь?

Или приведите ссылку на описание формата tkc, где написано, что должно быть (максимум) 30 дней в месяце.

 
Stanislav Korotky #:

Нет. В заголовке файлов, насколько я вижу, зарезервирован массив под 31 день, что логично.

У меня нет никакой информации по заголовку. Делал кастомный символ и смотрел, какие байты меняются. Только из этих действий и понял, за что отвечают определенные байты в заголовке.

Значит в коде должно быть 12*31. Где я ошибаюсь?

Или приведите ссылку на описание формата tkc, где написано, что должно быть (максимум) 30 дней в месяце.

      uint Buffer[64 + 12 * 30];
      uint Read;

      kernel32::ReadFile(handle, Buffer, sizeof(Buffer), Read, 0);

      if (Read == sizeof(Buffer))
        for (int i = 63; i < (sizeof(Buffer) >> 2); i += 12)
          Res += (int)Buffer[i];

Переменная i принимает 31 значение.

 
fxsaber #:

У меня нет никакой информации по заголовку. Делал кастомный символ и смотрел, какие байты меняются. Только из этих действий и понял, за что отвечают определенные байты в заголовке.

Переменная i принимает 31 значение.

Понятно, отсчет в цикле с 63, а при описании массива на шапку отведено 64, что эквивалентно циклу начиная с -1. Не очень интуитивно, но математика сходится.

 
fxsaber #:
Получение количества тиков в календарном месяце нештатным способом.

Получить информацию об имеющихся исторических тиках по символам.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

string NumToString( ulong Num, const string Delimeter = " " )
{
  string Res = (Num ? NULL : "0");

  while (Num)
  {
    Res = ((Num < 1000) ? (string)(Num % 1000) : ::IntegerToString(Num % 1000, 3, '0')) +
          ((Res == NULL) ? NULL : Delimeter) + Res;

    Num /= 1000;
  }

  return(Res);
}

string TicksDataToString( const string Symb )
{
  datetime From = 0;
  datetime To;
  
  const int Amount = MTTESTER::GetAmountFileTicks(From, To, Symb);
  const string SizeStr = ::DoubleToString((long)Amount * sizeof(MqlTick) / (double)(1 << 20), 3) + " MB";
  
  return(Symb + ": " + NumToString(Amount) +" ticks (MqlTick[] = " + SizeStr + ")" +
         (From ? ", " + ::TimeToString(From) + " - " + ::TimeToString(To) +
                 ", " + GetDiffTime(From, To) // https://www.mql5.com/ru/forum/170952/page308#comment_57872629
               : NULL));  
}

void OnStart()
{
  const int Size = SymbolsTotal(true);
  
  for (int i = 0; i < Size; i++)
    Print(IntegerToString(i + 1, 3, '0') + "/" + IntegerToString(Size, 3, '0') +
          ". " + TicksDataToString(SymbolName(i, true)));
}


Результат.

001/045. EURUSD: 473 689 648 ticks (MqlTick[] = 27104.739 MB), 2011.12.01 00:00 - 2025.09.01 00:00, 13 Years 9 Months
002/045. GBPUSD: 508 981 458 ticks (MqlTick[] = 29124.153 MB), 2011.12.01 00:00 - 2025.01.01 00:00, 13 Years 1 Months
003/045. USDCAD: 402 756 151 ticks (MqlTick[] = 23045.892 MB), 2011.12.01 00:00 - 2025.01.01 00:00, 13 Years 1 Months
004/045. USDCHF: 353 129 808 ticks (MqlTick[] = 20206.250 MB), 2011.12.01 00:00 - 2025.01.01 00:00, 13 Years 1 Months
005/045. USDJPY: 482 177 651 ticks (MqlTick[] = 27590.427 MB), 2011.12.01 00:00 - 2025.01.01 00:00, 13 Years 1 Months
006/045. AUDCAD: 446 882 461 ticks (MqlTick[] = 25570.820 MB), 2011.12.01 00:00 - 2025.01.01 00:00, 13 Years 1 Months
007/045. AUDCHF: 387 336 224 ticks (MqlTick[] = 22163.557 MB), 2011.12.01 00:00 - 2025.01.01 00:00, 13 Years 1 Months


Видна причина ошибки 4004.

 
MTTester.mqh не компилируется. Я предполагаю, что это связано с недавней сборкой MT5, в которой есть много вещей, которые внезапно перестали компилироваться. Есть ли шанс, что вы сможете предоставить обновленную версию этой библиотеки? Кажется, что это потрясающая библиотека.