A záróár mellé most a nyitóárat is kirajzoljuk. Ehhez az előző fejezet programját bővítjük: egy új adatot kérünk a könyvtárból, és még egy rajzoló hívást írunk a kódba.

A módosítás előtt végignézzük a program sorait, hogy értsd, melyik mire való.

A kód egy pontos leírás

A programban utasításokat adsz a számítógépnek. Például: „Használd a gyertya záróárát, és jelenítsd meg kék vonallal.” A számítógép ehhez pontos neveket és írásjeleket vár.

A Pyne code-ban ezeket a Python szintaxisával írjuk le. A függvényhívások zárójelei, a kettőspontok és a sorok behúzása mind ehhez tartoznak. A következő részekben megismered a szerepüket.

Nyisd meg a második fejezetben készített first_chart.py fájlt. Ha átnevezted benne az indikátort, az nem befolyásolja a következő magyarázatot.

A fájl elején lévő Pyne-jelölés

A fájl első három sora:

"""
@pyne edge
"""

A három idézőjel egy szövegblokk elejét és végét jelöli. A fájl elején ez a blokk a program leírásának is helyet adhat. A Python ezt docstringnek nevezi.

Az @pyne jelölést a PyneCore olvassa ki belőle. Ez mondja meg neki, hogy a fájl Pyne code-ot tartalmaz, és a szokásos Python-működéshez képest más szabályokat kell alkalmaznia. A PyneCore futtatás előtt átalakítja a kódot, hogy például hozzáférhessünk az előző gyertyák értékeihez, és egy változó megőrizhesse az értékét a következő gyertyára. Ezekkel külön fejezetekben foglalkozunk.

Az @pyne önmagában is érvényes jelölés. Így is kezdődhet egy Pyne code fájl:

"""
@pyne
"""

Mit jelent mellette az edge?

Az edge azt jelöli, hogy a program a Pyne code meghatározott, korlátozott nyelvi részét használja. A gyertyánkénti működést az @pyne kapcsolja be; az edge azt szabja meg, milyen nyelvi elemeket és függvényeket használhatunk hozzá. A PyneIDE jelzi, ha kilépünk ezekből a keretekből.

Az @pyne jelölésű programokban a Python további lehetőségeit és könyvtárait is használhatjuk. Az @pyne edge programok a Pyne által engedélyezett eszközökre épülnek, tetszőleges Python-könyvtárakat nem importálnak. Ez teszi lehetővé, hogy olyan futtatók is feldolgozzák őket, amelyekben nincs általános Python-környezet.

A könyv összes teljes programjában megtartjuk az @pyne edge jelölést, és ezen a nyelvi kereten belül dolgozunk.

Az eszközök kiválasztása

A következő sor:

from pynecore.lib import close, color, plot, script

A from … import … szerkezet elérhetővé teszi a felsorolt neveket a programban. Ebben a példában négy eszközt kérünk a pynecore.lib könyvtárból:

  • close: az aktuális gyertya záróára;
  • color: a használható színek;
  • plot: érték megjelenítése a grafikonon;
  • script: a program típusának és alapbeállításainak megadása.

A vessző választja el egymástól a neveket. A nevek kis- és nagybetűi számítanak: a close és a Close nem azonos név.

Az üres sorok a kód tagolását segítik. Így könnyebb felismerni, hol ér véget az eszközök felsorolása, és hol kezdődik a program.

A program neve és megjelenése

@script.indicator("My First Chart", overlay=True)

Ez a sor azt mondja, hogy indikátort készítünk. Az indikátor az adatokból számol és megjelenít valamit. Ebben a példában a záróárat rajzoljuk ki.

A zárójelek között adjuk meg az indikátor beállításait:

  • A "My First Chart" idézőjelek közé írt szöveg az indikátor neve.
  • Az overlay=True azt kéri, hogy a rajz a gyertyákkal közös grafikonon jelenjen meg.

A True igaz értéket jelent. Az ellentéte False. Ha az overlay értékét False-ra állítod, az indikátor külön panelben jelenik meg. A saját számításokat bemutató fejezetben ezt is használni fogjuk.

A számítás helye

def main():
    plot(close, "Close", color=color.blue, linewidth=2)

A def egy függvény kezdetét jelöli. A függvény egy névvel ellátott műveletsor. Itt a neve main.

A PyneCore a main() törzsét hajtja végre az adat gyertyáin. Ez a programunk belépési pontja. A két zárójel után kettőspont áll, az alatta beljebb kezdődő sor pedig a függvény törzséhez tartozik.

A behúzás mondja meg, mely sorok tartoznak össze. Egy behúzási szinthez négy szóközt használunk. A sor elején nyomd meg a Tab billentyűt: a PyneIDE alapbeállításaival ez egy lépésben négy szóköznyi behúzást ad. A Shift + Tab egy szinttel visszább húzza a sort. A Visual Studio Code rendszerint automatikusan be is húzza az új sort, amikor egy kettősponttal végződő sor után Entert nyomsz.

Mit kérünk a plot-tól?

A plot(...) egy függvényhívás. A zárójelben megadjuk a működéséhez szükséges értékeket és beállításokat:

  • close: ezt az értéket jelenítse meg;
  • "Close": ez legyen a rajz neve;
  • color=color.blue: kék legyen;
  • linewidth=2: a vonalvastagság beállítása legyen 2.

Az első két értéknél a sorrend adja meg a szerepet. A color= és a linewidth= név szerint mondja meg, melyik beállítást adjuk át. Ezeket paramétereknek nevezzük.

A color.blue pontja azt jelenti, hogy a color névhez tartozó blue színt használjuk. A kódban a pont része a név elérésének; ne cseréld vesszőre.

Rajzolj két vonalat

A záróárhoz a close nevet használtuk. A nyitóárat az open névvel érheted el.

Készíts másolatot a fájlról two_lines.py néven a scripts mappába. Így megmarad az második fejezet példája is. A másolatban:

  1. Add hozzá az open nevet az importált eszközökhöz.
  2. Nevezd át az indikátort "Open and Close" névre.
  3. Adj hozzá egy második plot hívást a main() törzséhez.

A teljes program:

"""
@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)

Futtatás előtt próbáld megjósolni, hol találkozik majd a két vonal a gyertyákkal. Mentsd el a fájlt, és kattints a Run Pyne code műveletre. Használd ugyanazt a mintaadatot, mint korábban.

A two_lines.py kódja mellett a DEMO-árfolyamgrafikonon külön Close és Open vonal látható.
Két plot hívás, két vonal: a Close a záróárat, az Open a nyitóárat mutatja ugyanazon a grafikonon.

Mit figyelj meg?

A kék vonal a gyertyák záróárát, a narancssárga a nyitóárát köti össze. A grafikon rajzai nevet is kaptak: Close és Open. A név segít azonosítani őket akkor is, ha később módosítod a színeket.

A két plot hívás azonos, négy szóköznyi behúzással kezdődik, mert ugyanahhoz a main() függvényhez tartoznak.

Ha az open alatt hibajelzés jelenik meg, ellenőrizd, hogy hozzáadtad-e az import sorhoz. Egy új eszköz használatához annak nevét is elérhetővé kell tenni.

Megjegyzések a kódban

Az egyetlen # jellel kezdődő sor egy megjegyzés:

    # Show the opening price of each candle.
    plot(open, "Open", color=color.orange, linewidth=2)

A megjegyzés nem hajt végre műveletet. Arra használhatod, hogy leírd egy lépés célját magadnak vagy annak, aki később olvassa a kódot. A példák megjegyzéseit angolul írjuk; a magyarázatot a könyvben magyarul olvashatod.

Megjegyzést egy utasítás végére is írhatsz:

    plot(open, "Open", color=color.orange, linewidth=2)  # Show the opening price.

A plot(...) hívás ilyenkor lefut. Az utána álló # jeltől a sor végéig tartó szöveg megjegyzés, ezért azt a futtató figyelmen kívül hagyja. A kód és a # között két szóközt hagyunk, hogy könnyebb legyen olvasni.

Próbáld ki önállóan

Készíts harmadik vonalat, amely a gyertyák legmagasabb árát mutatja. Ennek neve high. A rajz neve legyen "High", a színe pedig color.green.

Gondold végig, melyik két helyen kell bővítened a programot. Futtatás előtt jósolj: kerülhet-e a High érték a saját gyertyájának nyitó- vagy záróára alá?

A feladat megoldása

A high nevet az import sorba is be kell írni:

from pynecore.lib import close, color, high, open, plot, script

A main() törzséhez add hozzá ezt a sort, ugyanazzal a behúzással, mint a másik két hívást:

    plot(high, "High", color=color.green, linewidth=2)

A gyertya legmagasabb ára legalább akkora, mint a nyitó- és a záróára. Ezért a High pontja egy adott gyertyánál egyik alá sem kerülhet. Az egyes pontokat összekötő vonalszakaszokat mindig a megfelelő gyertya helyén értelmezd.

Ellenőrizd a saját módosításodat

Nézd végig a háromvonalas programot. Megtalálod benne az importált adatokat, az indikátor nevét és a rajzoló hívásokat? Ellenőrizd, hogy minden újonnan használt adat neve szerepel-e az import sorban, és hogy a három hívás egyformán van-e behúzva.

Mielőtt saját számításokat végzünk az árakon, megnézzük, hogyan segít a PyneIDE a függvények használatában.