Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2494

 
Andrei Sokolov #:


Хоспаде, какие костыли. С костылем, и меньшим, я и так уже сделал. Хотелось бы без костылей. Чтоб стоковые функции адекватно работали без костылей - неужели это неразумное желание? 

У Вас не костыль?

при первом вызове считать не через время, а через индекс свечи, чтоб не использовать  iBarShift

Не меньший? Что будете делать, если по индексу не получите?

Интересная реакция при запросе помощи. Пометим себе, чтобы далее больше зря не тратить время.

А вообще, при неполучении нужных данных выходить из расчётов - это стандартное рекомендуемое поведение для индикаторов.

 
Artyom Trishkin #:

У Вас не костыль?

Не меньший? Что будете делать, если по индексу не получите?

Интересная реакция при запросе помощи. Пометим себе, чтобы далее больше зря не тратить время.

Спасиб, конечно, но предложение подождать два дня пока пройдут выходные - не очень подходит. 

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

За вариант с переключением тф - спасиб.

 
Artyom Trishkin #:
Не меньший? Что будете делать, если по индексу не получите?

Так индекс он уже есть индекс. Тут ничего не нужно получать.


 
Andrei Sokolov #:

Спасиб, конечно, но предложение подождать два дня пока пройдут выходные - не очень подходит. 

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

За вариант с переключением тф - спасиб.

Честно говоря, вообще не понял, Вы на родном тф не можете получить данные? Это не мтф индикатор?

ЗЫ. Не нужно два дня ждать для получения нужных данных. Для родного тф данные уже все посчитаны же. И время есть в предопределённых массивах и все остальные цены - тоже. На ровном месте проблему нашли по-моему.

 
Artyom Trishkin #:
На ровном месте проблему нашли по-моему.

Это шутка такая? Или я сочиняю что iBarShift -1 возвращает?

 
Artyom Trishkin #:
Для родного тф данные уже все посчитаны же. И время есть в предопределённых массивах и все остальные цены - тоже.

Зачем это писать когда я пишу что проблема с iBarShift ?

 
Andrei Sokolov #:

Зачем это писать когда я пишу что проблема с iBarShift ?

Вы делаете репорт об ошибке?

Или Вы пишете программу, где просите указать как обойти ошибки в iBarShift максимально просто без "костылей"?

По-моему, и судя по Вашим постам - второе.

Вам сказали именно в ключе второй ситуации: для получения нужных данных в не мтф индикаторе используйте значения, возвращаемые из предопределённых массивов, так как в них уже все данные точно есть. Не используйте iBarShift, так как его использование там, где он не нужен в принципе - это проблемы себе на ровном месте. Как ещё Вам донести о том, что это и есть ответ Вам на Ваш вопрос?

Ваш вопрос, и мой первый на него ответ:

Т.е. при запросе данных посредством iBarShift, обязательно проверяем полученный результат. Если это -1, то просто уходим из индикатора, возвращая либо 0, либо prev_calculated. Если возвращаете 0, то на следующем тике будет полный перерасчёт всего индикатора на всей истории, если возвращаете prev_calculated, то пересчёт будет только для тех баров, которые оказались ещё не посчитанными на прошлом тике. Это уже зависит от логики, заложенной в индикатор, где используется iBarShift.

Такой ответ понятен?

Но так как у Вас индикатор не мультитаймфреймный, то от этой логики можно уйти. Просто понять, что в предопределённых массивах УЖЕ лежат все синхронизированные данные. Их количество находится в тоже предопределённой переменной rates_total. Отсюда следует, что использование iBarShift там, где он не нужен - это проблемы себе на ровном месте.

Такое дополнение к ответу понятно?

 
Andrei Sokolov #:

Зачем это писать когда я пишу что проблема с iBarShift ?

- дарагой, не магу шашлик взят, э?

- так бери - вот же он лежит.

- э, сачэм абыжаешь - прихватка сломался - нэ магу взят, э?

 
Artyom Trishkin #:

При НЕполучении нужных данных выйти из обработчика с возвратом такого значения, которое на следующем тике позволит заново пересчитать требуемое.

Если выходные, нет тиков, то либо сначала перейти на нужный таймфрейм, а затем вернуться на рабочий, либо эмулировать тик.

Артём, давайте обсудим MTF

Моя реализация, другого не нашёл

// ENUM_TIMEFRAMES timeFrames[] = {PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4};
CountTF = 4;
for(int i=0; i<CountTF; i++) {
      long b=SeriesInfoInteger(Symbol(),timeFrames[i],SERIES_BARS_COUNT);
      //Print("Histiry ",timeFrameToString(timeFrames[i]),", bar=",b);
      if(b<10) {
        Print("Download histiry ",timeFrameToString(timeFrames[i]),", bar=",b);
        ChartSetSymbolPeriod(0,NULL,0); // ???
        return(0);
      }
    }
 // далее код выполнения
 

если MTF (кстати и не только MTF) ещё и в индикаторные буферы что-то такое пишет, что пользователь должен видеть (то есть индик не только для роботов делается), или требуется скорость и гарантии

то ChartSetSymbolPeriod(0,NULL,0) не панацея..он асинхронный и получается ощутимая задержка между вызовом и отображением на экране. И можно словить глюк вызывая из советника: при обращении к CopyBuffer результата нет, хотя все условия есть. А просто индикатор уже выставил SetSymbolPeriod, но новый рассчёт ещё не запустился. И советник попал в этот мизерный промежуток. А трейдер попал на деньги :-)

выход: своя отдельная рассчётная функция, которую удобно вызывать не только из OnCalculate.. И которая не использует его буферы time/open/high/etc (сама делает CopyXXX или CopyRates при надобности), потому что в других местах их просто нет.