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

 
Sepulca:


А ведь правда, M15 кончаться раньше чем H1
И это только на этом баре, а дальше идет вообще рассогласование постепенно сдвигаясь на один бар дальше. Вот и хотелось бы услышать мнение разработчиков, может подскажут как обходить эту ошибку.
 
Barbarian:
Дыры в истории я проверял, к тому же рассогласование происходит на 3134 баре, дыра же не может быть на одном расстоянии от текущего бара.

от текущего какого? от H1 или от M15

смотри в цикл.

ты делаешь проход по 4000 барам H1. и ищешь бары M15 по очень странному коду.

int new_shift=shift*4;

что это???

ты надеешься что на М15 дыры заполняются сами собой.

при первой же дыре у тебя пойдет рассогласование на всех оставшихся барах.

ну и конечно - окончание М15 истории.

 
Barbarian:
Вот и хотелось бы услышать мнение разработчиков, может подскажут как обходить эту ошибку.
в данном случае - разработчик это Barbarian.

меняй подход. ибо этот BarShift в виде shift*4 - он неверный

 
sergeev:

от текущего какого? от H1 или от M15

смотри в цикл.

ты делаешь проход по 4000 барам H1. и ищешь бары M15 по очень странному коду.

что это???

ты надеешься что на М15 дыры заполняются сами собой.

при первой же дыре у тебя пойдет рассогласование на всех оставшихся барах.

ну и конечно - окончание М15 истории.


Проверку на дыры в истории я делал вставив
      if(testAR[0] != testAR[2])
         {
         testAR[1]=iBarShift(NULL, PERIOD_H1, iTime(NULL,PERIOD_H1, i),true);
         if(testAR[1]<0)
            {
            Alert("Часовой бар отсутствует в истории");
            break;
            }
...

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

 
sergeev:
в данном случае - разработчик это Barbarian.

меняй подход. ибо этот BarShift в виде shift*4 - он неверный

Если ты не понимаешь для чего он нужен то почему пытаешься сразу оскорбить, разработчик копирующих функций Метаквоты. А shift*4 это количество баров М15 которые присутствуют в каждом часе. Кстати если бы это вычисление было не верно, то рассогласование шло бы с первых баров, а оно начинается через несколько тысяч баров, что говорит о сдвиге - нарушении структуры тайм-серии.

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

 
Barbarian:

А shift*4 это количество баров М15 которые присутствуют в каждом часе.

твоя ошибка именно в этом предположении.


говорит о сдвиге - нарушении структуры тайм-серии.

это говорит лишь о следствии ошибочного допущения выше.


видимо столкнулись с подобными тебе, и просто обошли проблему по другому. Видимо и мне придется это сделать.

они столкнулись как и ты со своей бездоказательной базой. обвиняя других в баге своего кода.

а идти по любому придется по другому, ибо в таком виде код не будет работать как от него требуется.

PS
тебя оскорбить ваапще не хочу. просто кодеру не надо обвинять других в непонятых ему багах.
 
sergeev:

твоя ошибка именно в этом предположении.

это говорит лишь о следствии ошибочного допущения выше.

они столкнулись как и ты со своей бездоказательной базой. обвиняя других в баге своего кода.

а идти по любому придется по другому, ибо в таком виде код не будет работать как от него требуется.


Ну конечно, лучше обвинить спрашивающего в том что он ни чего не понимает, особенно это выгодно когда отвечающий не понимает вопроса и не знает на него соответственно ответа. А shift*4 делается для округления баров М15 до начала текущего часа в котором делается запрос, где shift это бар на М15.
 

Кстати если бы этот код не работал

        int new_shift=shift*4;
        double chas=MathFloor(ts[new_shift][TIME_INDEX]/60/60);
        double sec=chas*60*60;

то ошибка выявилась бы значительно раньше, а не на баре свыше 3000, я скорее поверю в дыры в истории, чем в неправильную логику этого фрагмента.

 
Уважаемый, вам шашечки, или ехать ? попробуйте сделать так как вам умные люди советуют, глядишь и сдвинется что в нужную сторону. не считайте себя самым "умным", некоторые на этом не одну собаку съели.
 
Barbarian:


дыры в истории, чем в неправильную логику этого фрагмента.

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

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

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

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,

Причина обращения: