Читайте и изменяйте код
Разберитесь в строках первой программы и добавьте цену открытия к цене закрытия.
Теперь добавим к цене закрытия цену открытия. Для этого расширим предыдущую программу: получим ещё одно значение из библиотеки и добавим вызов рисования.
Перед изменением разберём строки программы, чтобы понять назначение каждой.
Код задаёт точное описание
В программе вы даёте компьютеру инструкции. Например: «Возьми цену закрытия свечи и покажи её синей линией». Для этого компьютер ожидает точные имена и знаки.
В Pyne code мы записываем инструкции синтаксисом Python. К нему относятся скобки вызовов, двоеточия и отступы. Их роль объясняют следующие разделы.
Откройте first_chart.py, созданный во второй главе. Изменённое имя индикатора не мешает дальнейшему разбору.
Метка Pyne в начале файла
Первые три строки:
"""
@pyne edge
"""Тройные кавычки обозначают начало и конец текстового блока. В начале файла этот блок может содержать описание программы. Python называет его docstring.
PyneCore читает из него @pyne. Метка сообщает, что файл содержит Pyne code и нужны правила, отличные от обычного Python. Перед исполнением PyneCore преобразует код, чтобы, например, обращаться к предыдущим свечам и сохранять значение переменной для следующей. Эти возможности разбираются в отдельных главах.
@pyne допустима и сама по себе. Файл может начинаться так:
"""
@pyne
"""Что означает edge рядом с меткой?
edge означает использование определённого ограниченного набора возможностей Pyne code. @pyne включает посвечное поведение, а edge задаёт разрешённые конструкции и функции. PyneIDE сообщает о выходе за эти рамки.
В программах @pyne можно использовать и другие возможности и библиотеки Python. Программы @pyne edge используют разрешённые средства Pyne и не импортируют произвольные библиотеки Python. Поэтому их могут обрабатывать среды без универсального Python.
Во всех полных программах книги мы сохраняем @pyne edge и остаёмся в этом наборе возможностей.
Подробнее: где должна быть метка? Начальный текстовый блок должен быть первой инструкцией файла, а @pyne первым содержимым блока. Описание пишется после метки. Если поместить описание перед @pyne, PyneCore её не распознает. Метка сама не запускает программу: PyneCore должен загрузить и выполнить её. В примерах этим занимается PyneIDE.
Например, описание можно добавить так:
"""
@pyne edge
Open and Close
Shows each candle's opening and closing prices as two lines.
"""@pyne edge остаётся первой содержательной строкой блока. Название и описание ниже предназначены читателю и не добавляют действий программе. После закрывающих тройных кавычек идут импорты и остальной код.
Выберите инструменты
Следующая строка:
from pynecore.lib import close, color, plot, scriptКонструкция from … import … делает перечисленные имена доступными программе. Здесь мы получаем четыре инструмента из pynecore.lib:
close: цена закрытия текущей свечи;color: доступные цвета;plot: отображение значения на графике;script: тип и основные настройки программы.
Имена разделяются запятыми. Регистр важен: close и Close различаются.
Пустые строки помогают организовать код: увидеть конец списка инструментов и начало программы.
Имя и отображение программы
@script.indicator("My First Chart", overlay=True)Строка говорит, что мы создаём индикатор. Он вычисляет и отображает что-то из данных. Здесь рисуется цена закрытия.
В скобках задаются настройки:
- Текст
"My First Chart"в кавычках задаёт имя индикатора. overlay=Trueпросит разместить рисунок на одном графике со свечами.
True означает истину, противоположное значение False. Если установить overlay в False, индикатор появится в отдельной панели. Мы используем это в главе о собственных расчётах.
Где выполняется расчёт
def main():
plot(close, "Close", color=color.blue, linewidth=2)def начинает функцию, именованную последовательность действий. Здесь её имя main.
PyneCore выполняет тело main() на свечах данных. Это точка входа программы. После скобок стоит двоеточие, а строка с отступом ниже относится к телу функции.
Отступы показывают связанные строки. На один уровень мы используем четыре пробела. Нажмите Tab в начале строки: при стандартных настройках PyneIDE это добавит четыре пробела за один шаг. Shift + Tab убирает один уровень. Обычно Visual Studio Code сам добавляет отступ после Enter в строке, заканчивающейся двоеточием.
Что мы просим у plot?
plot(...) является вызовом функции. В скобках передаются значения и настройки:
close: показать это значение;"Close": так назвать рисунок;color=color.blue: использовать синий цвет;linewidth=2: установить толщину линии 2.
Для первых двух значений роль определяется порядком. color= и linewidth= указывают настройки по имени. Они называются параметрами.
Точка в color.blue означает доступ к цвету blue, принадлежащему color. Это часть обращения к имени; не заменяйте точку запятой.
Нарисуйте две линии
Для закрытия мы использовали close. Открытие доступно через open.
Скопируйте файл в scripts под именем two_lines.py, чтобы сохранить пример второй главы. В копии:
- Добавьте
openк импортируемым инструментам. - Переименуйте индикатор в
"Open and Close". - Добавьте второй вызов
plotв телоmain().
Полная программа:
"""
@pyne edge
"""
from pynecore.lib import close, color, open, plot, script
@script.indicator("Open and Close", overlay=True)
def main():
plot(close, "Close", color=color.blue, linewidth=2)
plot(open, "Open", color=color.orange, linewidth=2)Предскажите перед запуском, где линии встретятся со свечами. Сохраните файл и нажмите Run Pyne code. Используйте прежние учебные данные.

На что обратить внимание?
Синяя линия соединяет закрытия, оранжевая открытия. У рисунков есть имена Close и Open. Они помогают распознавать линии даже после изменения цветов.
Оба вызова plot имеют одинаковый отступ в четыре пробела, потому что относятся к одной main().
Если под open появилась ошибка, проверьте импорт. Прежде чем использовать новый инструмент, нужно сделать доступным его имя.
Комментарии в коде
Строка с одним # в начале является комментарием:
# Show the opening price of each candle.
plot(open, "Open", color=color.orange, linewidth=2)Комментарий не выполняет действий. Он позволяет объяснить цель шага себе или будущему читателю кода. Комментарии примеров написаны по-английски, а объяснения книги по-русски.
Комментарий можно поместить и в конец инструкции:
plot(open, "Open", color=color.orange, linewidth=2) # Show the opening price.Вызов plot(...) выполнится. Текст от следующего # до конца строки является комментарием и игнорируется. Между кодом и # оставляем два пробела для читаемости.
Попробуйте самостоятельно
Создайте третью линию для максимума свечей. Он доступен как high. Назовите рисунок "High" и используйте color.green.
Подумайте, какие два места программы нужно дополнить. Может ли High оказаться ниже открытия или закрытия своей свечи? Предскажите до запуска.
Решение
high нужно добавить в импорт:
from pynecore.lib import close, color, high, open, plot, scriptВ тело main() добавьте строку с тем же отступом:
plot(high, "High", color=color.green, linewidth=2)Максимум свечи не ниже её открытия и закрытия. Поэтому точка High на этой свече не может быть ниже них. Соединяющие точки отрезки всегда оценивайте в позиции соответствующей свечи.
Проверьте свои изменения
Просмотрите программу с тремя линиями. Найдите импорты данных, имя индикатора и вызовы рисования. Проверьте, что каждое новое имя данных включено в импорт, а три вызова имеют одинаковый отступ.
Прежде чем вычислять собственные значения по ценам, посмотрим, как PyneIDE помогает использовать функции.