Что не так с тиковой историей на 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