Что не так с тиковой историей на MetaQuotes-Demo - страница 4

 

И ещё непонятка: индикатор от начала 15-го года просчитывается и отрисовывается, а вот если его запустить от 14-го, то в конце года он "зависает". Никаких ошибок, ничего. Просто уже минут 10 "что-то" считает...

2021.07.12 10:06:27.180 nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Конец периода... 8 <=> 111 День недели = 5 >>> 23:59:56 >>> 2014-11-28
2021.07.12 10:06:27.233 nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Конец периода... 289 <=> 57 День недели = 5 >>> 23:59:58 >>> 2014-12-5
2021.07.12 10:06:39.008 nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Конец периода... 294 <=> 69 День недели = 5 >>> 23:59:59 >>> 2014-12-12
 

Запустил маленький скрипт для проверки тиков на "проблемной" неделе

//+------------------------------------------------------------------+
//|                                                     testNC14.mq5 |
//|                                     Copyright 2021, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Tabolin S.N."
#property link      "https://www.mql5.com/ru/users/vip.avos"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input datetime in_Start_Time = D'2014.12.15';
//+------------------------------------------------------------------+
MqlTick  ticks[];
//+---------------------
int      t  = 0;
//+---------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   datetime _Start_Time = in_Start_Time;
   uint     _Period_D1  = PeriodSeconds(PERIOD_W1);
   
   ResetLastError();
   ArrayFree(ticks);
   t = CopyTicksRange(Symbol(),ticks,COPY_TICKS_ALL,_Start_Time*1000,(_Start_Time+_Period_D1)*1000);
   if(t <= 0)  // Если скопированных тиков нет или ошибка
   {
      if(t < 0)   // Если ошибка
      {
         Print("LastError = ",GetLastError());
         //return(false);
      }
      else  Print(TimeToString(_Start_Time)," >>> Нет тиков...");
   }
   else        // Если тики есть
   {
      for(int i = 0; i < t; i++)
      {
         Print(i, " > ", TimeToString(ticks[i].time), " > ", ticks[i].bid, " > ", ticks[i].ask);
      }
   }
//+---------------------
}

Никаких проблем, кроме "лишних" тиков не увидел

HO      0       11:05:30.942    testNC14 (GBPUSD,H1)    0 > 2014.12.15 00:00 > 0.0 > 0.0
LE      0       11:05:30.942    testNC14 (GBPUSD,H1)    1 > 2014.12.15 00:00 > 1.57144 > 1.5739
LL      0       11:05:30.942    testNC14 (GBPUSD,H1)    2 > 2014.12.15 00:00 > 1.569 > 1.57635
QJ      0       11:05:30.942    testNC14 (GBPUSD,H1)    3 > 2014.12.15 00:00 > 1.569 > 1.57635
CP      0       11:05:30.943    testNC14 (GBPUSD,H1)    4 > 2014.12.15 00:00 > 1.5717 > 1.5737
HO      0       11:05:30.943    testNC14 (GBPUSD,H1)    5 > 2014.12.15 00:00 > 1.569 > 1.57635
.........
EK      0       11:05:40.070    testNC14 (GBPUSD,H1)    625065 > 2014.12.19 23:59 > 1.56442 > 1.5645
ES      0       11:05:40.070    testNC14 (GBPUSD,H1)    625066 > 2014.12.19 23:59 > 1.56191 > 1.56362
MM      0       11:05:40.070    testNC14 (GBPUSD,H1)    625067 > 2014.12.19 23:59 > 1.56442 > 1.5645
DH      0       11:05:40.070    testNC14 (GBPUSD,H1)    625068 > 2014.12.19 23:59 > 1.56167 > 1.56409
QS      0       11:05:40.070    testNC14 (GBPUSD,H1)    625069 > 2014.12.22 00:00 > 1.56093 > 1.56303
GN      0       11:05:40.070    testNC14 (GBPUSD,H1)    625070 > 2014.12.22 00:00 > 1.56251 > 1.56309
RH      0       11:05:40.070    testNC14 (GBPUSD,H1)    625071 > 2014.12.22 00:00 > 1.56093 > 1.56303

Добавил в индикатор проверку на лишние тики, запустил и всё-равно на этой неделе происходит зависание. Почему? Не понимаю...

   int            checkDay    = -1;
....
         TimeToStruct(ticks[i].time,tm);
         if(tm.day_of_week > checkDay) checkDay = tm.day_of_week;
         if(tm.day_of_week < checkDay)
         {
            checkBody("ticks", i, i-1);
            break;
         }
 
Сергей Таболин:

Запустил маленький скрипт для проверки тиков на "проблемной" неделе

Никаких проблем, кроме "лишних" тиков не увидел

Добавил в индикатор проверку на лишние тики, запустил и всё-равно на этой неделе происходит зависание. Почему? Не понимаю...

Попробуйте время убавить на одну миллисекунду

t = CopyTicksRange(Symbol(),ticks,COPY_TICKS_ALL,_Start_Time*1000,(_Start_Time+_Period_D1)*1000-1);
 
Alexey Viktorov:

Попробуйте время убавить на одну миллисекунду

Спасибо. Не помогло.

Заколдованная неделя какая-то...

 
Просто не могу сообразить, что именно распринтовать, чтобы выловить то, на чём виснет...
 

Оказалось, что "зависания" нет.

Но есть непонятный бесконечный цикл... Или что? Пока не знаю как это отловить..

При запуске от 2014.12.01 00:00

HL      0       09:43:46.583    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Самый первый тик >>> 2014.12.01 00:00
MH      0       09:43:46.584    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Тик №1 имеет цену...
DP      0       09:43:46.584    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 0
RJ      0       09:43:46.585    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 1
IG      0       09:43:46.585    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 2
EQ      0       09:43:46.586    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 3
DK      0       09:43:46.588    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 4
QD      0       09:43:46.588    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 5
QN      0       09:43:46.590    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 6
MH      0       09:43:46.593    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 7
KE      0       09:43:46.594    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 8
JO      0       09:43:46.594    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 9
GK      0       09:43:46.595    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10
PM      0       09:43:46.595    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Конец периода... 178 <=> 168 День недели = 5 >>> 23:59:58 >>> 2014-12-5
FQ      0       09:43:46.595    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 11
HM      0       09:43:46.669    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Тик №1 без цены...
EH      0       09:43:46.669    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     > Первый тик в контейнере >>> 2014.12.08 00:00
KS      0       09:43:46.669    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     > Тиков в контейнере >>> 604765
LQ      0       09:43:46.669    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Тик №2 имеет цену...
NJ      0       09:43:46.671    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 12
DP      0       09:43:46.672    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 13
MO      0       09:43:46.676    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 14
EE      0       09:43:46.677    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 15
DP      0       09:43:46.680    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 16
NN      0       09:43:46.683    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 17
NE      0       09:43:46.684    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 18
JL      0       09:43:46.689    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Конец периода... 367 <=> 206 День недели = 5 >>> 23:59:59 >>> 2014-12-12
RS      0       09:43:46.689    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 19

Первая неделя 12 свечей, вторая - 8, а вот дальше...

GL      0       09:43:46.763    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Тик №1 без цены...
RJ      0       09:43:46.763    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     > Первый тик в контейнере >>> 2014.12.15 00:00
DR      0       09:43:46.763    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     > Тиков в контейнере >>> 625069
OR      0       09:43:46.763    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     Тик №2 имеет цену...
CD      0       09:43:46.765    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 20
MS      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 21
DI      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 22
KD      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 23
JR      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 24
QI      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 25
HG      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 26
OR      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 27
NH      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 28
EG      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 29
EM      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 30
NH      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 31
CF      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 32
LM      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 33
IK      0       09:43:46.766    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 34
...........
PS      0       09:43:48.827    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10641
RM      0       09:43:48.828    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10642
PF      0       09:43:48.829    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10643
GS      0       09:43:48.830    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10644
JL      0       09:43:48.830    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10645
NI      0       09:43:48.831    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10646
NR      0       09:43:48.832    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10647
EO      0       09:43:48.832    nCandles_FgAMAp_1W_1.03 (GBPUSD,H1)     =>=>=> newCandles_index = 10648

И это ещё не конец!

Чертовщина какая-то...


Получается, что не определяется последний тик ...

         // проверяем свечу на заданный размер
         checkBody("ticks", ticks_size, i);
======
//+------------------------------------------------------------------+
int   checkBody(string time, int ticks_size = 0, int i = 0)
{
   MqlDateTime    tm;
   
   .......
   // если последний тик в контейнере
   if(i == ticks_size - 1)
   {
      TimeToStruct(ticks[i].time, tm);
      Print("Конец периода... ", bodyUP, " <=> ", bodyDN, " День недели = ", tm.day_of_week, " >>> ", tm.hour, ":", tm.min, ":", tm.sec, " >>> ", tm.year, "-", tm.mon, "-", tm.day);
 
Сергей Таболин:

Оказалось, что "зависания" нет.

Но есть непонятный бесконечный цикл... Или что? Пока не знаю как это отловить..

При запуске от 2014.12.01 00:00

Первая неделя 12 свечей, вторая - 8, а вот дальше...

И это ещё не конец!

Чертовщина какая-то...


Получается, что не определяется последний тик ...

Скорее всего, неправильное значение tick_size. Но в любом случае исправить легко:

if(i >= ticks_size - 1)
 
Ihor Herasko:

Скорее всего, неправильное значение tick_size. Но в любом случае исправить легко:

Попробовал - не помогло...

Да и по логике i никак не может быть больше

      t = CopyTicksRange(Symbol(),ticks,COPY_TICKS_ALL,_Start_Time*1000,(_Start_Time+_Period_CP)*1000);
         buildCandlesT(t);
//+------------------------------------------------------------------+
void  buildCandlesT(int ticks_size)
{
   for(int i = 0; i < ticks_size; i++)
   {
         checkBody("ticks", ticks_size, i);
//+------------------------------------------------------------------+
int   checkBody(string time, int ticks_size = 0, int i = 0)
{
   if(i == ticks_size - 1)
   {
 
Сергей Таболин:

Попробовал - не помогло...

Да и по логике i никак не может быть больше

Может, если tick_size имеет отрицательное значение.

 
Ihor Herasko:

Может, если tick_size имеет отрицательное значение.

Возможно, но у меня есть проверка на этот случай и размер конкретно этого контейнера = 

> Тиков в контейнере >>> 625069