A Series a gyertyákhoz rendelt előzményt tárolja. Néha azonban te szeretnéd megmondani, mely értékeket gyűjti a program, milyen sorrendben, és mikor töröl belőlük. Ehhez tömböt használhatsz.

Mit tárol egy tömb?

A tömb egymás után álló elemekből épül fel. Minden elemnek van indexe, az első indexe nulla.

Egy tömb azonos típusú elemeket tárol. Lehet például számokat vagy szövegeket tároló tömböd, de egy számtömbbe nem teszünk szöveget. Az azonos típus nem azonos értéket jelent: a 100, 103 és 101 különböző számok ugyanabban a tömbben.

Ha egy tömbbe ebben a sorrendben 100, 103 és 101 kerül, akkor a 0 indexű elem 100, az 1 indexű 103, a 2 indexű 101. Az index itt a tárolóhelyet jelöli. Nem jelent automatikusan gyertyákkal korábbi értéket.

A close[1] az előző gyertya záróára. Az array.get(prices, 1) a prices tömb második eleme. Az elem korát az dönti el, hogyan töltötted fel a tömböt.

Az array névtér

Az array.new_float(0) egy kezdetben üres, számokat tároló tömböt készít. A nulla a kezdeti elemszám, nem egy kezdeti ár.

MűveletFeladat
array.push(prices, close)Új elemet tesz a tömb végére
array.size(prices)Megadja az elemszámot
array.shift(prices)Kiveszi és visszaadja az első elemet
array.get(prices, 0)Kiolvassa az első elemet
array.avg(prices)Kiszámítja a tárolt számok átlagát

Az array.get indexének egy létező elemre kell mutatnia. Háromelemű tömbnél a 0, 1 és 2 érvényes; a 3 már nem.

Öt friss ár tárolása

Hozd létre a recent_prices.py fájlt:

"""
@pyne edge
"""
from pynecore import Persistent
from pynecore.lib import array, close, color, plot, script, ta


@script.indicator("Recent Prices", overlay=True)
def main():
    prices: Persistent[list[float]] = array.new_float(0)
    array.push(prices, close)
    if array.size(prices) > 5:
        array.shift(prices)
    stored_average = array.avg(prices)
    full_average = ta.sma(close, 5)
    plot(stored_average, "Stored average", color=color.blue, linewidth=2)
    plot(full_average, "SMA 5", color=color.orange)

A list[float] jelölés számokat tároló tömb típusa. A Persistent azt biztosítja, hogy a tömb a következő gyertyán is meglegyen. A létrehozást nem ismételjük meg minden gyertyán.

A tömb műveleteit az array névtérrel végezzük. Nem kell hozzá általános Python-könyvtárat importálni vagy saját listaliterált írni.

Futtasd a demóadaton. A kék vonal a már begyűjtött árak átlagát rajzolja. Az első gyertyán egy, a másodikon két, majd három és négy ár van benne. Az ötödik gyertyától öt elem marad.

A recent_prices.py grafikonján a tárolt árak kék átlaga és a narancssárga ötös SMA látható.
A saját tömb átlagát a teljes ötelemű ablakból számított SMA-val hasonlítjuk össze.

Hozzáadás és eltávolítás sorrendje

A hatodik gyertyán először hozzáadjuk a hatodik záróárat. A tömbnek ekkor hat eleme van. Az if feltétele igaz, ezért kivesszük az első, legrégebbi elemet. Az átlag számításakor már csak a másodiktól a hatodikig terjedő gyertyák öt záróára szerepel benne.

A tömb eleje ebben a programban a legrégebbi megmaradt ár, a vége a legújabb. A array.get(prices, 0) tehát öt elemtől kezdve négy gyertyával korábbi árat ad. Nem a mostani árnak felel meg.

Ha ki szeretnéd olvasni a legújabbat, az utolsó index array.size(prices) - 1. Az elemszám és az utolsó index eggyel eltér egymástól a nulláról induló számozás miatt.

Részleges és teljes ablak

A két rajzolt átlag eleinte különbözően viselkedik. A tömb átlaga a ténylegesen begyűjtött, legfeljebb négy árból is számítható. A ta.sma(close, 5) csak teljes, ötelemű ablaknál ad értéket.

Az ötödik gyertyától ugyanazt az öt záróárat átlagolják. A két vonalnak onnantól egyeznie kell a számábrázolás pontosságán belül.

Ezért egy tömbös átlag nem automatikusan helyettesíti a kész mozgóátlagot. A kezdeti ablak szabályát neked kell meghatároznod.

Miért korlátozzuk a méretet?

Ha minden gyertyán csak hozzáadsz egy elemet, a tömb az adathosszal együtt nő. A program futásának végén az összes feldolgozott záróárat tárolná.

Itt az utolsó öt árra van szükségünk, ezért a régebbi elemeket eltávolítjuk. A tároló mérete így legfeljebb öt a számítás időpontjában. Egy valódi gyűjtési feladatnál is határozd meg, mely adatokat és meddig kell megőrizni.

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

Módosítsd a programot úgy, hogy a tömb három árat tartson meg. A kész SMA hosszát is állítsd háromra. Utána rajzold ki a tömb legrégebbi megmaradt elemét egy harmadik vonalként.

A feladat megoldása

Az eltávolítás feltétele:

if array.size(prices) > 3:
    array.shift(prices)

A kész átlag és az új vonal:

full_average = ta.sma(close, 3)
oldest_price = array.get(prices, 0)
plot(oldest_price, "Oldest stored price", color=color.gray)

Az array.push minden gyertyán megelőzi a kiolvasást, ezért a tömbnek ekkor legalább egy eleme van. Háromelemesre bővülés után a legrégebbi ár két gyertyával korábbi.

Írd fel a tömböt

Öt helyett három megmaradó elemmel és a 100, 103, 101, 105 ársorral írd fel a tömb tartalmát mind a négy gyertya után. A negyedik gyertyán már a 103, 101 és 105 értékeket kell tartalmaznia, ebben a sorrendben.