Ошибка в моём коде на MQL4 - страница 4

 
sergeev:

ну так дыры в истории и есть причиной последствий бага.

код абсолютизирует допущение, что дыр нет.

что происходит в коде

1. new_shift ты задаешь равным НОМЕР_БАРА_H1 * 4 - это первое допущение, что нужный тебе М15 бар будет отстоять на ровно в 4 раза большем индексе, чем H1

2. ts[new_shift][TIME_INDEX] - тут ты это допущение используешь. берешь время М15 бара, по полученному индексу.


Но индекс у тебя изначально НЕВЕРНЫЙ. так как в истории М15 - дыра оказалась на надцатом баре.
Ты вышел из ситуации циклом подгонки и это скрыло реальные индексы дыр - for(int i=new_shift; i<new_shift+4

этот цикл спасает допущение, пытаясь найти нужное время бара среди 4 соседних.
но по логике - искать ты не должен вообще. а должен сразу брать нужный бар shift*4. Ибо допустил, что индекс М15 должен быть 100% на *4 месте от H1. зачем же его подгонять циклом i<new_shift+4 ??


в дальнейшем не учитываешь накапливающуюся ошибку для последующих правильных смещений новых shift.
в результате уже через 4 дыры на М15 начинается сплошное расхождение.
и всё. баг в коде становится очевиден.

я только что загрузил историю, создал таймфреймы - на моем тесте расхождения начинаются только на последнем баре конца истории М15,

А где твой правильный код?
 
Barbarian:
А где твой правильный код?

Константин, это несерьезно с твоей стороны.

Кто тут из нас кодер ты или я? :)

просил найти ошибку - я нашел. даже пояснил где.

 
sergeev:

Константин, это несерьезно с твоей стороны.

Кто тут из нас кодер ты или я? :)

просил найти ошибку - я нашел. даже пояснил где.

Так ошибки тогда лезут с самого начала, я это пробовал уже и дыр в самом начале нет, по выводу видно. Ты покажи свой правильный код, мы же не загадки загадываем друг другу. Я ведь свой неправильный код показал.
 
sergeev:
Вот моя переделанная функция перевода из М15 в Н1
//+----------------------------------------------------------------------------+
//|     Описание: Перевод PERIOD_M15 на PERIOD_H1                                                                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                                                                                         |
//|     ts - массив тайм-серии                             |    shift - индекс начального бара   |
//|     row - размер по строкам(число баров)|                                                                             |
//+----------------------------------------------------------------------------+
int iPeriodH1(double& ts[][],int row,int shift)
        {
        int new_shift=0;
        double chas=MathFloor(ts[0][TIME_INDEX]/60/60); // тут округляем секунды с 01.01.1970 до самого последнего часа, т.е. бар 0
        double sec=(chas-shift)*60*60; // тут делаем корректировку на искомый час начиная с 0 бара и снова переводим в секунды уже найденный час
        for(int i=0; i<shift*4 && i<row; i++) // тут задаем цикл поиска и ограничиваем поиск для оптимизации кода - shift*4 т.к. найденный нужный час в секундах не может превышать четырех М15
                {
                if(sec == ts[i][0]) // тут ищем соответствие вычисленного часа на М15
                        {
                        new_shift=i; // в случае соответствия присваиваем i переменной new_shift т.к. это соответствует номеру бара на М15
                        break;
                        }
                }
        return(new_shift);
        }
сделал так, но ошибки все равно лезут...
 
Barbarian:
Вот моя переделанная функция перевода из М15 в Н1 сделал так, но ошибки все равно лезут...

почему так сложно? у тебя ведь и так есть iTime на PERIOD_H1, shift. зачем вручную вычислять sec ?

и если уж начал бежать от i=0, то беги до row

и проверять не

sec == ts[i][0]

а

sec <= ts[i][0]


таким образом ты сделал свою неоптимизированную iBarShift с параметром exact=false

 
sergeev:

почему так сложно? у тебя ведь и так есть iTime на PERIOD_H1, shift. зачем вручную вычислять sec ?

и если уж начал бежать от i=0, то беги до row

и проверять не

а

таким образом ты сделал свою неоптимизированную iBarShift с параметром exact=false

т.е. рассогласования происходят из-за дыр на графике? бред какой то :(

я ведь на сравнении ищу одинаковое время открытия бара на H1 и M15

 
Barbarian:

я ведь на сравнении ищу одинаковое время открытия бара на H1 и M15

break из функции будет по условию
sec <= ts[i][0]

потом проверь сразу на равность

sec == ts[i][0]

если равно, то ок, иначе функция выдаст ближайший по времени i.

кстати - если выполнилось условие

sec <= ts[i][0]

то тут ты сможешь проверить сразу на равность shift*4 и найденного i

по допущению они должны быть равны, иначе на чарте найдена дырка

 
sergeev:
break из функции будет по условию

потом проверь сразу на равность

если равно, то ок, иначе функция выдаст ближайший по времени i.

кстати - если выполнилось условие

то тут ты сможешь проверить сразу на равность shift*4 и найденного i

по допущению они должны быть равны, иначе на чарте найдена дырка

собрал функцию:
int iPeriodH1(double& ts[][],int row,int shift)
   {
   int ix=0;
   double chas=MathFloor(ts[0][TIME_INDEX]/60/60);
   double sec=(chas-shift)*60*60;
   for(int i=0; i<row; i++)
      {
      if(sec <= ts[i][0])
         {
         if(shift*4 != i)Print("На чарте дырка :",shift*4," i ",i);
         if(sec==ts[i][0]) ix=i;
         }
      else break;
      }
   return(ix);
   }
но результат вообще какой то бредовый, получается что МТ4 видит на истории дырки, а я на графике их не вижу... во вложении файл вывода не совпадений и совпадений, получается что совпадает только последние сутки, а остальное дыра что ли?
Файлы:
test1.txt  171 kb
test1_1.txt  1 kb
 

Судя по выводам в файл, на графике имеется отсутствие М15 начиная с 29 числа. А я вижу все бары на графике на М15 и на Н1.

 

Провел анализ истории на наличие дыр этим скриптом https://www.mql5.com/ru/code/7093 и другими - результат одинаковый, с 02.01.2013 года у меня дыр нет ни на Н1 ни на М15, для достоверности считал каждый отсутствующий бар дырой. А судя по выводу моей функции, дыр нет только в последних сутках, а если проанализировать вывод, то получается, что расхождения начинаются на окончании предыдущей недели. Но ведь дыр там нет если верить скрипту. В чем может быть причина уже не понимаю вообще. Подскажите куда копать.

Во вложении результат моей истории и выводы функции на схождение/расхождение.

Файлы:
files.zip  37 kb
Причина обращения: