Czas i wcześniejsze świece
Zrozumiesz wykonanie świeca po świecy i obliczysz zmianę na podstawie wcześniejszych wartości.
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żenie | Które zamknięcie oznacza? |
|---|---|
close | Bieżą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) / 2Część 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.

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 PersistentDodaj 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 = midpointObie 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.