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

 

Ich wünsche Ihnen allen eine gute Zeit!

Ich habe eine Frage zur Funktion ResultDeal() in der Klasse CTrade.

Das Problem ist, dass diese Funktion im Strategietester das Handelsticket ohne Probleme zurückgibt, aber wenn man den EA auf den Chart wirft, gibt er immer "Null" zurück, obwohl die Funktion ResultRetcode() immer "TRADE_RETCODE_DONE" zurückgibt.

Beispiel-Code:

/////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   TicketDeal = 9999999;
   
   first_calc = true;
   second_calc = false;
   third_calc = false;   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(first_calc)
   {
      first_calc = false;
      second_calc = true;
      
      SymbolInfo.Name(Symbol());
      SymbolInfo.RefreshRates();
      Trade.Buy(1.0, Symbol(), SymbolInfo.Ask(), 0.0, 0.0, "BUY");
//---
      Retcode = Trade.ResultRetcode();
      if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
      
      Print("first_calc ////////////////////////////////////");
      Print("PositionsTotal(): ", PositionsTotal());
      Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
   }
   else
   {
      if(second_calc)
      {
         second_calc = false;
         third_calc = true;
//---
         Retcode = Trade.ResultRetcode();
         if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
         
         Print("second_calc ////////////////////////////////////");
         Print("PositionsTotal(): ", PositionsTotal());
         Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
      }
      else
      {
         if(third_calc)
         {
            third_calc = false;
//---
            Retcode = Trade.ResultRetcode();
            if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
            
            Print("third_calc ////////////////////////////////////");
            Print("PositionsTotal(): ", PositionsTotal());
            Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
         }
         else
         {
            //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

Ausführungsprotokoll im Tester:

2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   first_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   second_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   third_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   Retcode: 10009; TicketDeal: 2

Ausführungsprotokoll auf dem Chart:

2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) PositionsTotal(): 0
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0


Was mache ich falsch? Wie erhalte ich ein Handelsticket in Echtzeit?

Und die zweite Frage (von geringerer Bedeutung): Warum gibt die Funktion PositionsTotal() unmittelbar nach der Ausführung eines Handels "Null" zurück? Und sie zeigt mit dem nächsten Tick zuverlässige Daten an. Ist es möglich, diese Informationen sofort zu erhalten?


Dateien:
 
ZAKST:

Ich wünsche Ihnen allen eine gute Zeit!

Ich habe eine Frage zur Funktion ResultDeal() in der Klasse CTrade.

Das Problem ist, dass diese Funktion im Strategietester das Handelsticket ohne Probleme zurückgibt, aber wenn man den EA auf den Chart wirft, gibt er immer "Null" zurück, obwohl die Funktion ResultRetcode() immer "TRADE_RETCODE_DONE" zurückgibt.

Beispiel-Code:

Ausführungsprotokoll im Tester:

Ausführungsprotokoll auf dem Chart:


Was mache ich falsch? Wie erhalte ich ein Handelsticket in Echtzeit?

Und die zweite Frage (von geringerer Bedeutung): Warum gibt die Funktion PositionsTotal() unmittelbar nach der Ausführung eines Geschäfts "Null" zurück? Und sie zeigt mit dem nächsten Tick zuverlässige Daten an. Ist es möglich, diese Informationen sofort zu erhalten?


Hmm... Plötzlich werden die Daten, die ich in Echtzeit benötige, von der Funktion ResultOrder() derselbenCTrade-Klasse zurückgegeben, obwohl ich keine Pending Orders verwendet habe...

Die Frage ist dieselbe: Was mache ich falsch?

 

Es gibt ein Makro wie dieses.

#define  Warning if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

Ich verwende es so.

Warning"Warnig  сработал. ");

Frage: Was muss in der Makrodefinition korrigiert werden, um es so verwenden zu können?

Warning("Warnig  сработал. ");

d.h. mit einer Klammer zwischen Warnung und "Warnig gearbeitet". "Ich habe versucht, eine Klammer in der Makrodefinition zu verwenden

#define  Warning( if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

aber der Compiler erlaubt mir nicht, eine Klammer zu verwenden.

 
ZAKST:

Hmm... Plötzlich liefert die Funktion ResultOrder() derselbenCTrade-Klasse die Daten, die ich brauche, in Echtzeit, obwohl ich keine Pending Orders verwendet habe...

Die Frage ist dieselbe: Was mache ich falsch?

Verstehen Sie einfach das Auftragssystem von MT5, Auftrag - Handel - Position.

ResultOrder ist der Eröffnungsauftrag. Die Position wird mit POSITION_IDENTIFIER gleich dem Ticket dieser Bestellung sein.

Alle Geschäfte können in der Historie anhand der Positionsbezeichnung gefunden werden. Nicht zu verwechseln mit dem Ticket der Position, es kann sich ändern, und die Kennung ist konstant.

Das heißt, der Tester unterscheidet sich dadurch, dass es keine Verzögerung bei der Ausführung des Auftrags gibt und das Geschäft sofort zustande kommt. Im wirklichen Leben vergeht die Zeit, und zum Zeitpunkt der erfolgreichen Erstellung einer Bestellung gibt es noch kein Geschäft, es muss in den OnTrade-Ereignissen erfasst werden
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe:

Es gibt ein Makro wie dieses.

Ich verwende es so.

Frage: Was muss in der Makrodefinition korrigiert werden, um es so verwenden zu können?

d.h. mit einer Klammer zwischen Warnung und "Warnig gearbeitet". "Ich habe versucht, eine Klammer in der Makrodefinition zu verwenden

aber der Compiler erlaubt mir nicht, eine Klammer zu verwenden.

Sie wollen ein parametrisches Formular verwenden, haben aber ein nicht-parametrisches Formular angegeben. das muss so aussehen

#define  Warning(CUSTOM) (if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+"",string(CUSTOM)))


Warning("Warnig  сработал. ");
 

Ich habe es nicht gut erklärt. Fangen wir von vorne an. Jetzt verwende ich das Makro wie folgt:

Warning,"Warnig  сработал. i=",i);

Hier ist das Makro selbst:

#define  Warning if(LogWarnig)MoiLoggerWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')

Im Makroaufruf zwischen "Warning," und ");" Eine beliebige Anzahl von Parametern beliebigen Typs. All dies wird durch wiederholtes Laden der FunktionSchreiben erreicht.

Frage. Was muss ich in dem Makro korrigieren, um es so aufrufen zu können?

Warning("Warnig  сработал. i=",i);
 
pivomoe:

Ich habe es nicht gut erklärt. Fangen wir von vorne an. Jetzt verwende ich das Makro wie folgt:

Hier ist das Makro selbst:

Im Makroaufruf zwischen "Warning," und ");" Eine beliebige Anzahl von Parametern beliebigen Typs. All dies wird durch wiederholtes Laden der FunktionSchreiben erreicht.

Frage. Was sollte in dem Makro korrigiert werden, damit es wie folgt aufgerufen werden kann?

Antwort: laden Sie das Makro auch mehrmals neu)

Aber es ist besser, den Operator + für Strings zu verwenden und alles in Strings umzuwandeln, dann braucht man keine Version der Funktion (und des Makros) mit vielen Parametern

 
Aleksey Mavrin:

Verstehen Sie einfach das Auftragssystem von MT5, Auftrag - Handel - Position.

ResultOrder ist der Eröffnungsauftrag. Die Position wird mit POSITION_IDENTIFIER gleich dem Ticket dieser Bestellung sein.

Alle Geschäfte können in der Historie anhand der Positionsbezeichnung gefunden werden. Nicht zu verwechseln mit dem Ticket der Position, es kann sich ändern, und die Kennung ist konstant.

s.s. Der Tester unterscheidet sich dadurch, dass es keine Verzögerung bei der Ausführung der Bestellung gibt und sofort ein Geschäft zustande kommt. Im realen Handel vergeht die Zeit, und zum Zeitpunkt der erfolgreichen Ordererstellung gibt es noch keinen Abschluss, er muss in den OnTrade-Ereignissen erfasst werden.
Ich danke Ihnen für Ihre Antwort. Ich werde mich darum kümmern))
 
Hallo! Wie kann ich von einem EA aus auf die Eigenschaften eines Indikators zugreifen? Ich möchte zum Beispiel die Farbe einer Linie aus einem EA ändern, der den Indikatorgriff kennt. Ich habe die Hilfe durchsucht, konnte aber nichts finden, vielleicht suche ich nicht gründlich genug?
 
Tango_X:
Hallo! Wie kann ich von einem EA aus auf Indikatoreigenschaften zugreifen? Ich möchte zum Beispiel die Linienfarbe eines EAs ändern, wenn ich den Indikator-Handle kenne. Ich habe danach gesucht, konnte es aber nicht finden, vielleicht suche ich zu intensiv?

Ein Indikator hierfür muss einen Parameter für die Eingangsfarbe haben. Das heißt, es muss ein benutzerdefinierter Indikator sein.