Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 815

 
pivomoe:
Ich kann nur nicht herausfinden, ob es normal ist, dass .

Es gibt hier viele Dinge, die schwer zu verstehen sind. Insbesondere bei der Abfolge der Vorgänge habe ich festgestellt, dass es in einer Reihe von Fällen Unstimmigkeiten gibt.
Wenn zum Beispiel eine Position eröffnet wird, wird zunächst ein Marktauftrag eröffnet, der dann in eine Position umgewandelt wird. Während dieser maschinellen Transaktionsserie kommt es jedoch zu einer Situation, in der eine Position bereits eröffnet, der Auftrag aber noch nicht geschlossen wurde. Natürlich handelt es sich um dasselbe Ereignis, aber die Transaktionen werden stückweise organisiert und nacheinander ausgegeben, und bei diesem Ansatz ist es im Prinzip unmöglich, die Umwandlung eines Marktauftrags in eine Position korrekt wiederzugeben.

Meiner Meinung nach ist es am besten, Ihre Handelskontrolle zu organisieren: Merken Sie sich Ihre Handelsaufträge und überwachen Sie die Zusammensetzung von Aufträgen und Positionen einfach durch ihr Vorhandensein in den entsprechenden Listen.
 

Apropos Vögel.

Wussten Sie, dass bei diesen Geschäften Marktaufträge mit einem Nullpreis erteilt werden?
Ein Beispiel: Eine Person möchte eine Kaufposition bei 1,2000, Sl=1,1000, Tr=1,3000 eröffnen.
Wenn diese Transaktion ausgeführt wird, erscheint als erstes die Transaktion, in der der Marktauftrag mit den folgenden Daten aufgeführt ist:
Sl= 1.1000, Tr= 1.3000, d.h. mit den angegebenen Zahlen und Price=0 (gleich Null). Es handelt sich um eine Art Marktauftrag mit Nullpreis :) Und denken Sie, was Sie wollen.

 
pivomoe:

Der Einfachheit halber. Eine kleine Funktion wird von MqlTradeTransaction aufgerufen. Das gewünschte Element wird dort durch die Suche nach Elementen der Klasse gefunden. Und für dieses Element wird eine der Funktionen der Klasse aufgerufen, die etwas Nützliches tut.


Beschreiben Sie bitte genauer, was genau Sie wollen? Warum rufen Sie etwas aus OnTradeTransaction auf?

Zuerst nur in Worten, dann werden wir es in die richtige Richtung korrigieren.

 
User_mt5:
Die Funktion Abc() des Benutzers wird ausgeführt und implementiert einen (zeitlich gesehen) langen Algorithmus.
Während der Ausführung dieser Funktion finden einige Ereignisse statt, z.B. - Handel, Timer, etc.
Ist es möglich zu wissen, dass diese Ereignisse eingetreten sind, ohne die Ausführung der Funktion Abc() zu beenden?

Nein. Während eine Funktion gezählt wird, wird alles andere übersprungen.

Sie ist ähnlich wiedie FunktionSleep()- d.h. während Ihre Funktion sehr lange zählt, verhält sie sich ähnlich wie Sleep - alle anderen Ereignisse werden übersprungen.

 
User_mt5:

...


Bei OnTradeTransaction ist absolut alles transparent.

Erstens:Die Struktur MqlTradeTransaction wird je nach Art des Handelsgeschäfts (ENUM_TRADE_TRANSACTION_TYPE)unterschiedlich gefüllt.

Lesen Sie hier:Aufbau einer Trade-Transaktion (MqlTradeTransaction)

Zweitens: Um die Ergebnisse zu visualisieren, können wir diesen Codeblock aus demOrderSendAsync-Beispiel extrahieren

//+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction(const MqlTradeTransaction &trans, 
                        const MqlTradeRequest &request, 
                        const MqlTradeResult &result) 
  { 
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type; 
//--- если транзакция является результатом обработки запроса, выведем только её название 
   if(type==TRADE_TRANSACTION_REQUEST) 
     { 
      Print(EnumToString(type)); 
      //--- выведем строковое описание обработанного запроса 
      Print("------------RequestDescription\r\n",RequestDescription(request)); 
      //--- выведем описание результата запроса 
      Print("------------ResultDescription\r\n",TradeResultDescription(result)); 
      //--- запомним тикет ордера для его удаления на следующей обработке в OnTick() 
      if(result.order!=0) 
        { 
         //--- удалим этот ордер по его тикету при следующем вызове OnTick() 
         order_ticket=result.order; 
         Print(" Тикет отложенного ордера ",order_ticket,"\r\n"); 
        } 
     } 
   else // для транзакций другого типа выведем полное описание 
//--- выведем описание полученной транзакции в Журнал 
      Print("------------TransactionDescription\r\n",TransactionDescription(trans));
 
//---      
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание транзакции                         | 
//+------------------------------------------------------------------+ 
string TransactionDescription(const MqlTradeTransaction &trans) 
  { 
//---  
   string desc=EnumToString(trans.type)+"\r\n"; 
   desc+="Symbol: "+trans.symbol+"\r\n"; 
   desc+="Deal ticket: "+(string)trans.deal+"\r\n"; 
   desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n"; 
   desc+="Order ticket: "+(string)trans.order+"\r\n"; 
   desc+="Order type: "+EnumToString(trans.order_type)+"\r\n"; 
   desc+="Order state: "+EnumToString(trans.order_state)+"\r\n"; 
   desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",trans.price)+"\r\n"; 
   desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n"; 
   desc+="Position: "+(string)trans.position+"\r\n"; 
   desc+="Position by: "+(string)trans.position_by+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание торгового запроса                  | 
//+------------------------------------------------------------------+ 
string RequestDescription(const MqlTradeRequest &request) 
  { 
//--- 
   string desc=EnumToString(request.action)+"\r\n"; 
   desc+="Symbol: "+request.symbol+"\r\n"; 
   desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n"; 
   desc+="Order ticket: "+(string)request.order+"\r\n"; 
   desc+="Order type: "+EnumToString(request.type)+"\r\n"; 
   desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n"; 
   desc+="Order time type: "+EnumToString(request.type_time)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",request.price)+"\r\n"; 
   desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n"; 
   desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n"; 
   desc+="Comment: "+request.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание результата обработки запроса       | 
//+------------------------------------------------------------------+ 
string TradeResultDescription(const MqlTradeResult &result) 
  { 
//--- 
   string desc="Retcode "+(string)result.retcode+"\r\n"; 
   desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n"; 
   desc+="Order ticket: "+(string)result.order+"\r\n"; 
   desc+="Deal ticket: "+(string)result.deal+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",result.price)+"\r\n"; 
   desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n"; 
   desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n"; 
   desc+="Comment: "+result.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  }

und fügen Sie sie in einen Expert Advisor ein, der an ein Diagramm angehängt werden kann. Dann können Sie Positionen manuell öffnen/schließen und den Ausdruck der Ergebnisse auf der Registerkarte Experten ansehen.

 
Vladimir Karputov:

Nein. Während eine Funktion gezählt wird, wird alles andere übersprungen.

Sie ist analog zurFunktionSleep()- das heißt, während Ihre Funktion sehr lange zählt, ist ihr Verhalten anflogisch zu Sleep - alle anderen Ereignisse werden übersprungen.

Danke, das ist sehr bedauerlich.
Und wie kann man die PC-Ressourcen dann effektiv nutzen? Wiederum Code in Schleifen und periodische Abfrage von Parametern?

 
Vladimir Karputov:

Bei OnTradeTransaction ist absolut alles transparent.

Danke für die Antwort, das ist so ziemlich das, was ich gemacht habe. Bislang mehr Fragen als Erkenntnisse...

 
Vladimir Karputov:

Beschreiben Sie bitte genauer, was Sie genau wollen? Warum rufen Sie etwas aus OnTradeTransaction auf?

Zuerst nur in Worten, dann werden wir es in die richtige Richtung korrigieren.

Ich habe verstanden, dass das Problem nicht bei OnTradeTransaction liegt. Sehen Sie nur, was für ein Durcheinander ich hier habe:

Hier ist der Code.

 CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");

 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

Und hier ist das Ergebnis der Ausführung

2017.09.22 10:30:12 Fehler bei der Auswahl der Position durch das Symbol SBRF-12.17
2017.09.22 10:30:12 Volumen 0.0 Volumen 0. 0

Ich vertausche die Zeilen 2 und 3, d.h. der Code lautet jetzt

CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 
 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

Ich erhalte ein solches Ergebnis.

2017.09.22 10:30:12 Fehler bei der Auswahl der Position durch das Symbol SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Band 1.0 SBRF-3.18 Band 1. 0

In beiden Fällen werden vom Compiler keine Warnungen ausgegeben. Im Anhang finden Sie den 80-zeiligen Expert Advisor Code und die Testeinstellungen. Makler BCS. Die Version 1730.

Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
  • www.metatrader5.com
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
Dateien:
temp.mq5  7 kb
1.png  11 kb
 
pivomoe:

Ich habe festgestellt, dass das Problem nicht bei OnTradeTransaction liegt. Sieh mal, was für ein Durcheinander ich hier habe:

Hier ist der Code.

Und hier ist das Ergebnis der Ausführung

2017.09.22 10:30:12 Fehler bei der Auswahl der Position durch das Symbol SBRF-12.17
2017.09.22 10:30:12 Volumen 0.0 Volumen 0. 0

Ich vertausche die Zeilen 2 und 3, d.h. der Code lautet jetzt

Ich erhalte ein solches Ergebnis.

2017.09.22 10:30:12 Fehler bei der Auswahl der Position durch das Symbol SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Band 1.0 SBRF-3.18 Band 1. 0

In beiden Fällen werden vom Compiler keine Warnungen ausgegeben. Im Anhang finden Sie den 80-zeiligen Expert Advisor-Code und die Testeinstellungen. Makler BCS. Die Version 1730.

Ich werde dieses Wochenende antworten. Entschuldigung.

 

Der Fehler scheint darin zu liegen, dass versucht wird, Informationen über mehr als eine Position in einer Zeile zu erhalten(Print).

Essind immer nur Informationen zu 1 (ausgewählten ) Position verfügbar:

- Im zweiten Fall ist es korrekt, weil last Select true zurückgibt, was Sie nicht überprüft haben.

- Und im ersten Fall: last Select gibt false zurück, was Sie auch nicht überprüft haben, und das Ergebnis ist unvorhersehbar.

..... natürlich Select==false setzt die Informationen des vorherigen Select==true zurück

Grund der Beschwerde: