ну так дыры в истории и есть причиной последствий бага.
код абсолютизирует допущение, что дыр нет.
что происходит в коде
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,
Так ошибки тогда лезут с самого начала, я это пробовал уже и дыр в самом начале нет, по выводу видно. Ты покажи свой правильный код, мы же не загадки загадываем друг другу. Я ведь свой неправильный код показал.
//+----------------------------------------------------------------------------+//| Описание: Перевод 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 до самого последнего часа, т.е. бар 0double 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 т.к. это соответствует номеру бара на М15break;
}
}
return(new_shift);
}
но результат вообще какой то бредовый, получается что МТ4 видит на истории дырки, а я на графике их не вижу...
во вложении файл вывода не совпадений и совпадений, получается что совпадает только последние сутки, а остальное дыра что ли?
Провел анализ истории на наличие дыр этим скриптом https://www.mql5.com/ru/code/7093 и другими - результат одинаковый, с 02.01.2013 года у меня дыр нет ни на Н1 ни на М15, для достоверности считал каждый отсутствующий бар дырой. А судя по выводу моей функции, дыр нет только в последних сутках, а если проанализировать вывод, то получается, что расхождения начинаются на окончании предыдущей недели. Но ведь дыр там нет если верить скрипту. В чем может быть причина уже не понимаю вообще. Подскажите куда копать.
Во вложении результат моей истории и выводы функции на схождение/расхождение.
ну так дыры в истории и есть причиной последствий бага.
код абсолютизирует допущение, что дыр нет.
что происходит в коде
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,
А где твой правильный код?
Константин, это несерьезно с твоей стороны.
Кто тут из нас кодер ты или я? :)
просил найти ошибку - я нашел. даже пояснил где.
Константин, это несерьезно с твоей стороны.
Кто тут из нас кодер ты или я? :)
просил найти ошибку - я нашел. даже пояснил где.
Вот моя переделанная функция перевода из М15 в Н1 сделал так, но ошибки все равно лезут...
почему так сложно? у тебя ведь и так есть iTime на PERIOD_H1, shift. зачем вручную вычислять sec ?
и если уж начал бежать от i=0, то беги до row
и проверять не
sec == ts[i][0]а
sec <= ts[i][0]таким образом ты сделал свою неоптимизированную iBarShift с параметром exact=false
почему так сложно? у тебя ведь и так есть iTime на PERIOD_H1, shift. зачем вручную вычислять sec ?
и если уж начал бежать от i=0, то беги до row
и проверять не
а
таким образом ты сделал свою неоптимизированную iBarShift с параметром exact=false
т.е. рассогласования происходят из-за дыр на графике? бред какой то :(
я ведь на сравнении ищу одинаковое время открытия бара на H1 и M15
я ведь на сравнении ищу одинаковое время открытия бара на H1 и M15
sec <= ts[i][0]потом проверь сразу на равность
sec == ts[i][0]если равно, то ок, иначе функция выдаст ближайший по времени i.
кстати - если выполнилось условие
sec <= ts[i][0]то тут ты сможешь проверить сразу на равность shift*4 и найденного i
по допущению они должны быть равны, иначе на чарте найдена дырка
break из функции будет по условию
потом проверь сразу на равность
если равно, то ок, иначе функция выдаст ближайший по времени i.
кстати - если выполнилось условие
то тут ты сможешь проверить сразу на равность shift*4 и найденного i
по допущению они должны быть равны, иначе на чарте найдена дырка
Судя по выводам в файл, на графике имеется отсутствие М15 начиная с 29 числа. А я вижу все бары на графике на М15 и на Н1.
Провел анализ истории на наличие дыр этим скриптом https://www.mql5.com/ru/code/7093 и другими - результат одинаковый, с 02.01.2013 года у меня дыр нет ни на Н1 ни на М15, для достоверности считал каждый отсутствующий бар дырой. А судя по выводу моей функции, дыр нет только в последних сутках, а если проанализировать вывод, то получается, что расхождения начинаются на окончании предыдущей недели. Но ведь дыр там нет если верить скрипту. В чем может быть причина уже не понимаю вообще. Подскажите куда копать.
Во вложении результат моей истории и выводы функции на схождение/расхождение.