Переменные и собственные вычисления
Вычислите диапазон и середину свечи и отобразите результат.
Если максимум свечи 108, а минимум 101, разность равна 7. Мы будем вычислять и рисовать этот ценовой диапазон для каждой свечи.
Вторая программа вычисляет середину между ценами. Оба примера используют переменные и простую арифметику.
Что означает свеча?
Свеча обобщает данные периода. Его длительность задаёт таймфрейм. Например, в часовых данных одна свеча относится к одному часу.
Вы встретите пять основных значений:
open: цена открытия периода;high: наибольшая цена;low: наименьшая цена;close: цена закрытия;volume: объём за период в единицах источника данных.
Английские начальные буквы образуют OHLCV. Первые примеры используют учебные данные уже закрытых свечей.
close всегда означает закрытие обрабатываемой сейчас свечи. На следующей свече используется уже её закрытие. То же верно для остальных основных данных.
Немного истории: откуда появились японские свечи?
Корни свечного отображения восходят к японским рисовым рынкам XVIII века. Из возникших там методов анализа цен в XIX веке развились свечные графики. Стив Нисон познакомил с ними широкую западную аудиторию книгой Japanese Candlestick Charting Techniques, вышедшей в 1991 году.
Толстое «тело» свечи показывает участок между открытием и закрытием, а тонкие «тени» отмечают максимум и минимум периода.
История и иллюстрации: AAII Journal (на английском).
Вычислите диапазон
При максимуме 108 и минимуме 101 цена прошла диапазон 7 единиц:
108 − 101 = 7
В коде это записывается так:
candle_range = high - lowhigh - low является выражением: программа вычисляет его результат. - означает вычитание.
candle_range является именем переменной. = присваивает ей результат выражения справа. Операция называется присваиванием.
Читайте строку так: «Вычисли разность high и low и назови результат candle_range». Дальше значение доступно под этим именем.
Выберите понятное имя
candle_range говорит, что значение является диапазоном свечи. Имя вроде x меньше помогает читать код.
В книге используются английские имена в нижнем регистре с подчёркиваниями между словами. Имя не должно начинаться с цифры или содержать пробелы. candle_range и Candle_range различаются.
Почему английские имена без диакритических знаков?
Ключевые слова и имена библиотеки Pyne тоже основаны на английском: например, def, close, plot. Английские имена переменных согласуются с ними и помогают читателям из разных стран понимать код. Это полезно при передаче программы другим или совместной работе.
Pyne code допускает в именах буквы с диакритикой и буквы других алфавитов. Английские имена без диакритики являются рекомендацией. Их проще вводить на клавиатурах других языков и использовать при международном обмене кодом. В книге мы придерживаемся этого подхода.
Создайте индикатор в отдельной панели
Создайте 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 имеют разный масштаб.
Сохраните и запустите на прежних демонстрационных данных.

Как читать результат?
Высокие точки означают большую разность цен, низкие меньшую. В расчёт входит полный максимум и минимум свечи, включая тени.
Растущая и падающая свечи могут иметь одинаковый диапазон, поэтому направление движения по нему не определить. high не меньше low, и при правильных данных результат неотрицателен.
Что делает переменная на следующей свече?
На каждой свече программа повторяет два шага:
- Вычисляет
candle_rangeиз еёhighиlow. 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: середину нужно видеть на ценовой шкале свечей.

После запуска выберите свечу и посмотрите точку линии в её позиции. Она находится посередине полного диапазона вместе с тенями. Середина тела может отличаться, поскольку её задают открытие и закрытие.
Почему важны скобки?
Эти выражения задают разные расчёты:
(high + low) / 2
high + low / 2Вторая строка сначала делит только low на два и прибавляет high. При 108 и 101 получится 158,5. Это уже не середина цен.
Оба выражения синтаксически верны, но результаты разные. Пример, который легко посчитать вручную, позволяет быстро проверить замысел.
Попробуйте самостоятельно
Отобразите изменение тела со знаком: вычтите открытие из закрытия.
- Назовите файл
candle_change.py. - Название индикатора
"Candle Change", панель отдельная. - Имя результата
candle_change. - Имя рисунка
"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.
Далее сравним две свечи и научимся получать данные предыдущей.