Inhalte aufrufen

  • Über WindowsLive anmelden Log In with Google Anmelden
  • Mitglied werden
Profilbild

HistoryDeals: Aktualisierung erzwingen?

- - - - -

  • Du kannst leider keine neuen Themen eröffnen
  • Please log in to reply
8 Antworten zu diesem Thema

  #1
OFFLINE   CashDigger

Hallo,

wenn man mit OrderSend(request,result) eine Order schliesst und möchte dann direkt danach auf diesen HistoryDeal zugreifen um zB DEAL_PROFIT auszulesen, dann geht dies nicht, da der Deal in der History noch nicht gelistet ist. Es ist zu dem Zeitpunkt nur der Deal vom Typ DEAL_ENTRY_IN verfügbar aber nicht der von DEAL_ENTRY_OUT.

Das Problem umgehen kann man, indem man nach dem OrderSend() und vor dem Abrufen der Deals ein Sleep(100) einfügt. Erst dann ist DEAL_ENTRY_OUT bei den HistoryDeals verfügbar.
Das heißt also die History benötigt ein bisschen Zeit nach OrderSend() um aktuell zu sein.

Bei OrderSendAsync() wiederum wäre das Verhalten logisch allerdings bei OrderSend() wundert mich diese Tatsache.

Die Lösung mit Sleep funktioniert zwar im Test, finde ich aber überhaupt nicht gut. Niemand weiss ob das unter unterschiedlichen Bedingungen verlässlich funktioniert.

Daher die Frage, gibt es eine Möglichkeit die Aktualisierung der History/Deals programmiertechnisch anzustoßen ohne Sleep nutzen zu müssen?

Gruß



  #2
OFFLINE   Netsrac

Hallo CashDigger,

 

auch wenn das keine Antwort auf deine eigentliche Frage ist: Ich nutze für solche Dinge mittlerweile lieber globale Variablen oder alternativ Files. Ich habe in der Vergangenheit zu oft geflucht, wenn ich programmtechnisch in der History rumsuchen musste, um zum Beispiel Orderketten oder Baskets zu verwalten.

 

Grüße,

Carsten 


Hilfreiche Tools für den diskretionären Handel findest Du auf meiner MQL5-Seite


  #3
OFFLINE   -ixbone-

Globale Variablen sind immer gut, verwende sie selbst exzessiv, unter anderem erspare ich mir den File_Write Kram.

 

In diesem Fall, würde ich in eine Schleife gehen, aka via "NumberOfTries++", Sleep (100) sehe ich aber nicht als schlimm an und funktioniert meines Errachtens fehlerfrei, auch eine Kombi mit while(IsTradeContextBusy())Sleep(1000); setze ich des öfteren ein, auch ohne Probleme.



  #4
OFFLINE   CashDigger

@Carsten: genau das ist auch ein Ziel es persitent zu speichern aber zu allererst muss man an die Order(+seine Ergebnisse/Werte) kommen, dies geht erst nach dem Schließen und dann kommt man an obiges Problem.

 

@Ixbone: leider gibt es keine Migration von IsTradeContextBusy(MT4) zu MT5

Please Login or Register to see this Hidden Content

sonst hätte ich es damit mal probiert.

 

MT5 ist im Bezug auf die DEAL-Liste einfach unmittelbar nach OrderSend() nicht aktuell. Die DEAL-Liste wird wohl erst ein paar ms später aktualisiert.

Da OrderSend() daher irgendwie doch asyncron (wie es nur OrderSendAsync() sein sollte) ist, mache ich es vorläufig mal so:

 

Eine 500er Schleife die die Existenz von DEAL_ENTRY_OUT und DEAL_ENTRY_IN prüft (MN als ID).
Wenn false dann Sleep(10) und prüfe nochmal.
Wenn true alles gut und weiter.

Wenn Schleife zuende ohne Ergebniss (500x10 = 5 Sekunden) -> Fehlermeldung

 

So erspare ich mir unnötig lange Wartezeit sowie das Risiko, dass ein random-Wert zu kurz wäre.

 

Wer noch eine bessere Idee hat, immer her damit :yes:

 

Wieder gefühlt tausend Zeilen für eine primitive Abfrage, mq5 ist fast so schlimm wie die die Sprache Malbolge (aus dem achten Kreis der Hölle), vielleicht entstand mq5 sogar aus dem neunten Kreis der Hölle o_O ;D

 

 



  #5
OFFLINE   -ixbone-


Wieder gefühlt tausend Zeilen für eine primitive Abfrage, mq5 ist fast so schlimm wie die die Sprache Malbolge (aus dem achten Kreis der Hölle), vielleicht entstand mq5 sogar aus dem neunten Kreis der Hölle o_O ;D

 

100%, Ich sehe in C++ nur einen Vorteil: die Geschwindigkeit, da ist nur Assembler schneller :)

Und was die Aktualität anbelangt verliert C++ jährlich immer weiter an Nutzung.

 

Leider bieten nur wenige Broker API an und oft muss man IB oder White Label sein.



  #6
OFFLINE   traderdoc

Welche Hölle auch immer, die Lösung mit dem Sleep(x) finde ich nicht so tragisch. Und um abzusichern, dass die Sleep-Zeit auch ausreicht setze ich einfach

eine while-Schleife die läuft, bis der geschlossene Trade in der History auftaucht.

 

traderdoc


Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #7
OFFLINE   Netsrac

Eine Sache noch, die ich auch schon mal gemacht habe (kommt aber natürlich auf das an, was Du letztlich erreichen willst): Einfach mit jedem Tick den aktuellen Profit der laufenden Order abfragen und zwischenspeichern. Solange die Order aktiv ist, ändert sich dieser Wert natürlich immer. Ist die Order nicht mehr aktiv, kannst Du den Wert dann sofort abgreifen. Bin jetzt allerdings nicht sicher, ob der Wert exakt(!) dem entspricht, was du wirklich bekommen hast. Für mich war das damals nicht wichtig - mir ging es darum, ob der Trade im Verlust oder im Plus war.


Hilfreiche Tools für den diskretionären Handel findest Du auf meiner MQL5-Seite


  #8
OFFLINE   CashDigger

@Carsten: ja das wäre eine Variante, die Frage ist ob die Ausführung nicht dann doch zu einem leicht anderen Preis stattfindet. Man sieht nur in der History das entgültige Ergebnis und was der Broker tatsächlich getrieben hat. Ein Abgleich mit eigenen Daten ist dennoch immer gut (Thema VDP, Slippage etc).

 

@ixbone: man muss aber schon mq5 und c++ differenzieren, mq5 ist zwar an c++ angelehnt aber noch lang nicht so mächtig wie c++. Die Kompiler sind heute so derart gut, dass Assembler oft nicht mal schneller wird als eine C/C++ Kompilierung mit den richtigen flags.

 

@traderdoc: die while schleife hatte ich auch zuerst, sah dies allerdings als Risiko, dass man drin hängen bleibt wenn aus irgendwelchen Gründen der geschlossene Deal nicht auftauchen sollte. Daher lieber eine for-schleife mit begrenzter Versuchsanzahl, der EA kann so definitv nie hängen bleiben bei while ist das nicht 100% ausgeschlossen.

 

Man kann mit mq5 durchaus leben aber viele Sachen in mq5 sind einfach viel umständlicher als bei mq4. Das ist vielleicht der Preis für eine Multiparadigmen-Sprache wie man mq5 inzwischen schon bezeichnen kann.


Bearbeitet von CashDigger, 24 June 2019 - 15:42 Uhr,


  #9
OFFLINE   traderdoc



 

@traderdoc: die while schleife hatte ich auch zuerst, sah dies allerdings als Risiko, dass man drin hängen bleibt wenn aus irgendwelchen Gründen der geschlossene Deal nicht auftauchen sollte. Daher lieber eine for-schleife mit begrenzter Versuchsanzahl, der EA kann so definitv nie hängen bleiben bei while ist das nicht 100% ausgeschlossen.

 

Hängenbleiben? Na irgendwann wird sie schon mal auftauchen. Zur Not springt man nach einer "längeren " Zeit raus und versucht es beim nächsten Tick nochmal.

Da gibt es doch zig Möglichkeiten. Also ich sehe das nicht als Problem und schon gar nicht als das des MQL5.

 

traderdoc


Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.





0 Benutzer lesen gerade dieses Thema

0 Mitglieder, 0 Gäste, 0 anonyme Nutzer