A gyertyák sorozatán a futtató halad végig. Egyetlen gyertyán belül azonban neked is szükséged lehet ismétlésre: például össze akarod adni az utolsó öt záróárat. Erre használhatod a ciklust.

A for és a range

for offset in range(5):
    total += close[offset]

A range(5) sorban a ciklus az offset változónak 0, 1, 2, 3 és 4 értéket ad. Az 5 már nem szerepel benne. A behúzott sor minden ilyen értékkel egyszer lefut.

A close[offset] így először a mostani, majd az eggyel, kettővel, hárommal és néggyel korábbi záróárat jelenti. Pontosan öt értéket adunk össze.

A total változót a ciklus előtt nullázni kell. Ez egy adott gyertya számításának részeredménye, nem gyertyák között megőrzött számláló.

A range(1, 5) más sort ad: 1, 2, 3, 4. A kezdő érték benne van, a záró érték nincs. A kezdő érték elhagyásakor nulláról indulunk.

Kézzel írt mozgóátlag

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

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


@script.indicator("Manual Average Check", overlay=False)
def main(
    length: int = input.int(5, title="Length", minval=1, maxval=100),
):
    total = 0.0
    for offset in range(length):
        total += close[offset]
    manual_average = total / length
    builtin_average = ta.sma(close, length)
    difference = manual_average - builtin_average
    plot(difference, "Difference", color=color.blue)

Futtasd a demóadaton. A vonal a saját átlag és a kész SMA különbségét mutatja. A bemelegedés után nullán, illetve a számábrázolás miatt nullához nagyon közeli értéken kell haladnia.

A manual_average.py mellett a két átlag különbségét mutató vonal látható a PyneIDE külön paneljén.
A saját ciklus és a kész SMA eredményének különbsége a bemelegedés után nulla körül marad.

Nem két egymást fedő vonalat rajzolunk, mert azon apró eltéréseket nehéz észrevenni. A különbség közvetlenül mutatja, hogy egyezik-e a két számítás.

Mit csinál egy végrehajtás?

Ötös hossznál a műveletek sorrendje:

  1. total értéke nulla lesz.
  2. A ciklus hozzáadja a mostani és az előző négy záróárat.
  3. Az összeget elosztjuk öttel.
  4. Kiszámítjuk a kész SMA-t is, és kivonjuk belőle a saját eredményünket.
  5. Egyetlen pontot rajzolunk a különbség vonalához.

Ezután a futtató lép a következő gyertyára. A total ott újra nulláról indul, a ciklus pedig már az új gyertyához tartozó öt értéket adja össze.

Ha a total változót Persistent típusra cserélnéd, a következő gyertya az előző összegből folytatná. Minden gyertyán újabb öt értéket adnál a régi eredményhez, és már nem a mostani ablak átlagát számolnád.

A hiányzó előzmény

Az adat első négy gyertyáján az ötelemű ablakhoz legalább egy záróár hiányzik. Az összegben megjelenő na a saját átlagot is hiányzóvá teszi. A kész ötös SMA szintén csak az ötödik gyertyán lesz érvényes.

Az adatfájl összes záróára érvényes a könyv demóadatában. Olyan forrásnál, amelynek középső részén is vannak hiányok, a kész ta.sma hiánykezelése eltérhet egy egyszerű, gyertyaoffseteken végigmenő összeadástól. Ezért a példa ellenőrzését az itt megadott adaton végezzük.

Mennyi ismétlést kérsz?

Százgyertyás ablaknál gyertyánként száz összeadást végzünk. Kétezer gyertya esetén ez már kétszázezer cikluslépés.

A kész ta.sma célja éppen az, hogy ezt a gyakori feladatot a futtató erre tervezett számításával végezze. A saját ciklus itt a működés megértését és az összehasonlítást szolgálja. A kész függvényt használd, ha az elvégzi a kívánt feladatot.

A ciklus végének ismertnek és korlátozottnak kell lennie. Az input maximumával azt is meghatározzuk, mekkora feladatot kérhet a felhasználó egy gyertyán belül.

break és continue

A break megszakítja a ciklust. A continue kihagyja az aktuális cikluslépés hátralévő részét, és a következő lépésre ugrik.

Egy átlagablaknál óvatosan használd ezeket. Ha három értéket adtál össze, majd megállsz, az összeget már nem oszthatod öttel úgy, mintha öt érték szerepelne benne. A kihagyások megváltoztatják a számítás jelentését.

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

Állítsd a hosszt háromra. Írd fel egy gyertyánál a ciklusban szereplő offseteket és az azokhoz tartozó három árat. Ezután módosítsd a programot úgy, hogy a különbség mellett a saját átlagot és a kész átlagot is kirajzolja overlay módban.

A feladat megoldása

A három offset 0, 1, 2. A dekorátorban overlay=True kell, a számítás után pedig:

plot(manual_average, "Manual average", color=color.blue, linewidth=2)
plot(builtin_average, "Built-in average", color=color.orange)

A különbség rajzolását ebből a nézetből vedd ki. A nulla körüli vonal és az ár szintjén haladó átlagok közös skálán nehezen olvashatók. Az ellenőrzéshez az eredeti különbségpanelt külön programváltozatban megtarthatod.

Keress egy elcsúszott ablakot

Gondold végig, mi változna, ha a ciklust range(1, length + 1) alakra írnád. Az elemszám maradna öt, de a mostani gyertya kimaradna, és bekerülne az öt gyertyával korábbi. Ez az előző gyertya átlagablaka lenne, nem a mostanié.