コードを読んで変更する
最初のプログラムの各行を理解し、終値に加えて始値を描画します。
今度は終値に加えて始値も描画します。前の章のプログラムを拡張して、ライブラリから新しいデータを読み込み、描画する呼び出しをもう1つ加えます。
変更する前に、各行の役割を確認します。
コードは正確な指示
プログラムでは、コンピューターに指示を出します。例えば「ローソク足の終値を使い、青い線で表示する」という指示です。コンピューターに伝えるには、正確な名前や記号が必要です。
Pyne codeでは、Pythonの構文でこれを記述します。関数呼び出しの括弧、コロン、行のインデントも構文の一部です。ここから、それぞれの役割を学びます。
第2章で作ったfirst_chart.pyを開いてください。指標の名前を変更していても、以下の説明には影響しません。
ファイル冒頭のPyneの印
ファイルの最初の3行です。
"""
@pyne edge
"""3つ並んだ引用符は、テキストブロックの始まりと終わりを表します。ファイル冒頭のこのブロックには、プログラムの説明も書けます。Pythonではdocstringと呼びます。
PyneCoreは、このブロックから@pyneという印を読み取ります。これにより、ファイルがPyne codeを含み、通常のPythonとは異なるルールを適用すべきだと分かります。PyneCoreは実行前にコードを変換し、過去のローソク足の値を参照したり、変数の値を次のローソク足まで保持したりできるようにします。これらは別の章で扱います。
@pyneだけでも有効です。Pyne codeファイルは、次のように始めることもできます。
"""
@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です。その下のタイトルと説明は読む人のためのもので、処理は追加しません。閉じる3つの引用符の後に、インポートやプログラムの残りの部分が続きます。
使う機能を選ぶ
次の行です。
from pynecore.lib import close, color, plot, scriptfrom … import …は、列挙した名前をプログラム内で使えるようにします。ここでは、pynecore.libから4つの機能を読み込んでいます。
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()の本体を実行します。この関数がプログラムの入口です。括弧の後にコロンがあり、その下の字下げされた行が関数の本体に属します。
どの行が同じまとまりに属するかを示すのがインデントです。1段に4個のスペースを使います。行頭でTabを押すと、PyneIDEの既定設定では、4個のスペース分を一度に字下げできます。Shift + Tabで1段戻せます。コロンで終わる行の後でEnterを押した場合、Visual Studio Codeは通常、新しい行を自動で字下げします。
plotに何を指定するか
plot(...)は関数呼び出しです。括弧内に、動作に必要な値や設定を渡します。
close:表示する値。"Close":描画の名前。color=color.blue:青色の指定。linewidth=2:線の太さを2にする指定。
最初の2つの値は、並ぶ順序で役割が決まります。color=とlinewidth=は、設定名を指定して渡しています。こうした設定の名前をパラメーターと呼びます。
color.blueのピリオドは、colorに属するblueという色を使うことを表します。ピリオドはコード内で名前を参照するための記号です。コンマに変えないでください。
2本の線を描く
終値にはcloseを使いました。始値はopenで参照できます。
scriptsフォルダーに、two_lines.pyという名前でファイルのコピーを作ります。第2章の例題も残せます。コピーで次の変更を行います。
- インポートする機能に
openを加えます。 - 指標を
"Open and Close"に改名します。 main()の本体に、2つ目のplot呼び出しを加えます。
プログラム全体は次のようになります。
"""
@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)実行前に、2本の線がローソク足のどの位置を通るか予想してください。保存してRun Pyne codeをクリックします。前と同じサンプルデータを使ってください。

確認すること
青い線は終値を、オレンジの線は始値をつなぎます。チャート上の描画には、CloseとOpenという名前もあります。後で色を変えても、この名前で見分けられます。
2つのplot呼び出しは、同じmain()に属しているので、どちらも4個のスペースで字下げします。
openの下にエラー表示が出たら、インポートの行に追加したか確認します。新しい機能を使うには、その名前も使えるようにしておく必要があります。
コード内のコメント
1つの#で始まる行はコメントです。
# 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(...)は実行されます。その後の#から行末まではコメントなので、実行時には無視されます。読みやすくするため、コードと#の間には2個のスペースを入れます。
自分で試す
ローソク足の高値を表示する、3本目の線を作ってください。データ名はhighです。描画の名前は"High"、色はcolor.greenにします。
プログラムのどの2か所に追加が必要か考えてください。実行前に予想しましょう。Highの値が、同じローソク足の始値や終値より下になることはあるでしょうか。
解答
インポートの行にもhighを追加します。
from pynecore.lib import close, color, high, open, plot, scriptmain()の本体に、他の2つの呼び出しと同じインデントで次の行を加えます。
plot(high, "High", color=color.green, linewidth=2)ローソク足の高値は、始値と終値のどちら以上でもあります。そのため、同じローソク足の位置でHighの点がそれらより下になることはありません。点と点をつなぐ線分は、必ず対応するローソク足の位置で読み取ってください。
変更を確認する
3本の線を描くプログラムを読み直してください。インポートしたデータ、指標の名前、描画する呼び出しが見つかるでしょうか。新しく使うデータ名がすべてインポートされ、3つの呼び出しが同じ深さに字下げされているか確認します。
価格を使って自分で計算する前に、関数を使う際のPyneIDEのヘルプ機能を確認します。