Co program zapamiętuje
Zmienną Persistent policzysz przecięcia i odróżnisz stan od historii.
Oznaczenie pokazuje miejsce zdarzenia. Jeśli chcesz wiedzieć, ile takich zdarzeń wystąpiło od początku danych, program musi pamiętać licznik.
Dlaczego zwykła zmienna nie wystarcza?
Te dwa wiersze zaczynają liczenie od nowa na każdej świecy:
count = 0
count += 1Pierwszy przypisuje zero przy każdym wykonaniu main(). Drugi dodaje jeden, więc wynik na każdej świecy wynosi 1.
+= to skrót przypisania: count += 1 oznacza to samo co count = count + 1. Najpierw odczytuje dawną wartość, dodaje jeden i zapisuje wynik z powrotem.
Sumowanie zdarzeń wymaga innego początku. Zerowanie chcemy wykonać tylko przy pierwszym tworzeniu licznika.
Zmienna Persistent
count: Persistent[int] = 0Persistent nakazuje zachowanie wartości między świecami. Początkowe zero ustawia ją raz. Na następnej świecy kontynuujemy z wartością zachowaną z poprzedniej zamkniętej świecy.
int określa całkowitoliczbowy typ licznika. Persistent importujemy z pynecore, tak jak wcześniej Series.
Znacznik nie zapisuje danych na dysku. Nowy przebieg zaczyna od początku danych z zerowym licznikiem. Chodzi o zachowanie wartości pomiędzy świecami wewnątrz programu.
Policz przecięcia w górę
Utwórz event_counter.py:
"""
@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)Uruchom na demonstracji. Licznik osobnego panelu zaczyna od zera. Przy przecięciu w górę zwiększa się o jeden, na pozostałych świecach pozostaje bez zmian.

Jeśli ostatni punkt to na przykład 12, oznacza dwanaście przecięć w całych przetworzonych danych. W krótkim okresie widocznym na ekranie może być mniej sygnałów. Powiększenie wykresu nie zeruje licznika.
Stan i historia
Znaczniki pełnią różne zadania:
| Znacznik | Czego oczekujemy od wykonawcy? |
|---|---|
Series[float] | Dostępu do wcześniejszych wartości ze świec |
Persistent[int] | Rozpoczęcia kolejnej świecy z zachowaną wartością |
Przypisanie Series wykonuje się na każdej świecy, a wyniki tworzą historię. Początkowe przypisanie Persistent wykonuje się raz; późniejsze zmiany w kodzie rozwijają stan.
Jeśli chcesz bezpośrednio odczytywać wcześniejsze liczniki, możesz umieścić bieżący stan w osobnej zmiennej Series. Zachowanie wartości i indeksowanie przeszłości to dwie różne sprawy.
Miejsce zachowywanej zmiennej
Licznik deklarujemy przed warunkiem, w miejscu osiąganym na każdej świecy. Ma wtedy wartość niezależnie od warunku, a plot może ją zawsze narysować.
Nie twórz zwykłego modyfikowalnego globalnego licznika ponad main(). Stan między świecami opisuj znacznikiem tam, gdzie jest używany.
Badany przebieg historyczny liczy raz na świecę. W trybie oceniającym jedną świecę wielokrotnie Persistent zaczyna ponownie ze stanu poprzedniej zamkniętej świecy. Nie przechowuje więc liczby wszystkich technicznych wykonań. Nasz licznik służy zdarzeniom zamkniętych świec.
Warunek może także wyzerować wartość
Przy liczeniu kolejnych wzrostowych świec możesz zerować na spadkowej lub z równym otwarciem i zamknięciem:
if close > open:
streak += 1
else:
streak = 0streak należy wcześniej utworzyć jako Persistent[int]. Zerowanie jest tu świadomą operacją warunkową, a nie automatycznym początkiem każdej świecy.
Spróbuj samodzielnie
Dodaj drugi zachowywany licznik dla przecięć w dół, rysowany pomarańczowo. Obie operacje mają działać na każdej świecy.
Rozwiązanie zadania
Obok obliczenia przecięcia w górę:
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)Zachowaj dotychczasowe count i jego linię. Liczniki są niezależne. Nowy przebieg buduje oba od zera.
Sprawdź przy sygnale
Porównaj oznaczenia z rozdziału o przecięciach ze zmianami licznika na tych samych danych. Na świecy przecięcia w górę ma wzrosnąć dokładnie o jeden. Na kolejnej może wzrosnąć tylko przy nowym przecięciu.