W poprzednim rozdziale liczyłeś z danych jednej świecy. Zmiana zamknięcia wymaga już dwóch: obecnej i poprzedniej. Tutaj połączysz ich wartości.

Program ten sam, świeca się zmienia

Uruchomiony na demonstracji PyneCore przechodzi przez świece chronologicznie. main() pracuje z pierwszą, potem drugą i tak dalej. close zawsze oznacza zamknięcie aktualnie przetwarzanej świecy.

Dlatego jedno wywołanie plot(close, "Close") potrafi narysować całą linię. Jedno wykonanie dodaje punkt; sekwencja świec tworzy pełną linię.

Także midpoint = (high + low) / 2 z poprzedniego rozdziału wykonuje się ponownie na każdej świecy. Przypisanie przelicza jej cenę środkową. Nazwa zmiennej pozostaje ta sama, wartość może się zmieniać.

Kolejność przetwarzania zapewnia środowisko wykonawcze. Do przejścia całego wykresu nie potrzebujesz własnej pętli.

Wstecz przez nawias kwadratowy

close[1] to cena zamknięcia o jedną świecę wcześniej. Liczba w nawiasach określa, jak daleko patrzymy wstecz.

WyrażenieKtóre zamknięcie oznacza?
closeBieżącej przetwarzanej świecy
close[0]Również bieżącej świecy
close[1]Poprzedniej świecy
close[2]Świecy o dwa miejsca wcześniejszej

Jeśli kolejne zamknięcia dzienne wynoszą 100, 103 i 101, na trzeciej świecy close to 101, close[1] to 103, a close[2] to 100.

close - close[1] oznacza wtedy 101 - 103, czyli −2. To różnica kolejnych zamknięć. close - open porównuje otwarcie i zamknięcie tej samej świecy. To odpowiedzi na inne pytania.

Odległość mierzymy w świecach, nie dniach kalendarzowych. W danych dziennych weekend lub dzień bez handlu może oznaczać, że poprzednia świeca pochodzi sprzed kilku dni.

Własna wartość też może mieć historię

Historia cen wbudowanych jest już dostępna. Jeśli chcesz cofać się do własnego obliczenia, oznacz zmienną jako Series:

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

Część po dwukropku jest oznaczeniem typu. float oznacza liczbę dopuszczającą część ułamkową. Series[float] prosi też o przechowywanie historii zmiennej dla kolejnych świec.

Przypisanie nadal wykonuje się na każdej świecy. midpoint to obecny wynik, a midpoint[1] wartość zapisana na poprzedniej świecy. Series trzeba importować z pynecore.

Dwa rodzaje zmian na wykresie

W folderze projektu scripts utwórz history_change.py:

"""
@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)

Zapisz, wybierz Run Pyne code i dane demo. W osobnym panelu pojawią się dwie linie: niebieska zmiana zamknięcia i pomarańczowa zmiana środka. Dodatni punkt oznacza wzrost wobec poprzedniej świecy.

Obok history_change.py wykres PyneIDE pokazuje dwie linie zmian.
Zmiany zamknięcia i obliczonej ceny środkowej między świecami w osobnym panelu.

Najedź na świecę. Wartości wykresu odpowiadają czasowi pod kursorem; nie trzeba wybierać tego czasu w pliku.

Co dzieje się na pierwszej świecy?

Pierwsza świeca pliku nie ma poprzedniczki. Jej close[1] jest brakującą wartością na, od „not available”.

Brakująca cena nie jest zerem. Wynik close - close[1] również jest brakujący, więc program nie rysuje ważnej zmiany na pierwszej świecy. To poprawne: różnicy dwóch świec nie obliczymy z jednej.

na(value) sprawdza brak wartości. Obsługi warunków nauczysz się w Warunkach i oznaczeniach. Do tego czasu nie próbuj naprawiać brakującego punktu jako ceny zerowej.

Ten zapis nie udostępnia przyszłych świec. close[-1] też nie oznacza następnego zamknięcia. Decyzja może używać tylko danych dostępnych przy danym wykonaniu.

Spróbuj samodzielnie

Zmień niebieską linię, by porównywała zamknięcie z ceną pięć świec wcześniej. Zaznacz tę odległość także w tytule.

Przed uruchomieniem określ, na ilu początkowych świecach zabraknie wyniku.

Rozwiązanie zadania
close_change = close - close[5]
plot(close_change, "Five-candle change", color=color.blue)

Pierwsze pięć świec nie ma zamknięcia sprzed pięciu świec. Na szóstej jest już dostępne: to zamknięcie pierwszej świecy pliku.

Pomarańczowa linia się nie zmienia. Jeśli chcesz liczyć obie zmiany za pięć świec, zmień też midpoint[1].

Sprawdź obliczenie

Wybierz trzy kolejne świece. Zapisz ich zamknięcia i ręcznie policz zmianę o jedną świecę dla drugiej i trzeciej. Niebieska linia powinna pokazać te same wartości. Przy różnicy najpierw sprawdź czasy i odległość wstecz.

Zadanie dodatkowe: zachowana wartość zamiast historii

Jedną poprzednią wartość można wykorzystać, zapisując ją na następną świecę. Do tego służy Persistent, opisane w rozdziale Co program zapamiętuje. Możesz wykonać zadanie po jego przeczytaniu.

Przepisz history_change.py bez close[1] i midpoint[1]. Dwie zmienne trwałe mają zachować poprzednie zamknięcie i środek. Linie powinny pokazywać to samo co pierwotnie, a pierwsza zmiana nadal ma być brakująca.

Rozważ kolejność: kiedy odczytać zachowany wynik, a kiedy zastąpić go bieżącym?

Rozwiązanie zadania

Zastąp import Series przez Persistent:

from pynecore import Persistent

Dodaj na do importu z pynecore.lib. Zachowaj początkowy znacznik i ustawienia wskaźnika, a main() przepisz tak:

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

Obie zachowywane zmienne zaczynają od na, bo pierwsza świeca nie ma poprzedniej ceny. Dlatego pierwsza różnica też jest brakująca. Na końcu funkcji zapisujemy obecne wartości, by użyć ich na kolejnej świecy.

Jeśli umieścisz previous_close = close przed odejmowaniem, odejmiesz bieżące zamknięcie od niego samego i uzyskasz zero. Przy trwałych zmiennych musisz pilnować kolejności aktualizacji.

Obie metody nadają się do spojrzenia o jedną świecę wstecz. Wersja z nawiasami jest krótsza i bezpośrednio dociera też do dalszych wartości. Te dwie zmienne trwałe przechowują tylko ostatnio zapisane ceny.

Uruchom obie wersje na tych samych danych demonstracyjnych i porównaj linie na kilku wybranych świecach.