Az első stratégia
A keresztezésjelzésekből belépési és kilépési szabályt készítesz a backtest számára.
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
Longazonosí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
- Mentsd el a teljes programot.
- Válaszd a Run Pyne code műveletet és a
demoadatot. - A grafikonon ellenőrizd a két SMA-vonalat és a kötésjelöléseket.
- Nyisd ki a grafikon alatti panelt, és válaszd a Trades fület.

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.