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

 
CopyTicks выдает (b3510) ошибочные данные.
// Последние тики символа, полученные двумя способами.
void PrintLastTicks( const string Symb, const int Amount = 5 )
{
  MqlTick Ticks[];
  
  CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, Amount);
  Print("\nCopyTicks: " + Symb);
  ArrayPrint(Ticks); // Последние тики через CopyTicks.

  CopyTicksRange(Symb, Ticks);  
  Print("\nCopyTicksRange: " + Symb);
  ArrayPrint(Ticks, _Digits, NULL, ArraySize(Ticks) - Amount); // Последние тики через CopyTicksRange.
}

void OnStart()
{  
  MqlTick Ticks[];

  MathSrand((int)TimeLocal());  
  const string Name = "TICKS_BUG054_" + (string)MathRand();
    
  // Создали символ и заполнили тиками.
  if (CustomSymbolCreate(Name) && SymbolSelect(Name, true) &&
      (CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, D'2022.11.01' * 1000, D'2022.11.19' * 1000) > 0))
    CustomTicksReplace(Name, 0, LONG_MAX, Ticks);  
    
  PrintLastTicks(Name); // Распечатали последние тики нового символа
}


Результат запуска на MQ-Demo.

2022.11.20 16:38:59.375 Test9 (EURUSD,H1)       CopyTicks: TICKS_BUG054_23942
2022.11.20 16:38:59.375 Test9 (EURUSD,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2022.11.20 16:38:59.375 Test9 (EURUSD,H1)       [0] 2022.11.18 00:00:30 1.03583 1.03648 0.0000        0 1668729630240       6       0.00000
2022.11.20 16:38:59.375 Test9 (EURUSD,H1)       [1] 2022.11.18 00:00:31 1.03593 1.03654 0.0000        0 1668729631001       6       0.00000
2022.11.20 16:38:59.375 Test9 (EURUSD,H1)       [2] 2022.11.18 00:00:31 1.03586 1.03647 0.0000        0 1668729631043       6       0.00000
2022.11.20 16:38:59.375 Test9 (EURUSD,H1)       [3] 2022.11.18 00:00:46 1.03591 1.03647 0.0000        0 1668729646091       2       0.00000
2022.11.20 16:38:59.375 Test9 (EURUSD,H1)       [4] 2022.11.18 00:01:22 1.03641 1.03656 0.0000        0 1668729682576       6       0.00000
2022.11.20 16:38:59.542 Test9 (EURUSD,H1)       
2022.11.20 16:38:59.542 Test9 (EURUSD,H1)       CopyTicksRange: TICKS_BUG054_23942
2022.11.20 16:38:59.542 Test9 (EURUSD,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2022.11.20 16:38:59.542 Test9 (EURUSD,H1)       [0] 2022.11.18 23:54:46 1.03193 1.03195 0.0000        0 1668815686738       6       0.00000
2022.11.20 16:38:59.542 Test9 (EURUSD,H1)       [1] 2022.11.18 23:54:56 1.03194 1.03196 0.0000        0 1668815696318       6       0.00000
2022.11.20 16:38:59.542 Test9 (EURUSD,H1)       [2] 2022.11.18 23:54:56 1.03195 1.03197 0.0000        0 1668815696413       6       0.00000
2022.11.20 16:38:59.542 Test9 (EURUSD,H1)       [3] 2022.11.18 23:54:57 1.03196 1.03198 0.0000        0 1668815697826       6       0.00000
2022.11.20 16:38:59.542 Test9 (EURUSD,H1)       [4] 2022.11.18 23:54:59 1.03200 1.03202 0.0000        0 1668815699535       6       0.00000

CopyTicks выдает (красные сверху) не последние тики крайних суток, а первые тики этих суток. CopyTicksRange - правильно (желтые снизу).

Строка для поискаOshibka 054.

 
fxsaber #:
CopyTicks выдает (b3510) ошибочные данные.


Результат запуска на MQ-Demo.

CopyTicks выдает (красные сверху) не последние тики крайних суток, а первые тики этих суток. CopyTicksRange - правильно (желтые снизу).

Строка для поискаOshibka 054.

А почему вы считаете, что CopyTicks должен выдавать последние тики, когда вы явно запросили "дай мне 5 тиков с даты 0, то есть c начала"?

CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, Amount);

В документации явно написано про четвертый параметр - "дата, начиная с которой запрашиваются тики". Вы выставили дату = 0 (1970.01.01)

Видимо, вы спутали различие параметров у CopyTickRange, где последний параметр не количество баров, а дата конца периода. Причем у специального значения 0 есть уточнение:

Дата, по которую запрашиваются тики. Указывается в миллисекундах с 01.01.1970. Отдаются тики со временем <= to_msc. Если параметр to_msc не указан, то отдаются все тики до конца истории. 
 
Renat Fatkhullin #:

А почему вы считаете, что CopyTicks должен выдавать последние тики, когда вы явно запросили "дай мне 5 тиков с даты 0, то есть c начала"?

Документация.

from

[in]  Дата, начиная с которой запрашиваются тики. Указывается в миллисекундах с 01.01.1970. Если параметр from=0, то отдаются последние count тиков.

 
fxsaber #:

Документация.

Просмотрел, проверим.

 

На самом деле оказалась ошибка, внесенная во время оптимизации запросов.

Исправили, будет доступно в следующей бете.

Большое спасибо!
 

Какую ошибку могли найти? Странно…

/********************Script program start function*******************/
void OnStart()
 {
  MqlTick ticks[];
  CopyTicks(_Symbol, ticks, COPY_TICKS_ALL, 0, 5);
  ArrayPrint(ticks);
 }/******************************************************************/

результат


 
Renat Fatkhullin #:

На самом деле оказалась ошибка, внесенная во время оптимизации запросов.

Исправили, будет доступно в следующей бете.

Большое спасибо!

К сожалению, давно не могу использовать в торговле все эти исправления, т.к. мешают когда-то внесенные изменения в Терминал, влияющие на это.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3500: улучшения и исправления

fxsaber, 2022.11.15 01:12

Раз уж Вы здесь. Видится ли правильным, что удаление ордера (например, руками) вызывает помещение его не в конец БД исторических ордеров, а в середину?

Например, в Тестере любое помещение в БД ордера происходит дозаписыванием в конец. А в Терминале?

 
Alexey Viktorov #:

Какую ошибку могли найти? Странно…

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

 
Проверьте в бете 3512, пожалуйста.
 
Renat Fatkhullin #:
Проверьте в бете 3512, пожалуйста.

Похоже, исправили. Спасибо.

Это - нет.
Причина обращения: