Pierwsza strategia
Sygnały przecięć zamienisz w reguły wejścia i wyjścia dla backtestu.
W rozdziale o przecięciach wskaźnik rysował znak przy przecięciu średnich. Teraz to samo zdarzenie wywoła symulowane zlecenie. Program otworzy pozycję kupna przy przecięciu w górę i zamknie przy przecięciu w dół.
Co robi strategia?
Wskaźnik liczy i wyświetla. Strategia dodatkowo składa zlecenia symulatorowi backtestu. Symulator śledzi zlecenia, pozycje i wyniki na podstawie świec historycznych i reguł.
Ten test historyczny nazywamy backtestem. Wszystkie zlecenia są tutaj symulowane; Run Pyne code nie składa ich na prawdziwym rachunku.
Pozycja to stan posiadania po zrealizowanym wejściu. Zlecenie jest instrukcją, a realizacja zdarzeniem tworzącym lub zmieniającym pozycję. Nie używamy tych pojęć zamiennie.
Najpierw reguły słowami
Obecna strategia:
- Liczy SMA pięciu i dwudziestu świec na każdej świecy.
- Przy przecięciu w górę składa wejście long na jedną jednostkę.
- Przy przecięciu w dół zamyka pozycję powiązaną z wejściem
Long. - Używa danych zamkniętych świec historycznych.
Wartość pozycji long rośnie przy wzroście ceny i maleje przy spadku. W przykładzie nie otwieramy shortów.
Reguła nie twierdzi, że każde przecięcie w górę jest zyskowne. Backtest ma właśnie zbadać, co te operacje dałyby na danych.
Pełny program
Utwórz crossover_strategy.py:
"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, strategy, ta
@script.strategy(
"Average Crossing Strategy",
overlay=True,
initial_capital=10000,
default_qty_type=strategy.fixed,
default_qty_value=1,
pyramiding=1,
)
def main(
fast_length: int = input.int(5, title="Fast length", minval=1, maxval=200),
slow_length: int = input.int(20, title="Slow length", minval=1, maxval=200),
):
fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
crosses_up = ta.crossover(fast_average, slow_average)
crosses_down = ta.crossunder(fast_average, slow_average)
if crosses_up:
strategy.entry("Long", strategy.long)
if crosses_down:
strategy.close("Long")
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)@script.strategy oznacza main() jako strategię. Obliczenia i linie nadal można wykorzystać. Nowy import strategy zawiera operacje zleceń i dane strategii.
Dekorator jest wielowierszowym wywołaniem. Jego ustawienia regulują przebieg strategii, a parametry main() wejścia własnych obliczeń.
Kapitał początkowy i ilość
initial_capital=10000 podaje saldo początkowe symulacji. Metadane rynku demonstracyjnego określają jednostki i poziomy cen.
default_qty_type=strategy.fixed oznacza stałą ilość. default_qty_value=1 żąda jednej jednostki. To nie jeden procent kapitału ani koniecznie jedna jednostka pieniężna.
pyramiding=1 dopuszcza najwyżej jedno wejście w tym samym kierunku. Przykład nie zwiększa istniejącego longa kolejnymi wejściami.
Uczymy się na małej stałej ilości, żeby przy zmianach wyniku nie badać naraz zbyt wielu czynników rozmiaru.
Nazwa wejścia i zamknięcia
Pierwszy argument strategy.entry("Long", strategy.long) jest identyfikatorem zlecenia. Tekst Long wybiera program, drugi argument określa kierunek.
strategy.close("Long") odwołuje się do tej samej nazwy. Musi się zgadzać. Jeśli wejdziesz jako "Buy", zamknięcie "Long" nie dotyczy tego wejścia.
Przecięcie w dół oznacza tu zamknięcie, nie wejście short. Gdy pod nazwą nie ma otwartej pozycji, nie ma czego zamykać.
Uruchomienie w PyneIDE
- Zapisz pełny program.
- Wybierz Run Pyne code i dane
demo. - Sprawdź obie SMA i oznaczenia transakcji.
- Otwórz panel pod wykresem i wybierz Trades.

Jeśli nie ma transakcji, sprawdź, czy uruchomiłeś plik strategii i zachowałeś @script.strategy. Sprawdź faktyczne wejścia. SMA o tej samej długości z jednego źródła nie przecinają się.
Moment sygnału i realizacji
Przy użytych ustawieniach program składa zlecenie rynkowe z danych zamknięcia. Zwykle realizuje się ono na otwarciu kolejnej świecy. Świeca sygnału i wejścia mogą więc być różne.
Dotyczy to też zamknięcia rynkowego. Zlecenie przy przecięciu w dół może zamknąć pozycję na następnym otwarciu.
Jeśli ostatnia świeca składa nowe zlecenie, nie ma po niej kolejnej. Zlecenie nie musi więc zostać zrealizowane. Wcześniej otwarta pozycja także może pozostać otwarta na końcu danych.
Tryb realizacji jest ustawieniem. W następnym rozdziale zobaczymy go w Properties. Wynik interpretuj zawsze z trybem, w którym powstał.
Spróbuj samodzielnie
Ustaw szybkie i wolne wejście jednakowo na 20. Przewidź układ linii i liczbę przecięć mogących otworzyć transakcję.
Rozwiązanie zadania
Obie SMA mają te same ceny i okno, więc są identyczne. Żadna nie przechodzi ponad ani pod drugą. Ta reguła nie otworzy transakcji.
Wykres pokaże to po zapisaniu zmian i zakończeniu przeliczania. Potem przywróć 5 i 20.
Wybierz wejście
Znajdź zrealizowane wejście i sprawdź średnie na poprzedniej świecy. Przecięcie w górę ma być na świecy sygnałowej. Cenę realizacji porównaj z otwarciem świecy wejścia, nie automatycznie z zamknięciem sygnału.