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
Sorry, ich kann kein Russisch sprechen. Ich benutze Google Übersetzer.
Vor ein paar Tagen habe ich diese sehr interessante Bibliothek gefunden. Aber ich habe ein Problem: Ich sende eine Marktorder über OrderSend () und speichere das von OrderSend () zurückgegebene Ticket. Nach einiger Zeit werden Stop-Losses erreicht oder Gewinne erzielt. Dann versuche ich, eine Order über OrderSelect(ticket, SELECT_BY_TICKET) mit diesem Ticket auszuwählen. In MQL4 wird der Auftrag in der Historie gefunden. Aber wenn ich diese Bibliothek mit MQL5 verwende, schlägt OrderSelect fehl.
Ich habe ein wenig im Code von MT4orders.mqh nachgesehen. MT4ORDERS::SelectByTicket () ruft SelectByExistingTicket() auf, was fehlschlägt, und dann SelectByHistoryTicket(), von dem ich erwarte, dass es erfolgreich ist. In SelectByHistoryTicket() gibt HistoryDealSelect() in der Regel false zurück (außer vielleicht in einem Test), weil das Ticket eine Positionskennung und kein Transaktions-Ticket ist. ::HistoryOrderSelect () gibt true zurück, weil das Ticket dasselbe ist wie das In-Order-Ticket (und der Positionsbezeichner) (ich verwende MT5 im Hedge-Modus). Aber MT4HISTORY::IsMT4Order(Ticket) gibt false zurück. Ich erwarte, dass sie true zurückgibt. Die Funktion gibt true zurück, wenn die Positionskennung null ist. Aber ich sehe, dass sowohl im Test als auch in der tatsächlichen Rechnung die Positions-ID nicht Null ist und dem Order-Bit in der Bestellung entspricht.
Jede Hilfe ist willkommen.
Ich habe diese sehr interessante Bibliothek vor ein paar Tagen gefunden. Aber ich habe ein Problem: Ich sende eine Marktorder über OrderSend () und speichere das von OrderSend () zurückgegebene Ticket. Nach einiger Zeit werden Stop-Losses erreicht oder Gewinne erzielt. Dann versuche ich, eine Order über OrderSelect(ticket, SELECT_BY_TICKET) mit diesem Ticket auszuwählen. In MQL4 wird der Auftrag in der Historie gefunden. Aber wenn ich diese Bibliothek mit MQL5 verwende, schlägt OrderSelect fehl.
Das ist korrekt. Die Details sind hier beschrieben.
Sie können PositionTicket = OrderSend(OP_BUY, 2 lots) und OrderClose(0.2 lots) + OrderClose(0.3 lots) machen. Dann erhalten Sie zwei geschlossene "Positionen" (0,2/0,3 Lots) und eine offene Position (1,5 Lots) mit einem Ticket, das dem PositionTicket entspricht. Dies ist eine Besonderheit von MT5. Daher ist es falsch, eine Position über ihre POSITION_ID in der Trading History im Modus SELECT_BY_TICKET+MODE_HISTORY auszuwählen.
Das Merken von Tickets ist ein schlechter Stil, auch wenn er beliebt ist. Der richtige Weg ist, wenn der Handelsroboter bei jedem Ereignis die gesamte Umgebung von Grund auf neu liest.
ZY Hier sehen Sie ungefähr die gleiche Situation wie oben beschrieben.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Bibliotheken: MT4Orders
fxsaber, 2018.04.14 09:10 AM
Beispiel .
Ergebnis
Die Ergebnisse zeigen, dass eine Position mit Ticket == 2 eröffnet wurde. Sie wurde dann zweimal geschlossen, wodurch zwei geschlossene "Positionen" in der Trading History entstanden. Ihre Tickets sind unterschiedlich, aber beide "Positionen" haben OrderTicketOpen == 2. D.h. Sie sollten sich darüber im Klaren sein, dass, wenn Sie eine Position in MT5 schließen, ihr historisches Ticket nicht mit dem Echtzeit-Ticket übereinstimmt.
Beachten Sie, dass im MT5 sogar die Kommentare beim Schließen der gleichen Echtzeitposition unterschiedlich sind:"Hello World!" und"tp 1.23614".
Sorry, ich kann kein Russisch sprechen. Ich benutze Google Übersetzer.
Vor ein paar Tagen habe ich diese sehr interessante Bibliothek gefunden. Aber ich habe ein Problem: Ich sende eine Marktorder über OrderSend () und speichere das von OrderSend () zurückgegebene Ticket. Nach einiger Zeit werden Stop-Losses erreicht oder Gewinne erzielt. Dann versuche ich, eine Order über OrderSelect(ticket, SELECT_BY_TICKET) mit diesem Ticket auszuwählen. In MQL4 wird der Auftrag in der Historie gefunden. Aber wenn ich diese Bibliothek mit MQL5 verwende, schlägt OrderSelect fehl.
Ich habe ein wenig im Code von MT4orders.mqh nachgesehen. MT4ORDERS::SelectByTicket () ruft SelectByExistingTicket() auf, was fehlschlägt, und dann SelectByHistoryTicket(), von dem ich erwarte, dass es erfolgreich ist. In SelectByHistoryTicket() gibt HistoryDealSelect() in der Regel false zurück (außer vielleicht in einem Test), weil das Ticket eine Positionskennung und kein Transaktions-Ticket ist. ::HistoryOrderSelect () gibt true zurück, weil das Ticket dasselbe ist wie das In-Order-Ticket (und der Positionsbezeichner) (ich verwende MT5 im Hedge-Modus). Aber MT4HISTORY::IsMT4Order(Ticket) gibt false zurück. Ich erwarte, dass sie true zurückgibt. Die Funktion gibt true zurück, wenn die Positionskennung null ist. Aber ich sehe, dass sowohl im Test als auch in der tatsächlichen Rechnung die Positions-ID nicht Null ist und dem Auftragsbit im Auftrag entspricht.
Jede Hilfe ist willkommen.
Um Ihre maschinelle Übersetzung vollständig zu verstehen, fügen Sie bitte den Text auf Englisch bei.
Ich habe diese sehr interessante Bibliothek vor einigen Tagen gefunden. Aber ich habe ein Problem: Ich sende eine Marktorder über OrderSend() und speichere das von OrderSend() zurückgegebene Ticket. Nach einiger Zeit wird der Stop Loss oder Take Profit erreicht. Dann versuche ich, die Order über
OrderSelect(ticket, SELECT_BY_TICKET) mit diesem Ticket auszuwählen. In MQL4 würde der Auftrag in der Historie gefunden werden. Aber wenn ich diese Bibliothek mit MQL5 verwende, ist OrderSelect nicht erfolgreich.
Ich habe ein wenig in den Code von MT4orders.mqh geschaut. MT4ORDERS::SelectByTicket() ruft SelectByExistingTicket() auf, das fehlschlägt, und dann SelectByHistoryTicket(), von dem ich erwarten würde, dass es erfolgreich ist. In SelectByHistoryTicket() gibt die Funktion HistoryDealSelect() in der Regel false zurück (außer vielleicht im Tester), weil das Ticket die Positionskennung und nicht das Geschäftsticket ist. ::HistoryOrderSelect() gibt true zurück, weil das Ticket dasselbe ist wie das Ticket der In-Order (und die Positionskennung)(ich verwende MT5 im Hedging-Modus). Aber MT4HISTORY::IsMT4Order(Ticket) gibt false zurück. Ich würde erwarten, dass sie true zurückgibt. Die Funktion würde true zurückgeben, wenn der Positionsbezeichner Null wäre. Aber ich sehe, dass sowohl im Tester als auch in einem echten Konto die Positionskennung nicht Null ist - und gleich dem Orderticket der In-Order.
Mit anderen Worten: Ich verstehe nicht, warum in der Funktion MT4HISTORY::IsMT4Order() der folgende Code steht (gibt true zurück, wenn die Positionskennung null ist):
Im Folgenden füge ich meinen Testcode an:
PrintChangesOfMQL5OrderSystemState() ist eine einfache Funktion, die den Zustand des MQL5-Auftragssystems jedes Mal ausgibt, wenn eine Änderung festgestellt wurde.
Hier ist die Ausgabe des Testcodes (auf dem Testgerät ausgeführt):
Sie können sehen, dass HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 2 und nicht Null zurückgibt. Dies ist der Grund, warum MT4HISTORY::IsMT4Order() false zurückgibt.
Für jede Hilfe bin ich dankbar.Mit anderen Worten: Ich verstehe nicht, warum in der Funktion MT4HISTORY::IsMT4Order() der folgende Code steht (gibt true zurück, wenn die Positions-ID Null ist):
Im Folgenden füge ich meinen Testcode an:
PrintChangesOfMQL5OrderSystemState() ist eine einfache Funktion, die den Status des MQL5-Ordersystems jedes Mal ausgibt, wenn eine Änderung festgestellt wurde.
Hier ist die Ausgabe des Testcodes (ausgeführt auf dem Testgerät):
Sie können sehen, dass HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 2 und nicht Null zurückgibt. Das ist der Grund, warum MT4HISTORY::IsMT4Order() false zurückgibt.
Sie wissen nicht, dass ein Auftrag in MT5 und MT4 unterschiedliche Einheiten sind.
Ihre Frage wurde bereits oben beantwortet.
Sie verstehen nicht, dass ein Auftrag in MT5 und in MT4 unterschiedliche Einheiten sind.
Ich verstehe die Auftragssysteme von MQL5 und MQL4 und ihre Unterschiede.
Daher ist es falsch, eine Position nach ihrer POSITION_ID in der Trading History im Modus SELECT_BY_TICKET+MODE_HISTORY auszuwählen.
Ja, ich weiß, dass die MQL5-Funktion HistoryOrderSelect() ein Ticket und nicht eine Positionskennung erwartet.
Aber mein Testcode ist gültiger MQL4-Code (mit Ausnahme der Aufrufe der MQL5-Funktionen HistoryOrderSelect() und HistoryDealSelect()))
und in MQL4 gibt die Funktion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) wie erwartet true zurück.
Soweit ich weiß, ist der Zweck der Bibliothek, das MQL4-Bestellsystem so gut wie möglich auf MQL5 zu emulieren. Ich würde also erwarten, dass mit
der Bibliothek die Funktion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) auch true zurückgibt.
Ich habe mir den Code angesehen und versucht herauszufinden, warum er falsch zurückgibt.
Erstens: Da ich mit einem MQL5-Hedging-System arbeite, ist die Funktion
ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);
weist der Variablen 'ticket' das Orderticket zu, das der (zukünftigen) Positionskennung in MQL5 hedge entspricht. Dies ist im Code zu sehen
der Funktion MT4OrderSend(). Es wird Folgendes zurückgegeben:
Wenn ich analysiere, was die Bibliothek beim Ausführen des Codes macht
sehe ich, dass die Funktion SelectByHistoryTicket() mit dem Ticket ausgeführt wird, das ich in der Variablen 'ticket' gespeichert habe.
In dieser Funktion wird die Funktion HistoryOrderSelect(ticket) aufgerufen - mit dem Ticket, das gleich dem Orderticket und der Positionskennung ist.
Bei meinem MQL4 OrderSelect()-Aufruf rufe ich HistoryOrderSelect(ticket) nicht selbst auf - es steht in der Bibliothek.
Nur in meinem Testcode rufe ich HistoryOrderSelect(ticket) und HistoryDealSelect(ticket) direkt auf, um zu sehen, was innerhalb der Bibliothek passiert:
Um es kurz zu machen: Laut dem Rückgabewert von OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) emuliert die Bibliothek nicht das
MQL4-Bestellsystem auf MQL5 nicht korrekt.
MQL4 die Funktion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) gibt wie erwartet true zurück.
Soweit ich weiß, ist der Zweck der Bibliothek, das MQL4-Bestellsystem so gut wie möglich auf MQL5 zu emulieren. Ich würde also erwarten, dass mit
der Bibliothek die Funktion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) auch true zurückgibt.
Ich habe mir den Code angesehen und versucht herauszufinden, warum er falsch zurückgibt.
Sie liegen falsch. Führen Sie diesen Expert Advisor im Tester aus
Ergebnis
Ja, ich weiß, dass true zurückgegeben wird, wenn OrderSelect() direkt nach der Eröffnung der Position aufgerufen wird .
In diesem Fall haben wir eine offene MQL5-Position und die Bibliothek findet die Position beim Aufruf von OrderSelect().
Dies geschieht in der internen Funktion SelectByExistingTicket() der Bibliothek.
Aber der springende Punkt ist, dass OrderSelect(ticket) false zurückgibt, wenn die MQL5-Position durch Stop Loss oder Take Profit geschlossen wird.
Bitte führen Sie meinen Testcode aus, um dies zu überprüfen (wenn Ihr Broker so enge SL und TP nicht akzeptiert, machen Sie sie bitte breiter, um eine Ablehnung der OrderSend() zu vermeiden).
Aber der entscheidende Punkt ist, dass OrderSelect(ticket) false zurückgibt, wenn die MQL5-Position durch Stop Loss oder Take Profit geschlossen wird.
Lesen Sie noch einmal einen Teil meiner ausführlichen Antwort
Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien.
Bibliotheken: MT4Orders
fxsaber, 2018.08.06 14:21
Das ist korrekt. Die Details sind hier beschrieben.
Du kannst PositionTicket = OrderSend(OP_BUY, 2 lots) und OrderClose(0.2 lots) + OrderClose(0.3 lots) machen. Dann erhalten Sie zwei geschlossene "Positionen" (0,2/0,3 Lots) und eine offene Position (1,5 Lots) mit einem Ticket, das dem PositionTicket entspricht. Dies ist eine Besonderheit von MT5. Daher ist es falsch, eine Position über ihre POSITION_ID in der Trading History im Modus SELECT_BY_TICKET+MODE_HISTORY auszuwählen.
Das Merken von Tickets ist ein schlechter Stil, auch wenn er beliebt ist. Der richtige Weg ist, wenn der Handelsroboter bei jedem Ereignis die gesamte Umgebung von Grund auf neu liest.
ZY Hier sehen Sie ungefähr die gleiche Situation wie oben beschrieben
Die Ergebnisse zeigen, dass eine Position mit Ticket == 2 eröffnet wurde. Dann wurde sie zweimal geschlossen, wodurch zwei geschlossene "Positionen" in der Trading History entstanden. Ihre Tickets sind unterschiedlich, aber beide "Positionen" haben OrderTicketOpen == 2. D.h. Sie sollten sich darüber im Klaren sein, dass , wenn Sie eine Position im MT5 schließen, ihr historisches Ticket nicht mit dem Echtzeit-Ticket übereinstimmt.
Beachten Sie, dass im MT5 sogar die Kommentare beim Schließen der gleichen Echtzeitposition unterschiedlich sind:"Hello World!" und"tp 1.23614".
Es ist nicht möglich, eine geschlossene MT4-Position im MT5 eindeutig über die POSITION_ID auszuwählen, da es mehrere MT4-Positionen mit der gleichen POSITION_ID zur gleichen Zeit geben kann.
Wer die Datei mql4_to_mql5.mqh von MT4Orders für die MT4 -> MT5 Konvertierung verwendet, möge bitte dieses Stück Code daraus entfernen.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Testen von 'CopyTicks'
fxsaber, 2016.10.19 07:59
// Es werden auch die üblichen MT4-Funktionen eingestellt: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T) \
class CLASS##NAME \
{ \
public: \
static T Get( const string Symb, const int TimeFrame, const int iShift ) \
{ \
T tValue[]; \
\
return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
} \
\
T operator []( const int iPos ) const \
{ \
return(CLASS##NAME::Get(_Symbol, _Period, iPos)); \
} \
}; \
\
CLASS##NAME NAME; \
\
T i##NAME( const string Symb, const int TimeFrame, const int iShift ) \
{ \
return(CLASS##NAME::Get(Symb, TimeFrame, iShift)); \
}
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
offiziell mit MT5 buiild 1860 ist dieses Codestück nicht relevant.