Probleme mit möglicherweise asynchronem Programmablauf

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lulu
User
Beiträge: 3
Registriert: Montag 5. August 2019, 20:33

Hey!

Ich versuche ein Script zu coden, das von externer Quelle in zufälligen Zeitabständen Crypto-Trading-Signale bekommt und entsprechend Orders setzt.

Sobald ein Signal übertragen wird (wird per Telegram ausgelesen oder vielleicht auch direkt von einem anderen Pythonscript), beginnt "meine Arbeit".

Grober Ablauf:

SCHLEIFE_1:
1) Prüfe, ob Signal. Sobald Signal -> starte JOB1

JOB_1:
1) Signal analysieren (z.B. Kaufe Bitcoin)
2) Lösche alle inaktiven Orders und schließe aktive Trades
3) Aktueller Preis der jeweiligen Börse wird ermittelt (z.B. 11500 USD)
4) Kauf-Orders werden gesetzt (sind Limit Orders, d.h. bei einer Kauf-Order unter dem aktuellen Preis; z.B. Order bei 11400, bei 11300 und bei 11200)
5) Starte SCHLEIFE_2

SCHLEIFE_2
1) Prüfe, ob Orders ausgelöst wurden. Wenn Orders ausgelöst -> setze Stop Loss und Take Profit etc.
(anschließend ist diese Schleife fertig und SCHLEIFE_1 sollte wieder als einzige Schleife laufen)

Soweit so gut. Nun möchte ich jedoch JOB_1 und auch SCHLEIFE_2 sofort abbrechen, wenn SCHLEIFE_1 ein neues Signal bekommt und sich dieses Signal vom aktuellen Signal unterscheidet. (z.B. aktuelles Signal "KAUF BITCOIN" und neues Signal kommt mit "VERKAUF BITCOIN").

Ich vermute, dass sowas nur mit asynchronem Coding funktioniert, oder? Oder hab ich irgendwo einen Denkfehler?

Ich hoffe, ihr versteht, worauf ich hinaus will und danke im Voraus für eure Hilfe :)
Zuletzt geändert von lulu am Montag 5. August 2019, 21:09, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke nicht, dass asynchron hier die Loesung ist. Da du nicht beschreibst, was in SCHLEIFE_2 ueberhaupt passiert ist, wuerde ich sagen: in der Hauptschleife pruefst du entweder, ob orders ausgeloest wurden. Oder ob ein Signal kommt. Und wenn das passiert, dann wickelst du mit Punkt zwei doch alle offenen Dinge ab.
lulu
User
Beiträge: 3
Registriert: Montag 5. August 2019, 20:33

Naja SCHLEIFE_2 prüft nur, ob die Orders auch ausgelöst wurden.
Wenn JA -> setze Stop Loss, Take Profit und kehre zu SCHLEIFE_1 zurück
Wenn NEIN -> prüfe solange bis Orders ausgelöst ODER neues Signal von SCHLEIFE_1

Die Krux an der Sache bzw. der Knoten in meinem Kopf ist ja, dass SCHLEIFE_1 immer Vorrang hat, aber solange von der nichts Neues kommt oder eben alle Orders ausgelöst wurden, soll alles weiterlaufen
Es soll auch JOB_1 abgebrochen werden, wenn ein neues Signal kommt
Macht das Sinn? :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Den abzubrechen bringt in dem Sinne nichts. Es gibt unteilbare Teilaufgaben, und du bekommst dein System nur unstabil, wenn du da irgendwas abbrichst. Denn deine Order plazierst du doch garantiert irgendwo online. Und wenn dein Request dort eingetruedelt ist, dann fuehrt der die durch, egal ob in der zwischenzeit der Job bei DIR zerstoert wurde. Es bringt also ueberhaupt nichts, das NICHT zuende zu machen.

Der einzigen Gewinn, den du durch nebenlaeufigkeit bekommst, besteht darin, dass du parallel zur Ausfuehrung irgendwelcher Orders schon erfaehrst, das du sie DANACH rueckgaengig machen willst. Ob das eine Rolle spielt kann ich nicht beuerteilen, vor allem, wenn danach ja noch die Cancel-Vorgaenge verarbeitet werden muessen.Da bekommst du dann auch wieder eine Verzoegerung rein, und in der Zwischeneit hat der halt die Order schon ausgefuehrt. Pech gehabt.

Das einzige was ich da sehe ist, dass du die einzelnen Aufgaben in Form von zB callables eintuetest, und in deiner Hauptschleife vor dem ausfuehren einer jeden Aufgabe erstmal auf das naechste Signal hoerst. Wenn da nix kommt, machst du genau ein Ding.

asncio und threading bringen da nur beschraenkt viel, auch da musst du explizit diese "breakpoints" realisieren. Das ist IMHO fehleranfaelliger, als einfach zu sagen "das hier ist ein Ding, das kann ich kleiner nicht machen". Und das dann im Wechsel mit den Pruefungen zu tun.
lulu
User
Beiträge: 3
Registriert: Montag 5. August 2019, 20:33

Wenn du es schreibst, macht es total Sinn! Mein persönliches Problem ist es leider, dass ich während dem Coden schon an zukünftige Code-Teile denke und so den aktuellen Teil nicht korrekt abschließe :)
Danke für die Hilfe :)
Antworten