Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Karputov Vladimir Und vereinfachen Sie OnTradeTransaction()- erwägen Sie nur das Hinzufügen eines Handels zur Historie - keine Aufträge
Sie werden es schaffen, machen Sie sich nicht die Mühe, es zu schreiben (verschwenden Sie nicht Ihre Zeit).
Ich habe angefangen, mich damit zu befassen, weil das echte Programm abgestürzt ist.
Es sieht so aus, als hätten sie den Server über das Wochenende aufgerüstet. Millisekunden wurden angezeigt. Es könnte noch mehr Überraschungen geben.
Offenbar funktioniert die FunktionOnTradeTransaction unabhängig vom Transaktionsprotokoll.
Ich denke, dass dieses Verhalten der Funktion vernünftig ist - es besteht keine Notwendigkeit, den Fluss der Operationen zu verlangsamen und zu warten, bis das Protokoll geschrieben und alles berechnet ist.
In Ihrem Fall ist es wahrscheinlich besser,OnTrade zu verwenden,
oder warten Sie und prüfen Sie regelmäßig mit einer minimalen Unterbrechung, wann das Geschäft in der Historie erscheint.
Sieht so aus, als hätten sie den Server am Wochenende aufgerüstet. Millisekunden erschienen. Es könnte noch mehr Überraschungen geben.
Offenbar funktioniert die FunktionOnTradeTransaction unabhängig vom Betriebsprotokoll.
Ich denke, dieses Verhalten der Funktion ist gerechtfertigt - es besteht keine Notwendigkeit, den Arbeitsablauf zu verlangsamen und zu warten, bis alles im Journal registriert und gezählt ist.
In Ihrem Fall ist es wahrscheinlich besser,OnTrade zu verwenden,
oder warten Sie und überprüfen Sie regelmäßig mit einer minimalen Unterbrechung, wann das Geschäft in der Historie erscheint.
Hallo Sergej!
Ja, das haben wir, aber nicht am Wochenende, sondern am Donnerstag nach der Abendsitzung (ich habe meinen Broker gefragt).
Ich kann nicht das Trade()-Ereignis verwenden und warten, bis die Daten im Terminal aktualisiert werden.
Der Expert Advisor wurde vor langer Zeit geschrieben und funktionierte bis vor kurzem "wie ein Uhrwerk" (vielleicht hatte ich Glück und das EreignisTRADE_TRANSACTION_DEAL_ADD warimmer das erste, das eintraf).
Für den Expert Advisor ist es wichtig, einen reziproken Handel so schnell wie möglich auszuführen, deshalb der asynchrone Modus und OnTradeTransaction().
Jetzt sendet der Expert Advisor (manchmal) doppelte Aufträge zum Öffnen und Schließen von Positionen.
Sie: "Ich denke, dass dieses Verhalten der Funktion gerechtfertigt ist. Es gibt keinen Grund, den Fluss der Operationen zu verlangsamen und darauf zu warten, dass alles in das Journal geschrieben und gezählt wird".
Wie auch immer, alles wird geschrieben und gezählt, nachdemTRADE_TRANSACTION_DEAL_ADD eingetroffen ist:)
Das Problem ist, dassTRADE_TRANSACTION_DEAL_ADD verloren gehen kann undTRADE_TRANSACTION_HISTORY_ADD kommen kann und das Terminal dann veraltete Positionsdaten hat.:(,
was tatsächlich geschieht.
Es ist seltsam, dass die Entwickler nicht daran gedacht haben.
TRADE_TRANSACTION_HISTORY_ADD kommt nur, wenn der Auftrag ausgeführt oder gelöscht (storniert) wurde, daher
wenn sich der Auftragsstatus ändert (bzw. die Position ändern kann), sollte das Terminal die Information über die Positionsänderung erhalten,
auch wennTRADE_TRANSACTION_DEAL_ADD verloren geht
Mal sehen, was die Entwickler zu sagen haben.
Karputov Vladimir Und vereinfachen Sie OnTradeTransaction() - erwägen Sie nur das Hinzufügen eines Handels zur Historie - keine Aufträge
Sie werden es schaffen, machen Sie sich nicht die Mühe, es zu schreiben (verschwenden Sie nicht Ihre Zeit).
Bitte fordern Sie die "Lehrer" und "Besserwisser" auf, sich zum Thema zu äußern,
und nicht nur, um ihren Fuß an den Pfosten zu setzen, um ein Zeichen zu setzen.
Bevor Sie sich bei Menschen, die Ihnen helfen wollen, outen, sollten Sie Ihre Frage normal formulieren. Was hat das asynchrone Senden eines Auftrags damit zu tun, wenn ein teilweiser Abschluss durch die Funktion OrderSend() durchgeführt wird? Worüber stellen Sie Fragen?
Großartig!
Ist das als Hilfe zu verstehen?
Und Karputov hat nichts damit zu tun, es ist nur so, dass er, als ich meinen Beitrag geschrieben habe, seinen bereits gepostet hatte und ich ihn nicht gesehen habe.
Ursprünglich war die Frage wie folgt formuliert (falls Sie zu faul sind, sie zu lesen)
Wie kann man eine Protokollierung erstellen, um Entwicklern den Fehler anzuzeigen?
Ich habe es selbst getan, und die Protokolle zeigen deutlich, dass
nachTRADE_TRANSACTION_HISTORY_ADD (vorTRADE_TRANSACTION_DEAL_ADD)
aktualisiert das Terminal die Positionsdaten nicht.
prostotrader, Dimitri sagt Ihnen richtig, dass partielle (und vollständige) Closures in Ihrem Code nicht asynchron, sondern synchron sind... was bedeutet, dass das Programm auf eine Antwort des Servers wartet...
Es ist wahrscheinlich, dass OnTradeTransaction schneller ausgelöst wird, als sich die Position selbst ändert.
Dann hier:
Sie könnten versuchen, die Positionsprüfung in einer Schleife durchzuführen. Vielleicht wird es helfen....
Es ist in etwa so:
Ohne den genauen Algorithmus zu kennen(DAS brauchen Sie von dem Programm), ist es schwer, die Korrektheit der Implementierung zu beurteilen...
Vollständig auf asynchronen Modus umgestellt
Aber es hat sich nichts geändert
Es war offensichtlich, aber "um der Reinheit willen" des Experiments ...
Volle Protokolle im Keller
1. >Ohne den genauen Algorithmus zu kennen (DAS, was Sie von dem Programm brauchen), ist es schwer zu beurteilen, ob er korrekt implementiert ist...
Ich dachte, es sei nicht schwer zu verstehen, was das Programm macht, aber wenn es nicht klar ist, dann
Ein Expert Advisor eröffnet eine Position im FORTS-Markt mit einem Volumen von 2 Kontrakten; wenn die Position eröffnet wird, wird sie teilweise mit einem Volumen von 1 Kontrakt geschlossen,
dann wird die Position vollständig geschlossen. Wiederholen Sie diesen Vorgang, bis der Zähler tr_cnt<50 ist.
2. Sie können PositionSelect() eine Million Mal "ausführen" - es wird sich nichts ändern, weil
Das EreignisTRADE_TRANSACTION_DEAL_ADD wird erstempfangen, wenn Sie sich in der Schleife befinden, und daher wird das Terminal nicht aktualisiert
Positionsdaten
...
Wie ich bereits sagte, sollten Sie sich nicht von Aufträgen hinreißen lassen, sondern sich die Transaktionen ansehen. Hier ist ein kurzer Code, der anzeigt, WANN sich das Positionsvolumen ändert und um welche Art von Transaktion es sich handelt:
Und hier sind die Drucke, bei teilweisem Abschluss:
Sie sehen deutlich, dass, sobald ein Ereignis mit der GeschäftsartTRADE_TRANSACTION_DEAL_ADD eingetreten ist, die Bestandsdaten im Terminal aktualisiert werden.