A kód lehet szabályos, miközben más eredményt számol, mint amit szeretnél. A debuggerrel megállíthatod a futást, megnézheted a változókat, és egyenként követheted az utasításokat.

Ebben a fejezetben a záróár és az ötös mozgóátlag távolságát vizsgálod. Előbb megjósolod az eredményt, majd megnézed, mit számított a program.

Háromféle hiba

A szintaktikai hiba a kód írási szabályát sérti. Ilyen egy hiányzó kettőspont vagy hibás behúzás. A szerkesztő ezt gyakran már gépeléskor jelzi.

A futási hiba a program végrehajtásakor jelentkezik. Például egy tömbből olyan indexet olvasol, amelyhez nincs elem. Ilyenkor a futás hibaüzenettel megállhat.

A logikai hiba mellett a program lefuthat. Ha close - average helyett average - close szerepel a kódban, az eredmény előjele megfordul. A nyelvi szabályok ezt nem tiltják, ezért neked kell összevetned az eredményt a feladattal.

A Visual Studio Code View → Problems nézetében a szerkesztő által jelzett problémákat találod. Kattints egy sorra, hogy a hibás helyre ugorj. A részletes hibaüzenetet olvasd el, mielőtt több sor átírásába kezdesz.

Egy vizsgálható program

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

"""
@pyne edge
"""
from pynecore import Series
from pynecore.lib import bar_index, close, color, log, plot, script, ta


@script.indicator("Average Distance", overlay=False)
def main():
    average: Series[float] = ta.sma(close, 5)
    gap = close - average
    if bar_index == 10:
        log.info("close={0}, average={1}, gap={2}", close, average, gap)
    plot(gap, "Distance", color=color.blue)

A bar_index az éppen feldolgozott gyertya sorszáma, nulláról indul. A 10-es index a tizenegyedik gyertya. A naplóhívás ezért csak egyszer ír ebben a történelmi futásban.

A log.info formázott üzenetet készít. A {0}, {1} és {2} helyére a mögöttük megadott három érték kerül, ebben a sorrendben. A számozott helyeket tartalmazó szöveget a naplózó dolgozza fel.

Futtasd a programot egyszer a Run Pyne code művelettel. A vonalnak akkor kell pozitívnak lennie, amikor a záróár az átlag fölött van. Az első négy gyertyán az átlag és a távolság is hiányzik.

Megállás egy adott sor előtt

  1. Kattints a sorszám bal oldalára a plot(gap, ...) sor mellett. Megjelenik a töréspont jele.
  2. A kód fölött kattints a Debug műveletre.
  3. Ha adatválasztás jelenik meg, válaszd a demo sort.
  4. A program a töréspontnál megáll. Nyisd meg a Run and Debug nézetet.

A töréspont egy olyan hely, ahol a debugger megállítja a programot. A kijelölt sor még nem futott le. A sor előtti értékadások eredményét már megnézheted.

Az első megállás az első gyertyán lehet. Ott a gap hiányzó érték, mert nincs teljes ötgyertyás ablak. A debugger ezt a helyzetet mutatja; a hiány önmagában nem programhiba.

Juss el egy bemelegedett gyertyához

A hibakeresés közben megjelenő lebegő eszköztáron a PyneIDE Next Bar gombja a következő gyertyára lép. Az ikonok nevét az egérmutatót föléjük tartva olvashatod el. Keresd meg a Run to Bar… gombot, kattints rá, majd a megjelenő mezőbe írj 10-et, és nyomd meg az Enter billentyűt.

A tizenegyedik gyertyán már van teljes ötös átlagablak. A Variables listában keresd az average és a gap változót. A Pyne csoportban a feldolgozott gyertya adatait, köztük a bar_index és close értékét ellenőrizheted.

A debug_average.py töréspontnál áll a PyneIDE-ben, a Run and Debug nézetben láthatók a változók és a Pyne gyertyaadatai.
A debugger megállított futásában egyszerre vizsgálható a gyertya és a saját változók értéke.

Az average Series változó, ezért a program kódjában az average[1] kifejezéssel az előző értékét is használhatod. Az előző gyertya átlaga nem szükségképpen azonos a mostani átlaggal, mert az ablak egy gyertyával tovább mozdult.

Figyelt kifejezések

A Watch részben hozzáadhatsz olyan kifejezést, amelyet minden megálláskor látni szeretnél. Próbáld ki:

close
close[1]
average
close - average

A close[1] a megállított gyertyához képest korábbi záróár. Az average a saját változód. A close - average eredményének egyeznie kell a már kiszámított gap értékével.

Változókat és egyszerű számításokat figyelj. A Watch mezőbe ne tegyél ta.sma hívást, megbízást küldő műveletet vagy tömböt módosító hívást. A hibakeresési ellenőrzés ne változtassa meg a program állapotát.

Soronként és gyertyánként

A Step Over a következő utasításig lép anélkül, hogy egy meghívott függvény részleteibe bemennél. A Step Into beléphet a saját függvényedbe. A Continue a következő megállásig folytatja a futást, a Disconnect megszakítja a hibakereső kapcsolatot, és befejezi a hibakeresést.

A Next Bar más lépték: egy következő gyertyára visz. A soronkénti léptetés egyetlen gyertya számítását mutatja részletesen, a gyertyánkénti pedig azt, hogyan változik az eredmény időben.

A megállított gyertya feldolgozása még nem fejeződött be, ezért a grafikon a korábban elkészült állapotot mutathatja. A mostani gyertya indexét és adatait a Pyne csoportban ellenőrizd.

Mielőtt leolvasol egy változót, nézd meg a kijelölt sort. Ha az értékadás még előtted áll, a változó még nem a most várt eredményt tartalmazza.

Egy előjelhiba megtalálása

Állítsd le a debuggert. Írd át ezt a sort:

gap = average - close

Most indítsd újra a hibakeresést, és menj ugyanahhoz a gyertyához. Ha az ár az átlag fölött van, a gap negatív lesz, miközben a feladat pozitív távolságot kért.

A Watch mezőben a close - average továbbra is az eredeti, kívánt irányt mutatja. A két érték összevetése azonnal megmutatja az eltérést. Állítsd vissza a helyes kivonást, és ellenőrizd még egyszer ugyanazt a gyertyát.

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

Adj a programhoz egy previous_close = close[1] változót, és vizsgáld meg a debuggerben. A 10-es gyertyaindexnél melyik indexű gyertya záróárát kell tartalmaznia? Mi az értéke a legelső gyertyán?

A feladat megoldása
previous_close = close[1]

A 10-es gyertyán a 9-es gyertya záróárát adja. A legelső, 0 indexű gyertyán hiányzik, mert az adatfájlban nincs korábbi gyertya.

A sort a töréspont elé írd, hogy megálláskor már lefusson. A vizsgálat után a segédváltozót és a csak ellenőrzésre használt naplósort elhagyhatod a programból.

Egy jó hibaleírás

Ha segítséget kérsz, add meg a fájlt, a használt adatot, a tényleges inputokat és a vizsgált gyertya időpontját. Írd le a várt és a kapott értéket is. A „nem jó a vonal” helyett például: „ennél a gyertyánál a záróár 101, az átlag 100, de a távolság −1 lett”. Ebből a számítás ellenőrizhető.