A keresztezéseket bemutató fejezetben az indikátor jelet rajzolt az átlagok keresztezésénél. Most ugyanazt az eseményt egy szimulált megbízás kiváltására használod. A program felfelé keresztezésnél vételi pozíciót nyit, lefelé keresztezésnél lezárja azt.

Mit csinál a stratégia?

Az indikátor számol és megjelenít. A stratégia ezek mellett megbízásokat is ad a backtest szimulátorának. A szimulátor a történelmi gyertyák és a megadott szabályok alapján követi a megbízásokat, pozíciókat és eredményeket.

Ezt a történelmi visszatesztelést nevezzük backtestnek. Ebben a fejezetben minden megbízás szimulált; a Run Pyne code elindítása nem adja fel a megbízásokat egy valós kereskedési számlán.

Egy pozíció a már teljesült belépés után fennálló állomány. A megbízás az utasítás, a teljesülés az esemény, amely létrehozza vagy módosítja a pozíciót. A három kifejezést nem használjuk felcserélhetően.

A szabályok előbb szövegben

A mostani stratégia szabályai:

  • Ötös és húszas SMA-t számol minden gyertyán.
  • Felfelé keresztezésnél egy egységnyi long pozícióra ad belépési megbízást.
  • Lefelé keresztezésnél lezárja a Long azonosítójú belépéshez tartozó pozíciót.
  • A számítás a lezárt történelmi gyertyák adataival dolgozik.

A long pozíció értéke az ár emelkedésekor nő, csökkenésekor csökken. Ebben a példában short pozíciót nem nyitunk.

A szabály nem mondja, hogy minden felfelé keresztezés nyereséges. A backtest éppen azt vizsgálja, mi történt volna az adott adaton ezekkel a műveletekkel.

A teljes program

Hozd létre a crossover_strategy.py fájlt:

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

A @script.strategy jelöli, hogy a main() stratégia. A számítások és a két vonal változatlanul használhatók. Új import a strategy névtér, amely a megbízási műveleteket és a stratégia adatait tartalmazza.

A dekorátor többsoros hívás. A benne levő beállítások a stratégia futását szabályozzák; a main() paraméterei a saját számításaink bemenetei.

Kezdőtőke és mennyiség

Az initial_capital=10000 a szimuláció kezdő egyenlegét adja meg. A demóadat saját piaci metaadatai határozzák meg, milyen egységek és árszintek tartoznak a futáshoz.

A default_qty_type=strategy.fixed rögzített mennyiséget jelent. A default_qty_value=1 egy egységnyi megbízást kér. Ez nem a tőke egy százaléka, és nem feltétlenül egy pénzegység.

A pyramiding=1 legfeljebb egy azonos irányú belépést enged. A példa nem növeli újabb long belépésekkel a már meglevő pozíciót.

A tanulás során kis, rögzített mennyiséggel követjük a műveleteket. Így az eredmény változásánál kevesebb eltérő méretezési tényezőt kell egyszerre vizsgálni.

A belépés és a lezárás neve

A strategy.entry("Long", strategy.long) első argumentuma egy megbízásazonosító. A Long szöveget a program választja; a második argumentum adja meg az irányt.

A strategy.close("Long") ugyanarra az azonosítóra hivatkozik. A névnek egyeznie kell. Ha "Buy" azonosítóval lépsz be, a "Long" lezárása nem ezt a belépést célozza.

A lefelé keresztezés itt lezárás, nem short belépés. Ha éppen nincs a névhez tartozó nyitott pozíció, nincs mit lezárni.

Futtatás a PyneIDE-ben

  1. Mentsd el a teljes programot.
  2. Válaszd a Run Pyne code műveletet és a demo adatot.
  3. A grafikonon ellenőrizd a két SMA-vonalat és a kötésjelöléseket.
  4. Nyisd ki a grafikon alatti panelt, és válaszd a Trades fület.
A crossover_strategy.py mellett két SMA-vonal és a stratégia belépési, illetve kilépési kötésjelölései láthatók.
Az SMA-keresztezések megbízásokat indítanak; a teljesült kötések a grafikonon is megjelennek.

Ha nem látszik kötés, ellenőrizd, hogy valóban a stratégiafájlt futtattad-e, és megmaradt-e a @script.strategy jelölés. Nézd meg a két input tényleges értékét is. Azonos hosszúságú, azonos forrásból számított SMA-k nem keresztezik egymást.

Jelzés és teljesülés időpontja

Az itt használt alapbeállításnál a program a gyertya záróadataiból ad piaci megbízást. A megbízás rendszerint a következő gyertya nyitóárán teljesül. A jelzést adó gyertya és a belépés gyertyája ezért eltérhet.

Ugyanez vonatkozik a piaci lezárásra. A lefelé keresztezésnél létrehozott lezárási megbízás a következő nyitásnál zárhatja a pozíciót.

Ha az utolsó gyertya új megbízást ad, nincs utána következő gyertya a fájlban. A megbízás emiatt nem feltétlenül teljesül. Az adat végén egy már korábban megnyitott pozíció is maradhat nyitva.

A teljesülési mód egy beállítás része. A következő fejezetben a Properties felületen is megnézzük. Egy eredményt mindig azzal a teljesülési móddal értelmezz, amellyel a futás készült.

Próbáld ki önállóan

Nyisd meg a stratégia inputjait, és állítsd a gyors és lassú hosszt egyaránt 20-ra. Jósolj meg két dolgot: hogyan helyezkedik el a két vonal, és hány keresztezésből indulhat kötés?

A feladat megoldása

A két SMA ugyanazokból az árakból ugyanakkora ablakot használ, ezért egyezik. Nincs olyan gyertya, amelyen az egyik a másik fölé vagy alá kerülne. A stratégia ebből a szabályból nem nyit kötést.

A meglévő grafikon csak akkor mutatja ezt az eredményt, ha a módosított inputokat elmentetted, és az újraszámítás befejeződött. A vizsgálat után állítsd vissza az 5 és 20 értékeket.

Válassz ki egy belépést

Keress egy teljesült belépést, és vizsgáld meg az előtte levő gyertyán a két átlagot. A felfelé keresztezésnek a jelzési gyertyán kell teljesülnie. A kötés árát a belépési gyertya nyitóárával hasonlítsd össze, ne automatikusan a jelzés záróárával.