Отладка в PyneIDE
Остановите программу на точке останова и проверяйте переменные по свечам.
Правильный по форме код может считать не то, что нужно. Отладчик позволяет остановиться, увидеть переменные и следить за инструкциями по одной.
Здесь вы исследуете расстояние от закрытия до среднего пяти свечей: сначала предскажете, затем проверите расчёт.
Три вида ошибок
Синтаксическая ошибка нарушает правила записи, например пропущено двоеточие или неверен отступ. Редактор часто сообщает о ней уже при вводе.
Ошибка исполнения возникает при работе программы: например, чтение несуществующего индекса массива. Выполнение может остановиться с сообщением.
При логической ошибке программа может завершиться. average - close вместо close - average меняет знак. Язык этого не запрещает, поэтому результат сравниваете с задачей вы.
В View → Problems Visual Studio Code собраны замечания редактора. Нажмите строку для перехода к месту. Прочитайте подробности до изменения нескольких строк.
Программа для исследования
Создайте debug_average.py:
"""
@pyne edge
"""
from pynecore import Series
from pynecore.lib import bar_index, close, color, log, plot, script, ta
@script.indicator("Average Distance", overlay=False)
def main():
average: Series[float] = ta.sma(close, 5)
gap = close - average
if bar_index == 10:
log.info("close={0}, average={1}, gap={2}", close, average, gap)
plot(gap, "Distance", color=color.blue)bar_index является номером текущей свечи с нуля. Индекс 10 означает одиннадцатую, поэтому запись в журнал происходит один раз за исторический запуск.
log.info формирует сообщение. {0}, {1}, {2} заменяются тремя следующими значениями по порядку. Журнал обрабатывает текст с нумерованными местами.
Запустите один раз через Run Pyne code. Линия должна быть положительной при закрытии выше среднего. На первых четырёх свечах среднее и расстояние отсутствуют.
Остановка перед строкой
- Нажмите слева от номера строки
plot(gap, ...). Появится точка останова. - Нажмите Debug над кодом.
- Если появится выбор данных, укажите
demo. - Программа остановится. Откройте Run and Debug.
Точка останова задаёт место паузы. Выделенная строка ещё не выполнена. Результаты предыдущих присваиваний уже доступны.
Первая пауза может быть на первой свече. gap там отсутствует, поскольку полного окна из пяти нет. Отладчик показывает эту ситуацию; отсутствие само по себе не ошибка.
Дойдите до прогретой свечи
На плавающей панели Next Bar в PyneIDE переходит к следующей свече. Наведите указатель на значки, чтобы прочитать имена. Найдите Run to Bar…, нажмите, введите 10 и Enter.
На одиннадцатой свече окно из пяти полное. Найдите average и gap в Variables. В группе Pyne проверьте свечные данные, в том числе bar_index и close.

average является Series, поэтому код может использовать прошлое значение через average[1]. Прошлое среднее не обязательно равно текущему: окно сдвинулось.
Наблюдаемые выражения
В Watch добавляются выражения для просмотра при каждой паузе. Попробуйте:
close
close[1]
average
close - averageclose[1] относится к свече перед остановленной. average является вашей переменной. close - average должно совпасть с уже вычисленным gap.
Наблюдайте переменные и простую арифметику. Не помещайте в Watch ta.sma, отправку приказов или изменение массивов. Проверка не должна менять состояние программы.
По строкам и по свечам
Step Over переходит к следующей инструкции без входа в вызываемую функцию. Step Into может войти в вашу функцию. Continue продолжает до следующей паузы, Disconnect завершает связь и отладку.
Next Bar работает в другом масштабе, переходя к следующей свече. Строковые шаги подробно показывают одну свечу, свечные изменение результата во времени.
Обработка остановленной свечи не завершена, поэтому график может показывать прежнее готовое состояние. Индекс и данные текущей проверяйте в Pyne.
Перед чтением переменной посмотрите выделенную строку. Если присваивание впереди, ожидаемого результата в ней ещё нет.
Поиск ошибки знака
Остановите отладчик и измените строку:
gap = average - closeНачните отладку снова на той же свече. При цене выше среднего gap отрицателен, хотя нужна положительная дистанция.
В Watch close - average всё ещё показывает желаемое направление. Сравнение сразу выявляет отличие. Верните правильное вычитание и проверьте ту же свечу.
Попробуйте самостоятельно
Добавьте previous_close = close[1] и изучите в отладчике. Закрытие какого индекса должно быть на свече 10? Что будет на первой?
Решение
previous_close = close[1]На свече 10 это закрытие свечи 9. На первой, индекс 0, значения нет: в файле нет прошлой свечи.
Поместите строку до точки останова, чтобы она успела выполниться. После исследования вспомогательную переменную и проверочную запись в журнал можно удалить.
Полезное описание ошибки
Прося помощи, укажите файл, данные, фактические inputs и время свечи. Запишите ожидаемое и полученное. Вместо «линия неправильная», например: «здесь закрытие 101, среднее 100, но расстояние −1». Это позволяет проверить расчёт.