Pierwsza strategia zamykała tylko na przeciwnym przecięciu. Teraz dodamy odległość straty i zysku od wejścia. Zamknięcie przez przecięcie pozostaje.

Trzy przyczyny wyjścia

Long może zostać zamknięty przez:

  • osiągnięcie poziomu zlecenia stop ograniczającego stratę;
  • osiągnięcie poziomu zlecenia limit realizującego zysk;
  • przecięcie wolnej średniej w dół przez szybką i realizację zamknięcia rynkowego.

Stop i limit mają warunek cenowy. strategy.close składa rynkowe zamknięcie. Ich reguły realizacji mogą być różne, więc sprawdzaj w tabeli ceny i czasy.

Odległość czy konkretna cena?

strategy.exit pozwala na dwa sposoby podania:

ArgumentCo podajesz?
lossOdległość straty w tickach
profitOdległość zysku w tickach
stopKonkretną cenę stop
limitKonkretną cenę limit

loss=100 nie oznacza 100 procent ani koniecznie 100 jednostek pieniężnych. Żądasz stu ticków od ceny wejścia.

Tick DEMO wynosi 0,01. Sto ticków to 1 jednostka ceny, dwieście to 2. Dla longa po 200 oznacza to stop 199 i cel 202, bez dalszych efektów poślizgu i realizacji.

Pełny program

Utwórz protected_strategy.py:

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


@script.strategy(
    "Crossing Strategy with Exits",
    overlay=True,
    initial_capital=10000,
    default_qty_type=strategy.fixed,
    default_qty_value=1,
    pyramiding=1,
    commission_type=strategy.commission.percent,
    commission_value=0.1,
    slippage=2,
)
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),
    stop_ticks: int = input.int(100, title="Stop distance (ticks)", minval=1),
    target_ticks: int = input.int(200, title="Target distance (ticks)", minval=1),
):
    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")
    strategy.exit("Bracket", "Long", loss=stop_ticks, profit=target_ticks)
    plot(fast_average, "Fast average", color=color.blue, linewidth=2)
    plot(slow_average, "Slow average", color=color.orange, linewidth=2)

Bracket identyfikuje grupę wyjść. Drugi argument Long łączy je z wejściem. loss i profit używają powyższych wejść.

Wyjście wywołujemy na każdej świecy z tym samym identyfikatorem. Zarządza to regułą wyjścia, nie otwiera przy każdym wywołaniu osobnej nowej pozycji.

Uruchom na demonstracji. W Trades oprócz rynkowego zamknięcia przez przecięcie mogą pojawić się wyjścia Bracket.

Uruchomienie protected_strategy.py w PyneIDE; transakcje mogą zamykać wyjścia stop lub cel.
Strategia oprócz przecięcia używa stopu i celu określonych w tickach.

Kiedy pojawia się wyjście ochronne?

Program może w jednym wykonaniu złożyć wejście i powiązane wyjście. Wykonawca odnosi odległość tickową do rzeczywistej ceny realizacji wejścia.

Gdybyś zamiast tego liczył konkretną cenę stop z zamknięcia sygnału, poziom zaczynałby od ceny sygnałowej. Inne następne otwarcie zmienia odległość od faktycznego wejścia.

Wybieraj zapis według zamierzonej reguły. loss to ticki od wejścia, stop konkretna cena.

Świeca nie zawiera każdego kroku ceny

OHLCV podaje otwarcie, maksimum, minimum i zamknięcie. Nie znamy automatycznie kolejności wszystkich cen wewnątrz świecy.

Gdy maksimum sięga celu, a minimum stopu na tej samej świecy, cztery ceny nie mówią, co było pierwsze. Symulator stosuje wtedy model realizacji. Dane niższego interwału umożliwiają dokładniejsze badanie.

Sprawdź taki przypadek osobno, zamiast zawsze ręcznie wybierać korzystny wariant. Założenie modelu jest częścią wyniku.

Cena stop nie gwarantuje też dokładnej realizacji. Jeśli kolejna świeca otworzy się za stopem, realizacja może być gorsza od pominiętego poziomu. Poślizg może dodać kolejne odchylenie.

Odległość i strata pieniężna

Dla longa jednej jednostki z wartością punktu 1 sto ticków po 0,01 oznacza różnicę 1 jednostki pieniężnej. Przy dziesięciu jednostkach wynik jest dziesięciokrotny.

Ilość, tick i wartość punktu razem określają pieniężną wielkość ruchu do stopu. Dochodzą prowizje i rzeczywiste warunki realizacji.

Bezpośrednie qty w zleceniu określa jego własną ilość. Przykład używa domyślnej, którą można nadpisać w Properties → Order size.

100 i 200 ticków w DEMO służą demonstracji. Na innym instrumencie te same liczby mogą oznaczać inne odległości i kwoty.

Spróbuj samodzielnie

Nie zmieniaj długości, ilości ani kosztów. Uruchom stop/cel 100/200, potem 200/400 i sprawdź los tego samego sygnału wejścia.

Rozwiązanie zadania

Zmień wyłącznie Stop distance (ticks) i Target distance (ticks) w Inputs. Większe odległości mogą zamknąć pozycję na innej świecy lub z innej przyczyny.

Zamknięcie przez przecięcie pozostaje w obu wersjach. Dalszy cel nie gwarantuje więc trzymania pozycji aż do niego. Reguły wyjścia współdziałają.

Po zapisaniu wejść poczekaj na przeliczenie i odczytaj nowy wynik. Zachowaj eksporty pod różnymi nazwami, jeśli chcesz później porównać.

Ustal przyczynę wyjścia

Wybierz zamkniętą transakcję i sprawdź wejście, tickowe odległości oraz OHLC świecy wyjścia. Na podstawie ceny i czasu ustal regułę wyjaśniającą realizację. Gdy świeca dotyka kilku poziomów, uwzględnij model.