A keresztezésjelölés megmutatja, hol történt egy esemény. Ha arra is kíváncsi vagy, hány ilyen esemény történt az adat elejétől, a programnak meg kell jegyeznie a számláló értékét.

Miért nem elég egy egyszerű változó?

Ez a két sor minden gyertyán újrakezdi a számolást:

count = 0
count += 1

Az első sor minden main() végrehajtáskor nullát ad a változónak. A második egyet hozzáad, így a végeredmény minden gyertyán 1.

A += rövidített értékadás: a count += 1 ugyanazt fejezi ki, mint a count = count + 1. Először kiolvassa a régi értéket, hozzáad egyet, majd az eredményt visszateszi a változóba.

Az események összegzéséhez másfajta kezdés kell. A nullázást csak a számláló első létrehozásakor akarjuk elvégezni.

A Persistent változó

count: Persistent[int] = 0

A Persistent jelölés azt mondja, hogy a változó értékét a gyertyák között őrizzük meg. A kezdeti nulla egyszer állítja be a változót. A következő gyertyán az előző lezárt gyertyáról megmaradt értékkel folytatjuk.

Az int itt a számláló egész számú típusát jelöli. A Persistent nevet a pynecore modulból importáljuk, ugyanúgy, ahogy korábban a Series nevet.

A jelölés nem ment adatot a merevlemezre. Egy új futás újra az adat elejéről, nullás számlálóval indul. A programon belüli gyertyák közötti megőrzésről beszélünk.

Számold meg a felfelé keresztezéseket

Hozd létre az event_counter.py fájlt:

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


@script.indicator("Crossing Counter", overlay=False)
def main():
    fast_average = ta.sma(close, 5)
    slow_average = ta.sma(close, 20)
    crosses_up = ta.crossover(fast_average, slow_average)
    count: Persistent[int] = 0
    if crosses_up:
        count += 1
    plot(count, "Crossing count", color=color.blue, linewidth=2)

Futtasd a demóadaton. A külön panel számlálója nulláról indul. Amikor felfelé keresztezés történik, egyet nő, a köztes gyertyákon pedig változatlan marad.

Az event_counter.py mellett a keresztezések összesített számát mutató vonal látható a PyneIDE grafikonján.
A számláló minden felfelé keresztezéskor eggyel nő, más gyertyákon megőrzi az értékét.

Ha a grafikon utolsó értéke például 12, az a feldolgozott teljes adatban történt tizenkét felfelé keresztezést jelenti. A képernyőn látható rövid időszakban ennél kevesebb jel lehet. A grafikon nagyítása nem indítja újra a számlálót.

Állapot és előzmény

A két jelölés külön feladatot lát el:

JelölésMit kérünk a futtatótól?
Series[float]Az érték gyertyánkénti előzménye legyen visszakereshető
Persistent[int]A változó következő gyertyán az eltárolt értékkel induljon

A Series változó értékadását minden gyertyán végrehajtjuk, és az így kapott értékekből előzmény készül. A Persistent változó kezdeti értékadása csak egyszer történik meg; utána a kód módosításai viszik tovább az állapotát.

Ha egy számláló korábbi értékére is közvetlenül vissza szeretnél tekinteni, külön Series változóba teheted a mostani számlálóértéket. A megőrzés és a múltbeli értékek indexelése két külön kérdés.

A megőrzött változó helye

A számlálót minden gyertyán elérhető helyen, a feltétel előtt deklaráljuk. Így a feltétel nélkül is van értéke, és a plot minden gyertyán ki tudja rajzolni.

Ne készíts a main() fölött egy közönséges módosítható globális számlálót. A gyertyák közötti állapotot a jelöléssel írd le, azon a helyen, ahol a program használja.

Az itt vizsgált történelmi futás gyertyánként egyszer számol. Olyan futtatási módban, amely egy gyertyát többször értékel ki, a Persistent a korábbi lezárt gyertya állapotából indul újra. Ezért nem az összes technikai végrehajtás számát tárolja. A könyv számlálóját lezárt gyertyák eseményeire használjuk.

Egy feltétel vissza is állíthatja az értéket

Ha egymást követő emelkedő gyertyákat számolsz, csökkenő vagy azonos nyitó- és záróárú gyertyán nullázhatsz:

if close > open:
    streak += 1
else:
    streak = 0

A streak változót előtte Persistent[int] jelöléssel kell létrehozni. Itt a nullázás tudatos feltételes művelet. Nem történik meg automatikusan minden gyertya elején.

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

Adj egy második megőrzött számlálót a programhoz. Ez a lefelé keresztezéseket számolja, és narancssárga vonalként jelenjen meg. A két számítás minden gyertyán fusson le.

A feladat megoldása

A felfelé keresztezés számítása mellé:

crosses_down = ta.crossunder(fast_average, slow_average)
down_count: Persistent[int] = 0
if crosses_down:
    down_count += 1
plot(down_count, "Downward count", color=color.orange, linewidth=2)

A meglévő count változót és annak rajzolását tartsd meg. A két számláló egymástól független. Egy új futtatás mindkettőt nulláról építi fel.

Ellenőrizd egy jelzésnél

Hasonlítsd össze a keresztezéseket bemutató fejezet jelöléseit és a számláló változásait ugyanazon az adaton. A felfelé keresztezés gyertyáján a számláló pontosan eggyel nőjön. A következő gyertyán csak akkor nőhet újra, ha új felfelé keresztezés történt.