Если максимум свечи 108, а минимум 101, разность равна 7. Мы будем вычислять и рисовать этот ценовой диапазон для каждой свечи.

Вторая программа вычисляет середину между ценами. Оба примера используют переменные и простую арифметику.

Что означает свеча?

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

Вы встретите пять основных значений:

  • open: цена открытия периода;
  • high: наибольшая цена;
  • low: наименьшая цена;
  • close: цена закрытия;
  • volume: объём за период в единицах источника данных.

Английские начальные буквы образуют OHLCV. Первые примеры используют учебные данные уже закрытых свечей.

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

Вычислите диапазон

При максимуме 108 и минимуме 101 цена прошла диапазон 7 единиц:

108 − 101 = 7

В коде это записывается так:

candle_range = high - low

high - low является выражением: программа вычисляет его результат. - означает вычитание.

candle_range является именем переменной. = присваивает ей результат выражения справа. Операция называется присваиванием.

Читайте строку так: «Вычисли разность high и low и назови результат candle_range». Дальше значение доступно под этим именем.

Выберите понятное имя

candle_range говорит, что значение является диапазоном свечи. Имя вроде x меньше помогает читать код.

В книге используются английские имена в нижнем регистре с подчёркиваниями между словами. Имя не должно начинаться с цифры или содержать пробелы. candle_range и Candle_range различаются.

Создайте индикатор в отдельной панели

Создайте candle_range.py в scripts:

"""
@pyne edge
"""
from pynecore.lib import color, high, low, plot, script


@script.indicator("Candle Range", overlay=False)
def main():
    candle_range = high - low
    plot(candle_range, "Range", color=color.orange, linewidth=2)

Первая строка main() вычисляет значение, вторая передаёт candle_range в plot. Присваивание должно предшествовать использованию.

overlay=False запрашивает отдельную панель. Диапазон получает собственную шкалу: например, диапазон 7 и цена около 100 имеют разный масштаб.

Сохраните и запустите на прежних демонстрационных данных.

Рядом с candle_range.py под свечами видна отдельная панель Range.
Линия Range показывает high минус low в отдельной панели. Большее значение означает больший диапазон внутри свечи.

Как читать результат?

Высокие точки означают большую разность цен, низкие меньшую. В расчёт входит полный максимум и минимум свечи, включая тени.

Растущая и падающая свечи могут иметь одинаковый диапазон, поэтому направление движения по нему не определить. high не меньше low, и при правильных данных результат неотрицателен.

Что делает переменная на следующей свече?

На каждой свече программа повторяет два шага:

  1. Вычисляет candle_range из её high и low.
  2. plot показывает значение в позиции этой свечи.

Например:

  • Первая свеча: high = 108, low = 101, поэтому candle_range = 7.
  • Вторая: high = 110, low = 106, поэтому candle_range = 4.
  • Третья: high = 109, low = 103, поэтому candle_range = 6.

На графике получатся точки 7, 4 и 6. Каждая свеча присваивает переменной результат текущего расчёта.

Обращение к предыдущим значениям и сохраняемое состояние мы изучим позднее.

Сложение, умножение и деление

Для простых расчётов служат знаки:

  • +: сложение;
  • -: вычитание;
  • *: умножение;
  • /: деление.

Умножение и деление выполняются раньше сложения и вычитания. Скобки задают, что вычислить первым.

Середина диапазона:

midpoint = (high + low) / 2

Сначала складываем цены, затем делим на два. При high = 108 и low = 101 середина равна 104,5.

Обратите внимание на десятичную точку: в коде пишется 104.5, хотя в русском тексте 104,5. У запятой в коде другие роли, например разделение параметров.

Нарисуйте середину

Создайте candle_midpoint.py:

"""
@pyne edge
"""
from pynecore.lib import color, high, low, plot, script


@script.indicator("Candle Midpoint", overlay=True)
def main():
    midpoint = (high + low) / 2
    plot(midpoint, "Midpoint", color=color.purple, linewidth=2)

Снова используется overlay=True: середину нужно видеть на ценовой шкале свечей.

Рядом с candle_midpoint.py показана линия Midpoint, соединяющая середины свечей.
Midpoint отмечает середину между high и low каждой свечи.

После запуска выберите свечу и посмотрите точку линии в её позиции. Она находится посередине полного диапазона вместе с тенями. Середина тела может отличаться, поскольку её задают открытие и закрытие.

Почему важны скобки?

Эти выражения задают разные расчёты:

(high + low) / 2
high + low / 2

Вторая строка сначала делит только low на два и прибавляет high. При 108 и 101 получится 158,5. Это уже не середина цен.

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

Попробуйте самостоятельно

Отобразите изменение тела со знаком: вычтите открытие из закрытия.

  1. Назовите файл candle_change.py.
  2. Название индикатора "Candle Change", панель отдельная.
  3. Имя результата candle_change.
  4. Имя рисунка "Change".

Перед запуском посчитайте:

  • open = 100, close = 104;
  • open = 100, close = 97;
  • open = 100, close = 100.
Решение

Результаты: 4, −3 и 0. Положительное значение означает более высокое закрытие, отрицательное более низкое, ноль равенство открытия и закрытия.

"""
@pyne edge
"""
from pynecore.lib import close, color, open, plot, script


@script.indicator("Candle Change", overlay=False)
def main():
    candle_change = close - open
    plot(candle_change, "Change", color=color.blue, linewidth=2)

Сравните три программы

По очереди откройте программы диапазона, середины и изменения. Все вычисляют переменную из OHLC и рисуют её следующей строкой. Данные обрабатываются по свечам. Различаются расчёт и overlay.

Далее сравним две свечи и научимся получать данные предыдущей.