Циклы внутри свечи
Вычислите среднее своим циклом и сравните с готовой функцией.
Последовательность свечей проходит среда исполнения. Внутри одной свечи повторение может понадобиться вам: например, сложить пять последних закрытий. Для этого есть цикл.
for и range
for offset in range(5):
total += close[offset]При range(5) переменная offset по очереди получает 0, 1, 2, 3, 4. Значение 5 не включено. Строка с отступом выполняется раз для каждого.
close[offset] сначала означает текущее закрытие, затем закрытия одной, двух, трёх и четырёх свечей назад. Складываются ровно пять значений.
Перед циклом нужно обнулить total. Это промежуточный итог одной свечи, не счётчик между свечами.
range(1, 5) даёт 1, 2, 3, 4. Начало включено, конец нет. Без начального значения отсчёт идёт с нуля.
Среднее, написанное вручную
Создайте manual_average.py:
"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, ta
@script.indicator("Manual Average Check", overlay=False)
def main(
length: int = input.int(5, title="Length", minval=1, maxval=100),
):
total = 0.0
for offset in range(length):
total += close[offset]
manual_average = total / length
builtin_average = ta.sma(close, length)
difference = manual_average - builtin_average
plot(difference, "Difference", color=color.blue)Запустите на демонстрационных данных. Линия показывает разность вашего среднего и SMA. После прогрева она должна быть нулевой или близкой к нулю из-за представления чисел.

На двух перекрывающихся линиях малые отличия трудно заметить. Разность напрямую показывает совпадение расчётов.
Что делает одно выполнение?
Для длины пять порядок таков:
totalстановится нулём.- Цикл добавляет текущее и четыре прошлых закрытия.
- Сумма делится на пять.
- Вычисляется готовая SMA и разность результатов.
- Рисуется одна точка линии разности.
Потом среда переходит к следующей свече. total снова начинается с нуля, цикл складывает пять значений уже для новой свечи.
Если сделать total переменной Persistent, следующая свеча продолжит прошлую сумму. Каждая прибавит ещё пять значений к прежним, и это уже не среднее текущего окна.
Отсутствующая история
На первых четырёх свечах для пятиэлементного окна не хватает хотя бы одного закрытия. na в сумме делает отсутствующим и собственное среднее. Готовая SMA длиной пять тоже появляется лишь на пятой свече.
Все закрытия учебных данных допустимы. Если пропуски есть и в середине источника, обработка отсутствий в ta.sma может отличаться от простой суммы по смещениям свечей. Поэтому пример проверяется на указанных данных.
Сколько повторений вы запрашиваете?
При окне сто на каждой свече выполняется сто сложений. Для двух тысяч свечей это двести тысяч шагов.
Готовая ta.sma решает эту частую задачу специальным расчётом среды. Свой цикл здесь нужен для понимания и сравнения. Используйте готовую функцию, если она решает задачу.
Конец цикла должен быть известен и ограничен. Максимум input задаёт и предел работы внутри одной свечи.
break и continue
break завершает цикл. continue пропускает остаток текущего шага и переходит к следующему.
В среднем окне используйте их осторожно. Сложив три значения и остановившись, нельзя делить сумму на пять, будто значений пять. Пропуски меняют смысл расчёта.
Попробуйте самостоятельно
Установите длину три. Запишите смещения и соответствующие цены на одной свече. Затем дополните расчёт разности отображением своего и готового средних поверх графика.
Решение
Смещения 0, 1, 2. В декораторе нужно overlay=True, после расчёта:
plot(manual_average, "Manual average", color=color.blue, linewidth=2)
plot(builtin_average, "Built-in average", color=color.orange)Уберите рисование разности из этого вида. Околонулевую линию и средние на уровне цены трудно читать на одной шкале. Исходную панель разности можно сохранить в отдельном варианте для проверки.
Найдите сдвинутое окно
Что изменится при range(1, length + 1)? Элементов всё ещё пять, но текущая свеча исключена, добавлена свеча пятью шагами ранее. Это окно предыдущей свечи, не текущей.