Wie man im MT5 mit OrderSend korrekt arbeitet - Seite 5

 
Andrey Khatimlianskii:

Ich habe das Bild gesehen. Für die Börse ist alles klar (mit einem Limitauftrag).

Bei Devisen- und Marktaufträgen verstehen Sie den Sinn nicht. Alles ist klar.

Das Gleiche gilt für einen Marktauftrag (an der Börse)

Hinzugefügt von

Wenn wir einen Marktauftrag senden, gehen wir nach Erhalt des Tickets in die Historie und

gehen wir in die Geschichte ein und sehen, was daraus geworden ist. Sie können sich auch OnTradeTransaction ansehen

TRADE_TRANSACTION_HISTORY_ADD
 
Andrey Khatimlianskii:

Wie wäre es mit "wenn OrderSend das Ticket zurückgegeben hat, wird es ausgeführt"?

Sollen wir nun doch in die Geschichte rennen oder auf die Ereignisse warten? Nun, darum geht es in diesem Thread!!!

Richtig. Was habe ich in der "Abendkasse" nicht gesagt?

Ich habe sogar einen EA (für die Börse) als Beispiel gepostet

 
Andrey Khatimlianskii:

Ja, alles in allem ist es nicht sehr themenbezogen ) Aber danke für den Beitrag.

Es geht darum, dass der "synchrone" OrderSend endet, bevor der EA seine Auswirkung auf das Konto sieht (kein Handel in der Historie und keine Veränderung der Position).

Und um richtig zu funktionieren, müssen wir uns mit Krücken in Form von Warten auf ein Ereignis (eine sehr praktische Funktion! Aber nicht in diesem Fall) oder Durchsuchen des Verlaufs (auch mit Warten) behelfen.

In der Tat gibt es ein Problem für FOREX (ich habe den gleichen Expert Advisor auf FOREX ausgeführt)

2016.10.14 02:18:20.229 Trades  '3941932': buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.276 Trades  '3941932': accepted buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.292 Trades  '3941932': order #102956267 buy limit 1.00 / 1.00 GBPUSD at market done in 62.769 ms
2016.10.14 02:18:20.292 Trades  '3941932': failed cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374 [Invalid request]
2016.10.14 02:18:20.292 Trades  '3941932': cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.354 Trades  '3941932': accepted cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.354 Trades  '3941932': cancel #102956267 buy limit 1.00 GBPUSD at market done in 66.823 ms

2016.10.14 02:18:20.229 TestOrders (GBPUSD,H1)  OnChartEvent Send Order Sync mode
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  SendOrderSyncMode Order sent in sync mode
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  RemoveOrderSyncMode Order not sent (remove) in sync mode.
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Order plased done. Ticket = 102956267
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order remove done. Ticket = 102956267
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102956267
 

Im asynchronen Modus (FOREX) funktioniert es jedoch problemlos.

2016.10.14 02:31:26.145 Trades  '3941932': sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.206 Trades  '3941932': accepted sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.208 Trades  '3941932': order #102958649 sell limit 1.00 / 1.00 GBPUSD at market done in 63.027 ms
2016.10.14 02:31:26.208 Trades  '3941932': cancel order #102958649 sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.271 Trades  '3941932': accepted cancel order #102958649 sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.273 Trades  '3941932': cancel #102958649 sell limit 1.00 GBPUSD at market done in 64.700 ms

2016.10.14 02:31:26.145 TestOrders (GBPUSD,H1)  OnChartEvent Send Order Acync mode
2016.10.14 02:31:26.145 TestOrders (GBPUSD,H1)  SendOrderAsyncMode Order sent in async mode
2016.10.14 02:31:26.207 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102958649
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order plased done. Ticket = 102958649
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102958649
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Order remove done. Ticket = 102958649
 
Andrey Khatimlianskii:
Natürlich wird jeder die Nachricht erhalten. Aber sie werden nicht wissen, dass jemand dieselbe Nachricht nicht schon einen Takt früher erhalten und keine neue Bestellung ausgelöst hat.

Neue Idee.

Schreiben Sie einen EA-Synchronisierer. Sobald OrderSend durchgeführt wird, werden die Daten an diesen EA gesendet und auf dessen Antwort gewartet.

Der Unterschied zur Schlupfvariante sind allerdings die gleichen Eier. Alles in allem ist Ihre Variante optimal, leider.

 
prostotrader:

Dasselbe mit einem Marktauftrag (an der Börse)

Hinzugefügt

Wenn ein Marktauftrag gesendet wird, gehen wir, sobald wir das Ticket erhalten haben, mit diesem in die Historie und

um zu sehen, was damit passiert ist.

Theoretisch ist es möglich, dass CTrade::ResultDeal() den Wert Null und CTrade::ResultOrder() den Wert 0 zurückgibt, zum Beispiel bei TRADE_RETCODE_TIMEOUT.
 
prostotrader:

OrderSend() ist eine absolut synchrone Funktion - wenn ein Ticket empfangen wird, wird alles ausgeführt.

Nachstehend ein Beispiel

Hinzugefügt, und hier sind die Protokolle

https://www.mql5.com/ru/forum/38456/page85#comment_2888263

Danke, für den Link. Aber die Frage war ein bisschen anders. Es handelte sich nicht um eine Frage, sondern um ein Argument dafür, den Auftragsstatus an Ort und Stelle zu prüfen, ohne auf die Auslösung des Ereignisses OnTrade() zu warten.
 
Oleg Shenker:
Vielen Dank für den Link. Aber meine Frage war ein wenig anders. Vielmehr war es keine Frage, sondern ein Argument dafür, den Auftragsstatus an Ort und Stelle zu prüfen, ohne auf die Verarbeitung des Ereignisses OnTrade() zu warten.

Sie haben sich den Code des Beispiels wohl nicht angesehen.

if(SendOrderSyncMode())
           {
            if(order_ticket>0)
              {
               if(OrderSelect(order_ticket))
                 {
                  RemoveOrderSyncMode(order_ticket);
                 }
               else
                 {
                  Print(__FUNCTION__," Order not select! Ticket = ",order_ticket);
                 }
              }
           }

Die Löschung der Bestellung im Sync-Modus (OrderSend()) sollte nach der Antwort von

SendOrserSyncMode-Funktion, aber es geschah nicht.

2016.10.14 02:18:20.292 Trades'3941932': fehlgeschlagene Stornierung der Order #102956267 Kauflimit 1.00 GBPUSD bei 1.22374 [Ungültige Anfrage]

Genau hier liegt der Fehler. Wenn wir ein Ticket erhalten haben, ist der Auftrag laut Dokumentation im Handelssystem platziert worden,

Dies ist jedoch (in FOREX) nicht der Fall, und die Löschung erfolgte im Körper der FunktionRemoveOrderAsyncMode, d. h.

nach Erhalt einer Nachricht in OnTradeTransaction

Hinzugefügt

Um die Frage des Top-Starters zu beantworten: Nach dem Absenden einer Bestellung mit der Funktion OrderSend(),

der Auftrag kann nach Erhalt des Ereignisses in OntradeTransaction (OnTrade) bearbeitet werden.

Es scheint, dass die Entwickler das Problem beheben werden.

Hinzugefügt

Jetzt habe ich bei FORTS nachgesehen - auch dort gibt es dieses Problem

2016.10.17 18:45:19.074 Trades  '1007932': buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.081 Trades  '1007932': accepted buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.081 Trades  '1007932': buy limit 1.00 GAZR-12.16 at 12847 placed for execution
2016.10.17 18:45:19.091 Trades  '1007932': order #52178167 buy limit 1.00 / 1.00 GAZR-12.16 at 12847 done in 17.440 ms
2016.10.17 18:45:19.091 Trades  '1007932': failed cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847.00000 [Invalid request]
2016.10.17 18:45:19.091 Trades  '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.098 Trades  '1007932': accepted cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.099 Trades  '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847 placed for execution in 7.215 ms

2016.10.17 18:45:19.074 TestOrders (GAZR-12.16,M1)      OnChartEvent Send Order Sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      SendOrderSyncMode Order sent in sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      RemoveOrderSyncMode Order not sent (remove) in sync mode.
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order plased done. Ticket = 52178167
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order get ticket done. Ticket = 52178167
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order remove done. Ticket = 52178167
 
prostotrader:

Um die Frage des Top-Traders zu beantworten: Nach dem Senden einer Order mit OrderSend(),

Sie können mit der Order arbeiten, nachdem Sie das Ereignis in OntradeTransaction (OnTrade) erhalten haben

Im Falle von zwei EAs auf demselben Symbol?
 
fxsaber:
Im Falle von zwei EAs auf demselben Symbol?

Ja, zwei EAs für dasselbe Symbol.

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Тип выполняемого действия
   ulong                         magic;            // Штамп эксперта (идентификатор magic number)
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   double                        volume;           // Запрашиваемый объем сделки в лотах
   double                        price;            // Цена  
   double                        stoplimit;        // Уровень StopLimit ордера
   double                        sl;               // Уровень Stop Loss ордера
   double                        tp;               // Уровень Take Profit ордера
   ulong                         deviation;        // Максимально приемлемое отклонение от запрашиваемой цены
   ENUM_ORDER_TYPE               type;             // Тип ордера
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Тип ордера по исполнению
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
   string                        comment;          // Комментарий к ордеру
   ulong                         position;         // Тикет позиции
   ulong                         position_by;      // Тикет встречной позиции
  };

Aussortieren der "falschen" Positionen, Aufträge und Geschäfte.

Grund der Beschwerde: