PyneIDEでデバッグする
ブレークポイントで停止し、ローソク足ごとの変数を調べます。
コードの書き方が正しくても、意図と違う結果を計算することがあります。デバッガーを使うと、実行を止め、変数を見て、文を1つずつ追えます。
この章では、終値と長さ5の移動平均との距離を調べます。先に結果を予想してから、実際の計算を確認します。
3種類のエラー
構文エラーは、記述ルールに違反するものです。コロンの欠落やインデントの誤りなどで、入力中にエディターが知らせることもよくあります。
実行時エラーは、プログラムを動かして初めて起こるものです。例えば、存在しないインデックスの配列要素を読み出す場合です。エラーメッセージとともに停止することがあります。
論理エラーがあっても、実行できる場合があります。close - averageのつもりでaverage - closeと書けば、符号が逆になります。言語のルールには違反しないので、課題と結果を自分で比較します。
Visual Studio CodeのView → Problemsで、エディターが検出した問題を確認できます。項目をクリックすると該当箇所へ移動します。何行も書き換える前に、詳細なメッセージを読んでください。
調べるプログラム
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は処理中のローソク足の番号で、0から始まります。インデックス10は11本目です。この過去データでの実行では、ログは一度だけ出ます。
log.infoは、書式に従ったメッセージを作ります。{0}、{1}、{2}には、その後の3つの値が順に入ります。この番号付きの文字列を処理するのはログ機能です。
一度Run Pyne codeで実行してください。終値が平均より上なら、線は正になるはずです。最初の4本は、平均も距離も欠損します。
行の手前で止める
plot(gap, ...)の行番号の左をクリックします。ブレークポイントの印が現れます。- コードの上のDebugをクリックします。
- データ選択が出たら
demoを選びます。 - ブレークポイントで止まったら、Run and Debugビューを開きます。
ブレークポイントは、デバッガーが実行を止める場所です。選択された行は、まだ実行していません。それより前の代入結果は確認できます。
最初は1本目で止まる場合があります。長さ5のウィンドウがないので、gapは欠損です。デバッガーがその状態を示しているのであり、欠損自体がバグではありません。
ウォームアップ後の足まで進める
デバッグ中のフローティングツールバーにあるPyneIDEのNext Barで、次の足へ進めます。アイコンにポインターを置くと名前が出ます。Run to Bar…をクリックし、入力欄に10を入れてEnterを押してください。
11本目なら、5つの値がそろっています。Variablesでaverageとgapを探します。Pyneグループには、bar_indexやcloseなど、処理中の足のデータがあります。

averageはSeriesなので、コードでaverage[1]を使えば前の値を参照できます。ウィンドウが1本進むため、前の平均と今の平均が同じとは限りません。
式を監視する
Watchには、停止するたびに見たい式を追加できます。次を試してください。
close
close[1]
average
close - averageclose[1]は、停止中の足の1本前の終値です。averageは自分の変数です。close - averageは、計算済みのgapと一致するはずです。
変数と簡単な計算を監視してください。Watchにta.sma、注文を出す操作、配列を変更する呼び出しを入れないでください。調査のための操作で、プログラムの状態を変えないようにします。
行単位とローソク足単位
Step Overは、呼び出した関数の内部へ入らず、次の文へ進みます。Step Intoは、自分の関数の中へ入れます。Continueは次の停止まで続け、Disconnectは接続を切ってデバッグを終了します。
Next Barは、次のローソク足へ進む別の単位です。行単位の操作では1本の計算を詳しく見て、足単位では時間による結果の変化を確認します。
停止中の足の処理はまだ完了していないため、チャートはその前までの状態を示す場合があります。現在のインデックスとデータはPyneグループで確認してください。
値を読む前に、選択された行を見ます。代入がまだ実行されていなければ、その変数には期待する新しい結果は入っていません。
符号の誤りを見つける
デバッガーを止め、次のように書き換えます。
gap = average - close再びデバッグを開始し、同じ足へ進みます。価格が平均より上でもgapは負になります。求めたいのは正の距離でした。
Watchのclose - averageは、引き続き本来の方向を示します。2つを比べれば、すぐに違いが分かります。正しい引き算に戻し、同じ足でもう一度確認してください。
自分で試す
previous_close = close[1]を加え、デバッガーで調べてください。インデックス10では、どのインデックスの終値でしょうか。最初の足では何になるでしょうか。
解答
previous_close = close[1]インデックス10では9の終値です。最初の0では、ファイルに前の足がないので欠損します。
停止時に実行済みになるよう、ブレークポイントより前に書きます。確認後、補助変数や調査だけのログ行は削除できます。
伝わる不具合報告
助けを求めるときは、ファイル、使用データ、実際の入力値、調べた足の時刻を伝えてください。期待値と実際の値も書きます。「線がおかしい」より、「この足では終値101、平均100なのに、距離が−1になった」の方が、計算を確認できます。