![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Привет, ШОК,
Я получил его. Большое спасибо.
если есть 100 бар, общие ставки начинаются от 0 до 99.
В начале, pre_cal =0 --> limit=100 бар - 0 =100.
for(int=1 to limit=100; I++)
в самом конце, I=100(значение индекса) и такого бара 100 не существует.
Поэтому, чтобы сделать максимальный I=99, я ставлю limit -1;
Интересно, есть ли лучший способ?
Более того, меня смущает то, что во многих других индикаторах я использую тот же подход и нет такой проблемы выхода за пределы диапазона.
Также спасибо за вкладку Expert.
SCFX
Более того, меня смущает то, что во многих других индикаторах я использую тот же подход, и там нет такой проблемы выхода за пределы диапазона.
До выхода B600 за пределы диапазона не было критической ошибкой
Поэтому, чтобы сделать максимальный I=99, я ставлю limit -1;
Интересно, есть ли лучший способ?
Ваш код теперь будет рисовать историю графика от бара 1 вверх без ошибок, но он не будет рисовать для любых новых баров. Есть много способов написать код в зависимости от того, что вы хотите, чтобы он делал. Посмотрите на включенные индикаторы в metaeditor, чтобы увидеть, как это делают кодеры MQ. Когда вы сможете прочитать их код и понять причину каждой строки, у вас не будет проблем с созданием индикаторов.
Теперь я понял, что это ШОК.
Лично мне трудно представить, когда я читаю документ. До сих пор я не уверен, почему prev_calculated= Total_rates -1.
Поэтому я привожу здесь числовой пример. Надеюсь, он поможет кому-то новому, как я.
Обычно мы видим:
Limit= rates_total- prev_calculated; //(no-1)
ИЛИ
for(i=1;i<limit;i++) or for(i=1;i<=limit;i++)
Важно убедиться, что LIMIT >=1. В моей ситуации LIMIT=0 и поэтому индикатор не обновляется при поступлении нового тика.
Почему, давайте посмотрим. (Я думаю, что причина в prev_calculated, по крайней мере, в моем случае).
Предположим, что я устанавливаю индикатор, когда на графике 100 баров. Вот значения переменных:
Первая таблица значений
Переменная
Total_rates 100
Index of bar 0-99
prev_calculated 0
Limit 100
Loop i value 1-99
Все хорошо. Значение будет отображаться первый раз с бара 1 до начала графика.Сколько баров уже рассчитано? Это критическая точка моей ошибки и я не понимаю на 100%.
Когда начинается новый бар, на графике сейчас 101 бар. Индикатор не обновляется на уже закрытом баре, который сейчас является баром 1.
Вторая таблица значений
Переменная
Total_rates 101
Индекс бара 0-100
prev_calculated 99 OR 100 (см. ниже)
Limit2 ИЛИ 1
Loop i value 1to1 ИЛИ 1 to 0
Исходя из 1-ой таблицы, индикатор рассчитывает 99 бар (так как он зацикливается от 1 до 99).
Итак, решение вполне очевидно: Make for(i=1; ___ здесь должно быть больше 1 for (<) или больше или равно 1 for (<=)___; i++). В моем последнем коде он равен 0.Однако в документе сказано: "НО если это не первый вызов start(), то будет возвращено значение, равное Bars-1). Таким образом, будет возвращено 101-1=100.
Этот один бар вызывает проблемы. Если система возвращает 100 как prev_calculated.
Вы видите, что если prev_calculated=99, то цикл будет работать.
Однако, похоже, что prev_calculated = 100 и поэтому цикл не будет работать, так как limit =0 или -1 в зависимости от этого.
Может ли кто-нибудь помочь мне увидеть логику, стоящую за prev_calculated= Bars-1 в этом случае?
Надеюсь, это поможет.
SCFX
prev_calculated == rates_total
Теперь я понял, что это SDC.
Лично мне трудно представить, когда я читаю документ. Но все же я не уверен, почему prev_calculated = Total_rates -1.
SCFX
Создайте новый индикатор, поместите этот код в функцию start, прикрепите его к 1-минутному графику и наблюдайте за алертами по мере поступления тиков.
Вы увидите, что rates_total - это текущее количество баров.
prev_calculated - количество баров на предыдущем тике.
prev_calculated == rates_total
Создайте новый индикатор, поместите этот код в функцию start, прикрепите его к 1-минутному графику и наблюдайте за оповещениями по мере поступления тиков.
Вы увидите, что rates_total - это текущее количество баров.
prev_calculated - количество баров на предыдущем тике.
Странно.
В ссылке, размещенной ранее, говорится, что если :НО если это не первый вызов start(), то будет возвращено значение, равное Bars-1.
Как получается, что возвращается Bars (Rate_totals).
Да, я знаю, что так говорят, но это не совсем точно.
На самом деле происходит следующее.
rates_total == общее количество баров, когда наступил текущий тик. prev_calculated == общее количество баров, когда наступил предыдущий тик.
Таким образом, у вас есть 3 основных состояния prev-calculated vs rates_total. Индикатор загружен, тики середины бара, первый тик нового бара.
prev_calculated == 0 при первом запуске, потому что не было предыдущего тика с момента загрузки индикатора.
Также при изменении графика или добавлении истории prev_calculated обнуляется.
Возвращаемое значение из OnCalculate не используется, но лучше использовать возвращаемое по умолчанию значение return(rates_total) на случай, если это когда-нибудь исправят.
Я знаю, что говорится в новых документах. Если делать по-ихнему, то нужно проверить prev_calculated на ненулевое значение и скорректировать rates_total - prev_calculated вниз на единицу. Это возврат к путанице с декрементом индикатора_рассчитанного.
Нет смысла делать return( rates_total - 1 ), значение prev_calculated будет таким, как если бы это был return(rates_total), независимо от того, что вы сказали ему вернуть.