Az előző fejezetben egy gyertya adataiból számoltál. A záróár változásához már két gyertya kell: a mostani és az előző. Ebben a fejezetben ezek között teremtesz kapcsolatot.

A program ugyanaz, a gyertya változik

Amikor elindítod a programot a demóadaton, a PyneCore időrendben halad végig a gyertyákon. A main() az első gyertyával dolgozik, majd a másodikkal, és így tovább. A close minden alkalommal az éppen feldolgozott gyertya záróárát jelenti.

Ezért tud egyetlen plot(close, "Close") hívás teljes vonalat rajzolni. Egy végrehajtás egy pontot ad a vonalhoz; a gyertyák sorozata adja a teljes vonalat.

Az előző fejezet midpoint = (high + low) / 2 sora is újra lefut minden gyertyán. Az értékadás újraszámítja az adott gyertya középárát. A változó neve ugyanaz marad, az értéke változhat.

A feldolgozás sorrendjét a futtató biztosítja. A teljes grafikon bejárásához nem kell saját ciklust írnod.

Visszatekintés szögletes zárójellel

A close[1] az egy gyertyával korábbi záróár. A szögletes zárójelben álló szám azt mondja meg, mennyivel tekintsünk vissza.

KifejezésMelyik záróárat jelenti?
closeA feldolgozott gyertyáét
close[0]Szintén a feldolgozott gyertyáét
close[1]Az eggyel korábbi gyertyáét
close[2]A kettővel korábbi gyertyáét

Ha a napi adatokban három egymást követő záróár 100, 103 és 101, akkor a harmadik gyertyán close értéke 101, close[1] értéke 103, close[2] értéke 100.

A close - close[1] ebben a helyzetben 101 - 103, azaz −2. Ez a két egymást követő záróár különbsége. A close - open ugyanazon gyertya nyitó- és záróárát hasonlítja össze. A két számítás eltérő kérdésre válaszol.

A visszatekintés gyertyákban mér, nem naptári napokban. Napi piaci adatokban egy hétvége vagy egy kereskedési szünnap miatt az előző gyertya időpontja több nappal korábbi is lehet.

A saját értékednek is lehet előzménye

A beépített árak előzménye már elérhető. Ha a saját számításodra is vissza szeretnél tekinteni, jelöld Series változóként:

midpoint: Series[float] = (high + low) / 2

A kettőspont utáni rész egy típusjelölés. A float tört értéket is megengedő számot jelöl. A Series[float] azt is kéri a futtatótól, hogy őrizze meg a változó gyertyánkénti előzményeit.

Az értékadás továbbra is minden gyertyán lefut. A midpoint a mostani számított érték, a midpoint[1] az előző gyertyán eltárolt érték. A Series nevet a pynecore modulból kell importálni.

Kétféle változás a grafikonon

Hozd létre a history_change.py fájlt a projekt scripts mappájában:

"""
@pyne edge
"""
from pynecore import Series
from pynecore.lib import close, color, high, low, plot, script


@script.indicator("Changes Between Candles", overlay=False)
def main():
    midpoint: Series[float] = (high + low) / 2
    close_change = close - close[1]
    midpoint_change = midpoint - midpoint[1]
    plot(close_change, "Close change", color=color.blue)
    plot(midpoint_change, "Midpoint change", color=color.orange)

Mentsd el, majd válaszd a Run Pyne code műveletet és a demo adatot. Külön panelben két vonal jelenik meg. A kék a záróár, a narancssárga a középár változását mutatja. Egy pozitív pont azt jelenti, hogy az adott érték nőtt az előző gyertyához képest.

A history_change.py program mellett két változást mutató vonal látható a PyneIDE grafikonján.
A záróár és a számított középár gyertyák közötti változása külön panelben.

Vidd az egérmutatót egy gyertyára. A grafikon értékei mindig a mutatóhoz tartozó időpontot mutatják; a fájlban nem kell külön kiválasztanod ezt az időpontot.

Mi történik a legelső gyertyán?

Az első gyertyának nincs korábbi gyertyája az adatfájlban. Ott a close[1] hiányzó érték: na. A rövidítés a „not available” kifejezésből származik.

A hiányzó ár nem nulla. A close - close[1] eredménye is hiányzik, ezért az első gyertyán a program nem rajzol érvényes változást. Ez megfelelő eredmény: két gyertya különbségét egyetlen gyertyából nem tudjuk kiszámítani.

A na(value) hívással megvizsgálhatod, hogy hiányzik-e egy érték. A feltételek kezelését a Feltételek és jelölések fejezetben tanulod meg. Addig a grafikon elején látható hiányzó pontot ne próbáld nulla árként javítani.

A jövőbeli gyertyákat ez a jelölés nem teszi elérhetővé. A close[-1] sem jelent következő záróárat. Egy döntéshez csak az adott végrehajtáskor rendelkezésre álló adatok használhatók.

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

Módosítsd a kék vonalat úgy, hogy a záróárat az öt gyertyával korábbi záróárhoz hasonlítsa. A vonal címében is jelezd az öt gyertyás távolságot.

Mielőtt futtatod, döntsd el: az első hány gyertyán fog hiányozni az eredmény?

A feladat megoldása
close_change = close - close[5]
plot(close_change, "Five-candle change", color=color.blue)

Az első öt gyertyán nincs öt gyertyával korábbi záróár. A hatodik gyertyán már van: az adatfájl első gyertyájának záróára.

A narancssárga vonal ettől nem változik. Ha mindkét változást öt gyertyára szeretnéd számolni, a midpoint[1] kifejezést is át kell írnod.

Ellenőrizd a számítást

Válassz három egymást követő gyertyát. Írd le a záróáraikat, és kézzel számítsd ki a második és a harmadik gyertya egygyertyás változását. A kék vonalnak ugyanezeket az értékeket kell mutatnia. Ha eltérés van, először a kiválasztott időpontokat és a visszatekintés számát ellenőrizd.

Szorgalmi feladat: előzmény helyett megőrzött érték

Egyetlen előző értéket úgy is felhasználhatsz, hogy eltárolod a következő gyertyára. Erre való a Persistent változó, amelyet az Amit a program megjegyez fejezetben ismersz meg. Ezt a feladatot annak elolvasása után is megoldhatod.

Írd át a history_change.py programot úgy, hogy se close[1], se midpoint[1] ne szerepeljen benne. Két perzisztens változó őrizze meg az előző gyertya záróárát és középárát. A két vonal ugyanazokat az értékeket mutassa, mint az eredeti programban, az első gyertyán pedig továbbra is hiányozzon a változás.

Gondold végig a sorrendet: mikor kell kiolvasnod a megőrzött értéket, és mikor írhatod felül a mostanival?

A feladat megoldása

A Series importját cseréld Persistent-re:

from pynecore import Persistent

A pynecore.lib importjához add hozzá a na nevet. A fájl elején lévő jelölést és az indikátor beállításait tartsd meg, a main() függvényt pedig írd át így:

def main():
    previous_close: Persistent[float] = na
    previous_midpoint: Persistent[float] = na
    midpoint = (high + low) / 2
    close_change = close - previous_close
    midpoint_change = midpoint - previous_midpoint
    plot(close_change, "Close change", color=color.blue)
    plot(midpoint_change, "Midpoint change", color=color.orange)
    previous_close = close
    previous_midpoint = midpoint

A két megőrzött változó kezdeti értéke na, mert az első gyertyán még nincs előző ár. Ezért az első különbség is hiányzik. A függvény végén eltároljuk a mostani értékeket; a következő gyertyán már ezekből számolunk.

Ha a previous_close = close sort a kivonás elé teszed, a mostani záróárból önmagát vonod ki, így nullát kapsz. A perzisztens megoldásnál neked kell gondoskodnod a frissítés sorrendjéről.

Egyetlen gyertyára való visszatekintéshez mindkét megoldás használható. A szögletes zárójeles változat rövidebb, és több gyertyával korábbi értéket is közvetlenül elérsz vele. Ez a két perzisztens változó csak a legutóbb eltárolt árakat őrzi.

Futtasd mindkét változatot ugyanazon a demóadaton, és hasonlítsd össze a két vonalat néhány kiválasztott gyertyán.