Typische Fehler und wie man damit umgeht, wenn man mit dem Handelsumfeld zu tun hat - Seite 9

 
Algotrader18:

Guten Tag!

Ich habe eine ähnliche Frage an alle und insbesondere an fxsaber.
Es scheint eine primitive Frage zu sein, aber ich kann keine Antwort darauf finden.
Hier https://www.mql5.com/ru/forum/6343/page939 wurde mir gesagt: "Versuchen Sie, danach zu suchen. fxsaber arbeitet schon seit einer Weile an diesem Problem. Was dabei herausgekommen ist, weiß ich nicht, es interessiert mich nicht." Deshalb habe ich beschlossen, Sie zu fragen.

Die Frage ist folgende. Ich habe eine Position eröffnet und möchte den Inhalt von MqlTradeResult drucken:

retcode, order und volume werden gedruckt, aber deal und price sind immer Nullen.
Bitte teilen Sie mir mit, was ich falsch mache und wie ich Zugriff auf den Inhalt der Ergebnisstruktur erhalte (oder ihn zumindest zuerst ausdrucken kann).

Wie wäre es damit?

//+------------------------------------------------------------------+
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//---
   request.action   = TRADE_ACTION_DEAL;    // type of trade operation
   request.symbol   = Pair1;                // symbol
   request.volume   = lots;                 // volume of lot
   request.type     = oper;                 // order type
   request.price    = priceOpen;            // price for opening
   request.deviation= Slippage;             // allowed deviation from the price
   request.magic    = magic;   
//---
   if(OrderSend(request,result))
     {
      Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
      Print ("deal = " +IntegerToString (result.deal) + "; ");
      Print ("order = " +IntegerToString (result.order) + "; "); 
      Print ("volume = " +DoubleToString (result.volume) + "; ");  
      Print ("price = " +DoubleToString (result.price) + "; ");
     }
   else
     {
      // Здесь действия при ошибке открытия
     }
//+------------------------------------------------------------------+
 
Algotrader18:

Ich eröffne eine Position und möchte den Inhalt von MqlTradeResult wie folgt drucken:

retcode, Auftrag und Volumen werden gedruckt, aber Deal und Preis sind immer Nullen.
Bitte teilen Sie mir mit, was ich falsch mache und wie ich Zugriff auf den Inhalt der Ergebnisstruktur erhalte (oder ihn zumindest zuerst ausdrucken kann).

Im Ergebnis werden Nullen geschrieben.

 
Artyom Trishkin:

Wie wäre es damit?

Danke, aber das Ergebnis ist das gleiche...
 
fxsaber:

Nullen und sind im Ergebnis vorgeschrieben.

Nun, dann ist es überhaupt nicht klar - ich dachte, ich würde etwas falsch machen, und wenn dort Nullen stehen, was ist dann der Sinn des Ergebnisses?
Ich sehe einen offenen Auftrag, erhalte result.retcode 10009 und result.price = 0 ?
Können Sie bitte erklären, was ein Ergebnis bedeutet, wenn es kein Ergebnis enthält?
 
Algotrader18:
Erläutern Sie bitte, welchen Sinn das Ergebnis hat, wenn es das Ergebnis nicht enthält?

Dies ist eine Funktion von MT5, bei der das Ergebnis nur ein Auftrag (Ticket und kein Preis), aber kein Handel ist. Sie haben mehrere Möglichkeiten

  1. Finden Sie selbst heraus, wie die Dinge funktionieren.
  2. Verwenden Sie bereits vorbereitete Entwicklungen auf höherer Ebene (die untere Ebene ist verborgen), bei denen fast alle Fallstricke umgangen werden.
 
fxsaber:

Dies ist eine Funktion von MT5, bei der das Ergebnis nur ein Auftrag (Ticket und kein Preis), aber kein Handel ist. Sie haben mehrere Möglichkeiten

  1. Finden Sie selbst heraus, wie die Dinge funktionieren.
  2. Verwenden Sie bereits vorbereitete Entwicklungen auf höherer Ebene (die untere Ebene ist verborgen), bei denen fast alle Fallstricke umgangen werden.
Ich danke Ihnen.

In MQL4 gab es keine Ergebnisstruktur, und wir erhielten ein Ticket und wählten den entsprechenden Auftrag und forderten die erforderlichen Daten an. MQL5 hat eine Ergebnisstruktur, die viele notwendige Daten enthält, und es wäre unlogisch, sie nicht zu verwenden.

1. Bevor ich eine Frage im Forum stelle, habe ich versucht, selbst herauszufinden, wie alles funktioniert" und was ich in der Ergebnisstruktur sehe:

struct MqlTradeResult
  {
   uint     retcode;          // Operation return code
   ulong    deal;             // Deal ticket, if it is performed
   ulong    order;            // Order ticket, if it is placed
   double   volume;           // Deal volume, confirmed by broker
   double   price;            // Deal price, confirmed by broker
   double   bid;              // Current Bid price
   double   ask;              // Current Ask price
   string   comment;          // Broker comment to operation (by default it is filled by description of trade server return code)
   uint     request_id;       // Request ID set by the terminal during the dispatch
   uint     retcode_external; // Return code of an external trading system
  };


present double price; // Vom Makler bestätigter Verkaufspreis.

Im Beispielcode des Entwicklers

//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
gibt result.deal aus, d.h. es wird davon ausgegangen, dass es sinnvoll ist, und es wird nicht immer durch Null in der Ergebnisstruktur dargestellt. Es könnten auch andere Beispiele angeführt werden, die zeigen, dass sowohl result.price als auch result.deal von MqlTradeResul erhalten werden können, was ich versucht habe zu tun.


Nirgendwo habe ich die Information gesehen, dass "Dies ist eine Funktion von MT5, wenn das Ergebnis nur ein Auftrag (Ticket und kein Preis), aber kein Geschäft ist". Würden Sie mir bitte sagen, aufgrund welcher Informationen Sie zu diesem Schluss gekommen sind?

2. Wenn Sie "bereits fertige Entwicklungen auf höherer Ebene (niedrige Ebene ist ausgeblendet)" kennen, die es Ihnen ermöglichen, die Parameter einer Position unmittelbar nach ihrer Eröffnung (Code 10009 erscheint) ohne vorherige Auswahl per Ticket zu erhalten, geben Sie mir bitte ein Beispiel oder einen Link dazu.

 
Algotrader18:
Ich danke Ihnen.

In MQL4 gab es keine Ergebnisstruktur, und wir mussten den entsprechenden Auftrag auswählen und die erforderlichen Daten anfordern. MQL5 hat die Ergebnisstruktur mit vielen notwendigen Daten und es wäre unlogisch, sie nicht zu verwenden.

1. Bevor ich eine Frage im Forum gestellt habe, habe ich versucht, selbst herauszufinden, wie alles funktioniert", und was ich gesehen habe, ist das Ergebnis der Struktur:


Es gibt einen doppelten Preis; // Der vom Makler bestätigte Verkaufspreis.

Im Beispielcode des Entwicklers

gibt result.deal aus, d.h. es wird davon ausgegangen, dass es sinnvoll ist, und es wird nicht immer durch Null in der Ergebnisstruktur dargestellt. Es gibt andere Beispiele, die zeigen, dass sowohl result.price als auch result.deal von MqlTradeResul bezogen werden können, was ich auch versucht habe.


Nirgendwo habe ich die Information gesehen, dass "dies eine Funktion von MT5 ist, bei der das Ergebnis nur ein Auftrag (Ticket und kein Preis), aber kein Geschäft ist". Würden Sie mir bitte sagen, aufgrund welcher Informationen Sie zu diesem Schluss gekommen sind?

2. Wenn Sie "bereits vorbereitete Entwicklungen auf höherer Ebene (niedrige Ebene ist ausgeblendet)" kennen, die es ermöglichen, die Parameter einer Position unmittelbar nach ihrer Eröffnung (Code 10009 erscheint) ohne vorherige Auswahl per Ticket abzurufen, nennen Sie mir bitte ein Beispiel oder geben Sie mir einen Link dazu.

Ein Handelsauftrag führt entweder zu einer Ablehnung oder zu einem Marktauftrag. Es handelt sich weder um einen Handel noch um eine Position, die durch einen Handel entsteht.

  1. Ein Handelsauftrag zur Eröffnung einer Position wird an den Server gesendet (Order = Auftrag)
  2. Wenn der Auftrag angenommen wird, wird das Ergebnis der Annahme des Auftrags und der Aufnahme in die Warteschlange zurückgegeben.
  3. Wenn der Auftrag ausgeführt wurde, wird der Abschluss - das Ergebnis der Auftragsausführung - angezeigt.
  4. Das Ergebnis eines Handels ist entweder eine neue Position, die Erhöhung/Verringerung einer bestehenden Position, die Schließung einer Position oder ein Rollover. Oder eine neue Position (in einem Absicherungskonto).
 
Artyom Trishkin:

Ein Handelsauftrag führt entweder zu einer Ablehnung oder zu einem Marktauftrag. Es handelt sich weder um einen Handel noch um eine Position, die durch einen Handel entsteht.

  1. Ein Handelsauftrag zur Eröffnung einer Position wird an den Server gesendet (Order = Auftrag)
  2. Wenn der Auftrag angenommen wird, wird das Ergebnis der Annahme des Auftrags und der Aufnahme in die Warteschlange zurückgegeben.
  3. Wenn der Auftrag ausgeführt wurde, erscheint ein Abschluss als Ergebnis der Auftragsausführung.
  4. Das Ergebnis eines Handels ist entweder eine neue Position, die Erhöhung/Verringerung einer bestehenden Position, die Schließung einer Position oder ein Rollover. Oder eine neue Position (im Falle eines Absicherungskontos)
Danke - bitte sagen Sie es mir:
- Nach welchem der von Ihnen aufgeführten Schritte erscheint Ihrer Meinung nach die Ergebnisstruktur der Handelsanfrage (MqlTradeResult)?

- Gemäß der MQL5-Beschreibung:
"Struktur des Ergebnisses der Handelsanfrage (MqlTradeResult)
Als Antwort auf eine Handelsanfrage gibt der Handelsserver Daten zurück, die das Ergebnis der Verarbeitung der Handelsanfrage in Form einer speziellen vordefinierten Struktur MqlTradeResult" enthalten. und "10009 TRADE_RETCODE_DONE Auftrag ausgeführt".

D.h. der Rückgabecode 10009 des Handelsservers bedeutet, dass die OrderSend-Anforderung erfolgreich ausgeführt wurde, d.h. wenn ich Daten von MqlTradeResult anfordere, nachdem ich den Code 10009 erhalten habe, wie kann ich erklären, dass result.price = 0 ist?
 
Algotrader18:
Ich danke Ihnen:
- Nach welchem der von Ihnen aufgeführten Schritte erscheint die Struktur des Ergebnisses der Handelsanfrage (MqlTradeResult)?

- Gemäß der MQL5-Beschreibung:
"Struktur des Ergebnisses der Handelsanfrage (MqlTradeResult)
Als Antwort auf eine Handelsanfrage gibt der Handelsserver Daten zurück, die das Ergebnis der Verarbeitung der Handelsanfrage in Form einer speziellen vordefinierten Struktur MqlTradeResult" enthalten. und "10009 TRADE_RETCODE_DONE Auftrag ausgeführt".

Daher bedeutet der Rückgabecode von Trade Server 10009, dass die OrderSend-Anforderung erfolgreich ausgeführt wurde, d.h. wenn ich Daten von MqlTradeResult anfordere, nachdem ich den Code 10009 erhalten habe, wie kann ich dann erklären, dass result.price = 0 ist?

10009 TRADE_RETCODE_DONE - Sie haben es selbst beschrieben - der Auftrag wird ausgeführt. Dies bedeutet lediglich, dass der Auftrag erfolgreich in die Warteschlange des Servers zur Ausführung gestellt wurde.

Wenn dieser Auftrag ausgeführt wird (er kann ja vom Server abgelehnt werden), kommt ein Geschäft zustande - das ist das Ergebnis des Geschäfts mit dem Eröffnungskurs.

Lesen Sie über

OnTradeTransaction

Sie wird in Expert Advisors aufgerufen, wenn ein TradeTransaction-Ereignis eintritt. Die Funktion ist für die Verarbeitung der Ergebnisse der Ausführung von Handelsaufträgen vorgesehen.

voidOnTradeTransaction( )
const MqlTradeTransaction&trans,// Struktur einer Handelstransaktion
const MqlTradeRequest&request,// Struktur der Anfrage
const MqlTradeResult& result// Struktur der Antwort
);

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
Algotrader18:

Nirgendwo habe ich die Information gesehen, dass dies eine Funktion von MT5 ist, bei der das Ergebnis nur ein Auftrag (Ticket und kein Preis), aber kein Handel ist. Würden Sie mir bitte sagen, aufgrund welcher Informationen Sie zu diesem Schluss gekommen sind?

Eigene Erfahrung.

2. Wenn Sie "bereits fertige Entwicklungen auf höherer Ebene (niedrige Ebene ist ausgeblendet)" kennen, die es ermöglichen, die Parameter einer Position unmittelbar nach ihrer Eröffnung (Code 10009 erscheint) ohne vorherige Auswahl per Ticket abzurufen, nennen Sie bitte ein Beispiel oder geben Sie einen Link dazu an.

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

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void Variant1()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0), SELECT_BY_TICKET))
    OrderPrint();
}

void Variant2()
{
  OrderSend(_Symbol, OP_SELL, 0.1, Bid, 100, 0, 0);
  MqlTradeResult result = MT4ORDERS::LastTradeResult;
  
  Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
  Print ("deal = " +IntegerToString (result.deal) + "; ");
  Print ("order = " +IntegerToString (result.order) + "; "); 
  Print ("volume = " +DoubleToString (result.volume) + "; ");  
  Print ("price = " +DoubleToString (result.price) + "; ");
}

void OnStart()
{
  Variant1();
  Variant2();
}
#2212868739 2018.11.02 21:09:33 buy 0.10 EURUSD 1.13895 0.00000 0.00000 1.13892 -0.18 0.00 -0.26 0
retcode = 10009; 
deal = 2210317244; 
order = 2212868740; 
volume = 0.10000000; 
price = 1.13892000; 


Es gibt noch eine weitere Option, aber die ist "fortgeschritten".