![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Оно то всё понятно. Но есть один момент. Что если по какой-то причине определённый бар не просчитается ? В тот момент уже будет просчитано баров на 1 больше. Соответственно, будет сдвиг в итарации просчитанных баров. Я понимаю, что обычно подобных вариантов не возникнет, но всё же ситуация может быть подобная. Тогда как быть?
Просто используй мой код.
Я 4 страницы боролся на mql5 с флудерами и модераторами. Итог того что можно выжать это код приведённый выше.
barabashkakvn, ну так вот, например, Василий у себя в коде шаблона индюка, который он выложил тоже накуралесил. Там на каждом тике происходит инициализация массивов буферных и обнуление счётчика counted при условииif (all - counted > 1). Вот так:
Я против ничего не имею, Василий смог написать так. Но у меня другие подходы. Предпочитаю писать прямо и читабельно, чтобы всё было красиво. Так вот. Если работать таким образом, используя для подсчёта переменную prev_calculated, то скажу прямо. Реализация конченнейшая. Как я и писал выше. Я сразу написал, что мне интересно работать не со всем графиком, а с его частью. Например, если в терминале имеется история за много лет ТФ=М1. Какой мне резон просчитывать всю историю? Я уже видел, как некоторые индюки просчитываю достаточно длительное время такие промежутки времени. Меня это не далеко вдохновляет. Почему реализация конченная? Покажу на примере:
Есть у меня метод простенький для подсчёта количества баров, которые находятся на графике до заданной в вводном параметре индюка:
Так вот, на выходе имеем количество баров, которое необходимо просчитать. Больше мне нафиг не нужно. Особо расписывать всё не буду, а покажу что у меня в OnCalculate() и несколько сопутствующих функциях и что вижу в журнале:
Так вот чётко видно, что в функции ZigZag (int limit) в цикле for (int i = limit; i > 0; i--) я просчитаю только столько баров сколько я получил в результате работы функции RatesCount(), которая отрабатывает в ИНИТЕ. Так вот, при запуске терминала всё просчитывается верно, а дальше начинается полнейшая хрень. Терминал, есс-но не втыкает, что я не нуждаюсь в просчёте всей истории, и возвращает мне на втором тике prev_calculated != ratesCount, как это должно быть, а количество, как я понял, всех баров, которые имеются у меня в истории, есс-но с учётом ограничений заданных в настройках терминала.
Неужели других вариантов нет вообще?
Я пообещал на росийскоязычной части форума не помагать больше, но поскольку это ещё старый разговор, то.
Берёшь мой код
и меняешь
на
if(i>твои_бары) i=твои_бары;
P.S. all - counted может быть только при подкачке истории:))))))))))))))))
barabashkakvn, ну так вот, например, Василий у себя в коде шаблона индюка, который он выложил тоже накуралесил. Там на каждом тике происходит инициализация массивов буферных и обнуление счётчика counted при условииif (all - counted > 1). Вот так:
Я против ничего не имею, Василий смог написать так. Но у меня другие подходы. Предпочитаю писать прямо и читабельно, чтобы всё было красиво. Так вот. Если работать таким образом, используя для подсчёта переменную prev_calculated, то скажу прямо. Реализация конченнейшая. Как я и писал выше. Я сразу написал, что мне интересно работать не со всем графиком, а с его частью. Например, если в терминале имеется история за много лет ТФ=М1. Какой мне резон просчитывать всю историю? Я уже видел, как некоторые индюки просчитываю достаточно длительное время такие промежутки времени. Меня это не далеко вдохновляет. Почему реализация конченная? Покажу на примере:
Есть у меня метод простенький для подсчёта количества баров, которые находятся на графике до заданной в вводном параметре индюка:
Так вот, на выходе имеем количество баров, которое необходимо просчитать. Больше мне нафиг не нужно. Особо расписывать всё не буду, а покажу что у меня в OnCalculate() и несколько сопутствующих функциях и что вижу в журнале:
Так вот чётко видно, что в функции ZigZag (int limit) в цикле for (int i = limit; i > 0; i--) я просчитаю только столько баров сколько я получил в результате работы функции RatesCount(), которая отрабатывает в ИНИТЕ. Так вот, при запуске терминала всё просчитывается верно, а дальше начинается полнейшая хрень. Терминал, есс-но не втыкает, что я не нуждаюсь в просчёте всей истории, и возвращает мне на втором тике prev_calculated != ratesCount, как это должно быть, а количество, как я понял, всех баров, которые имеются у меня в истории, есс-но с учётом ограничений заданных в настройках терминала.
Неужели других вариантов нет вообще?
Твоя проблема в этой строке
В моём графике 5217 баров, этот код обрабатывает только 17 баров и по завершении цикла prev_calculated возвращает 5217, соответственно дальше обрабатывается только последний бар.
Затем, когда появится новый бар, rates_total будет равен 5218 и будет обработано два последних бара первый и нулевой. Дальше prev_calculated вернёт 5218 и всё повторится...
Я пообещал на росийскоязычной части форума не помагать больше, но поскольку это ещё старый разговор, то.
Мне ты ничего не обещал )) Видать придётся так абы-как и делать, ибо нормально не выйдет. А модераторы молчат, т.к. им сказать по ходу не чего. Бсполезные встроенные переменные висят мёртвым грузом.. Пофиг, пусть пока будет так.
Такое я тоже думал, но я пишу по ходу пьесы всегда всё так, чтоб потом можно было перенести на другую платформу. А с такими кривыми "вкроплениями" придётся по возится чутка больше если что.
Функция OnCalculate возвращает:
//--- return value of prev_calculated for next call
return (rates_total);
Я пообещал на росийскоязычной части форума не помагать больше, но поскольку это ещё старый разговор, то.
Берёшь мой код
и меняешь
на
P.S. all - counted может быть только при подкачке истории:))))))))))))))))
Функция OnCalculate возвращает:
//--- return value of prev_calculated for next call