Теперь добавим к цене закрытия цену открытия. Для этого расширим предыдущую программу: получим ещё одно значение из библиотеки и добавим вызов рисования.

Перед изменением разберём строки программы, чтобы понять назначение каждой.

Код задаёт точное описание

В программе вы даёте компьютеру инструкции. Например: «Возьми цену закрытия свечи и покажи её синей линией». Для этого компьютер ожидает точные имена и знаки.

В 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 и остаёмся в этом наборе возможностей.

Выберите инструменты

Следующая строка:

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, чтобы сохранить пример второй главы. В копии:

  1. Добавьте open к импортируемым инструментам.
  2. Переименуйте индикатор в "Open and Close".
  3. Добавьте второй вызов 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. Используйте прежние учебные данные.

Рядом с two_lines.py на графике DEMO видны отдельные линии Close и Open.
Два вызова plot дают две линии: Close показывает закрытие, Open показывает открытие на том же графике.

На что обратить внимание?

Синяя линия соединяет закрытия, оранжевая открытия. У рисунков есть имена 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 помогает использовать функции.