Bibliotheken: MT4Orders - Seite 55

 
fxsaber:

MT4Orders ist in MT5 wie MT4 aufgebaut. Daher ist das Verhalten von OrderSend dasselbe wie bei seinem MT4-Gegenstück.

Ja, dieser Teil funktioniert und das Pending-Order-Ticket geht zum Positionsticket und alles wird geändert, aber es funktioniert nicht immer. Wenn eine Position geschlossen wird, erscheint ein Deal für SL- oder TP-Aufträge, und die Prüfung auf dem Ticket für den Zeitpunkt des Schließens eines Marktauftrags funktioniert nicht.

Ich habe mir den Kopf zerbrochen. Schließen durch SL. Im Tester, wenn das Orderticket 3 ist, stimmt es mit dem Transaktionsticket überein und der letzte Selektor ist normal. Wenn 2, ist die Auswahl Fehler 4754. Auf real/Demo immer nicht übereinstimmen.

Лог
2020.10.22 16:46:14.665 Trades  '25610628': accepted modify #745859775 sell 1 EURUSD sl: 1.18258, tp: 1.18197 -> sl: 1.18254, tp: 1.18194
2020.10.22 16:46:14.672 Trades  '25610628': modify #745859775 sell 1 EURUSD -> sl: 1.18254, tp: 1.18194 done in 129.694 ms
2020.10.22 16:48:06.783 Trades  '25610628': deal #725926213 buy 1 EURUSD at 1.18254 done (based on order #745887632)

// Prüfung auf Positionsschließung
if(OrderSelect(Tickets, SELECT_BY_TICKET)==true) // Beim Schließen durch SL und Rückgabe des Fehlers 4754.
        {
         if(OrderCloseTime()==0)              //Was ist zuersetzen, woher weiß man, dass die Position nicht in der Geschichte ist
           {
            ModifyTral();
            return;
           }
         if(OrderCloseTime()!=0)              // Und dann ersetzen Sie es, um festzustellen, dass die Position in die Geschichte eingegangen ist
           {
            End=true;
            Alert("Unser Marktauftrag ist abgeschlossen. Die Arbeit des Beraters ist abgeschlossen.",
                  "Swap = ", OrderSwap(), "Kommission = ", OrderCommission()); // эта часть работает в тестере)))
            return;
           }
        }

Тикет ордера позиции не 3
LO      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:17   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 2 Or 0
ON      0       19:16:54.104    Trade   2018.07.02 00:10:19   stop loss triggered #2  buy 1 EURUSD 1.16771 sl: 1.16719 tp: 1.17241 [#4  sell 1 EURUSD at 1.16719]
LQ      0       19:16:54.104    Trades  2018.07.02 00:10:19   deal #3  sell 1 EURUSD at 1.16719 done (based on order #4)
 HN      0       19:16:54.104    Trade   2018.07.02 00:10:19   deal performed [#3  sell 1 EURUSD at 1.16719]
RI      0       19:16:54.104    Trade   2018.07.02 00:10:19   order performed sell 1 at 1.16719 [#4  sell 1 EURUSD at 1.16719]
FJ      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 2 Or 0
FI      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: OrderSelect() нашего рыночного ордера вернул ошибку - 4754
IQ      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: Или Наш рыночный ордер закрылся. время закрытия 1970.01.01 00:00:00 Tickets 2 Своп = 0.0 Комиссия = 0.0
KN      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:21   Alert: Работа эксперта завершена. Прибыль/убыток = 0.0



Тикет ордера-позиции 3
PF      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:36   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 3 Or 1
KH      0       19:21:30.198    Trade   2018.07.02 00:44:37   stop loss triggered #3  sell 1 EURUSD 1.16740 sl: 1.16800 tp: 1.16277 [#4  buy 1 EURUSD at 1.16800]
DN      0       19:21:30.198    Trades  2018.07.02 00:44:37   deal #3  buy 1 EURUSD at 1.16802 done (based on order #4)
 LJ      0       19:21:30.198    Trade   2018.07.02 00:44:37   deal performed [#3  buy 1 EURUSD at 1.16802]
EF      0       19:21:30.198    Trade   2018.07.02 00:44:37   order performed buy 1 at 1.16802 [#4  buy 1 EURUSD at 1.16800]
CL      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 3 Or 1
QJ      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Наш рыночный ордер закрылся. время закрытия 2018.07.02 00:44:37 Tickets 3 Своп = 0.0 Комиссия = 0.0
NE      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Работа эксперта завершена. Прибыль/убыток = -62.0

//Dumme Lösung, versteht sich.

if(OrderSelect(Tickets, SELECT_BY_TICKET)==true)
        {
         if(OrderCloseTime()==0)              // Wenn unser Marktauftrag nicht geschlossen wird
           {
            ModifyTral();
            return;
           }
         if(OrderCloseTime()!=0)              // Wenn unser Marktauftrag geschlossen wurde
           {
            End=true;
            Alert("Unsere Marktbestellung ist abgeschlossen. Feierabend.",OrderCloseTime(),"Tickets ",Tickets,
                  "Swap = ", OrderSwap(), "Kommission = ", OrderCommission());
            return;
           }
        }
      else
      {
            
         Alert("OrderSelect() unserer Marktorder hat einen Fehler zurückgegeben - ",GetLastError());
         
         End=true;
            Alert("Oder Unser Marktauftrag ist geschlossen.",OrderCloseTime(),"Tickets ",Tickets,
                  "Swap = ", OrderSwap(), "Kommission = ", OrderCommission());
            return;
     }
 
Valeriy Yastremskiy:

Ja, dieser Teil funktioniert, und das Pending-Order-Ticket geht in das Positionsticket über und alles wird geändert, aber es funktioniert nicht sofort. Wenn eine Position geschlossen wird, erscheint ein Geschäft auf SL- oder TP-Aufträgen und die Prüfung auf dem Ticket für den Zeitpunkt der Schließung eines Marktauftrags funktioniert nicht.

Ich habe mir den Kopf zerbrochen. Schließen durch SL. Wenn das Auftragsticket im Test 3 ist, stimmt es mit dem Transaktionsticket überein und der letzte Selektor ist normal. Wenn 2, ist die Auswahl Fehler 4754. Auf real/demo immer nicht übereinstimmen.

Bitte geben Sie mir die mq5-Datei, von der Sie glauben, dass sie nicht funktioniert. Sie verschwenden so viele Informationen. Es hilft nicht zu verstehen, was Sie meinen. Besser die Quelle.

 
fxsaber:

Geben Sie mir die mq5-Datei, von der Sie glauben, dass sie nicht funktioniert. Sie verschwenden so viele Informationen. Es hilft nicht zu verstehen, was Sie meinen. Besser die Quelle.

Der Code ist ein Chaos, ich entschuldige mich.

Dateien:
 
Valeriy Yastremskiy:

Der Code ist ein Chaos, ich entschuldige mich.

Nächstes Mal besser auf die Vorzüge eingehen.

#include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static TICKET_TYPE Ticket = -1;
  
  if (Ticket == -1)
    Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Ask - 100 * _Point, 0);
  else if (!OrdersTotal())
  {
    Print(OrderSelect(Ticket, SELECT_BY_TICKET)); // wahr
    OrderPrint();
    
    Print(__MT4ORDERS__);
    
    ExpertRemove();
  }
}


Ergebnis.

2020.10.22 22:16:20.196 2020.10.21 00:03:10   market buy 1 EURAUD sl: 1.67661 (1.67664 / 1.67761)
2020.10.22 22:16:20.196 2020.10.21 00:03:10   deal #2  buy 1 EURAUD at 1.67761 done (based on order #2)
2020.10.22 22:16:20.196 2020.10.21 00:03:10   deal performed [#2  buy 1 EURAUD at 1.67761]
2020.10.22 22:16:20.196 2020.10.21 00:03:10   order performed buy 1 at 1.67761 [#2  buy 1 EURAUD at 1.67761]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   stop loss triggered #2  buy 1 EURAUD 1.67761 sl: 1.67661 [#3  sell 1 EURAUD at 1.67661]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   deal #3  sell 1 EURAUD at 1.67638 done (based on order #3)
2020.10.22 22:16:20.198 2020.10.21 00:12:59   deal performed [#3  sell 1 EURAUD at 1.67638]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   order performed sell 1 at 1.67638 [#3  sell 1 EURAUD at 1.67661]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   true
2020.10.22 22:16:20.198 2020.10.21 00:12:59   #3 2020.10.21 00:03:10.025 buy 1.00 EURAUD 1.67761 1.67661 0.00000 2020.10.21 00:12:59.874 1.67638 0.00 0.00 -123.00 sl 1.67661 0
2020.10.22 22:16:20.198 2020.10.21 00:12:59   2020.10.21
2020.10.22 22:16:20.198 2020.10.21 00:12:59   ExpertRemove() function called
 
fxsaber:

Das nächste Mal sollten Sie sich besser auf die Vorzüge konzentrieren.


Ergebnis.

Ich danke Ihnen.

 
fxsaber:

Das nächste Mal sollten Sie sich besser auf die Vorzüge konzentrieren.

Ergebnis.

Habe den Grund gefunden, alte Version von MT4Orders 2018. Damit und mit deinem Beispiel falsch gewechselt auf die neueste hat alles funktioniert, und mein Code auch)

Ich danke Ihnen.

 
Valeriy Yastremskiy:

Habe den Grund gefunden, alte Version von MT4Orders 2018.

Leider habe ich nicht herausgefunden, wie man Benutzer weniger stolpern lassen kann, wenn sie nicht aktuelle Versionen der Bibliothek verwenden.

 

Wenn jemand beim Einsatz dieser Lib auf MT5 auf RannForex mit der Einstellung "Send limit orders to the market at a price worse than the current one by N points" beim Ändern einer Limit-Order überfällt, fliegt der Alt an dieser Stelle raus

          WHILE((EqualSL && EqualTP && EqualPrice));

          if (!Res)
            ::Print("Line = " + (string)__LINE__ + "\n" + TOSTR(::OrderGetDouble(ORDER_SL)) + TOSTR(Request.sl)+
                    TOSTR(::OrderGetDouble(ORDER_TP)) + TOSTR(Request.tp) +
                    TOSTR(::OrderGetDouble(ORDER_PRICE_OPEN)) + TOSTR(Request.price) +
                    TOSTR(EqualSL) + TOSTR(EqualTP) + TOSTR(EqualPrice) +
                    TOSTR(::OrderSelect(Result.order)) +
                    TOSTR2((ENUM_ORDER_STATE)::OrderGetInteger(ORDER_STATE)));

Das liegt daran, dass MT4Orders die verschwundene Order als vormarkiert sieht, der Broker den Preis aber sofort wieder korrigiert, und bei der Abfrage der Orderparameter ist der Preis bereits anders. Es scheint also ein Feature zu sein.

 
traveller00:

Wenn jemand diese Lib auf MT5 auf RannForex mit der Einstellung "Send limit orders to the market at a price worse than the current one by N pips" angreift, fliegt der Alt beim Ändern des Limiters an dieser Stelle raus

Das liegt daran, dass MT4Orders die weggegangene Order als vormarkiert sieht, der Broker den Preis aber sofort wieder korrigiert, und bei der Abfrage der Orderparameter ist der Preis bereits anders. Es scheint also ein Feature zu sein.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Bibliotheken: MT4Orders

fxsaber, 2020.09.29 08:45 AM

Mit einer solchen Zeile

MT4ORDERS::OrderSend_MaxPause = 0; // Deaktivierung der MT5-OrderSend-Validierung.

kann man das alles abschalten. Es kann nützlich sein, wenn die MT5-Handelshistorie zu langsam ist, weil MT4Orders die Korrektheit von MT5-OrderSend manchmal durch den Zugriff auf diese Historie überprüft (und sogar korrigiert).

Ich empfehle dies nicht.

Ich verwende diese Funktion.
 

Ich habe eine MT4 EA, die ich versuche, MT5 mit MT4Orders zu portieren, so dass ich eine einzige Quelle beibehalten kann, aber ich habe in einige Probleme laufen ...

1) Wenn eine Order SL oder TP erreicht, werden die üblichen [sl]- oder [tp]-Texte nicht an den Order-Kommentar angehängt, wenn der EA während OrderSend() einen Kommentar hinzugefügt hat.

Ist dies ein normales MT5-Verhalten? Wenn ja, gibt es eine zuverlässige Methode, um festzustellen, ob eine Order tatsächlich SL/TP erreicht hat oder manuell geschlossen wurde?

(Der Versuch, durch die Überprüfung des Eröffnungskurses / Schlusskurses / SL / TP zu entscheiden, ist aufgrund des Schlupfes nicht zuverlässig - insbesondere, wenn SL sehr nahe an TP verschoben wurde).

** Interessanterweise zeigt OrdersToString() "[sl x.xxxxxx]" in den Kommentaren an, aber die Registerkarte Order History zeigt diese Information nicht an (und sie ist nicht in OrderComment() im Strategietester enthalten)


2) Wenn ein teilweiser Abschluss erfolgt, zeigen die Kommentare zu den offenen und geschlossenen Teilen der Order nicht "to #xxxxxxxxxxx" und "from #xxxxxxxxx"

. Gibt es auch hier einen zuverlässigen (und hoffentlich einfachen) Weg, um festzustellen, was mit einer bestimmten Order passiert ist?

3) Die Ticketnummer eines offenen Handels ändert sich, wenn er geschlossen wird, so dass ich OrderTicket() nicht verwenden kann, um einen Auftrag zu verfolgen, aber OrderTicketID() scheint wie OrderTicket() in MT4 zu funktionieren und behält dieselbe ID für einen geschlossenen Handel bei.

Ist dieser Wert konstant, oder kann er sich zwischen Neustarts der Plattform ändern?Wenn er konstant ist, was ist der beste Weg, OrderTicketID() zu verwenden, aber die Kompatibilität mit MT4 beizubehalten (da OrderTicketID() keine MT4-Funktion ist)?

** OrderTicketID() scheint die MT4_TICKET_TYPE Direktive zu ignorieren und ist immer "long".
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...