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

 
Ich bin fiddling mit CTrade::PositionClose(const ulong ticket,const ulong Abweichung=ULONG_MAX) und erkennen, dass es nicht genau innen organisiert ist. Es geht um 2 Rückgabecodes - bool und ResultRetcode(). RetCode wird intern nicht immer auf Null gesetzt, bevor es false zurückgibt. Wenn also PositionClose false ergibt, kann RetCode durchaus TRADE_RETCODE_DONE zurückgeben. Es wäre schön, wenn die Entwickler diese 2 Rückgabewerte synchronisieren könnten.
 
. ... Rick D. ... .:
Ich bin fiddling mit CTrade::PositionClose(const ulong ticket,const ulong Abweichung=ULONG_MAX) und erkennen, dass es nicht genau innen organisiert ist. Es geht um 2 Rückgabecodes - bool und ResultRetcode(). RetCode wird intern nicht immer auf Null gesetzt, bevor es false zurückgibt. Wenn also PositionClose false ergibt, kann RetCode durchaus TRADE_RETCODE_DONE zurückgeben. Es wäre schön, wenn die Entwickler diese 2 Rückgabewerte synchronisieren könnten.

Code + Beispiel + Protokolle.

 
Ich habe einen seltsamen Fehler gefunden. Vielleicht ist es nur für mich.

COrderInfo::OrderType() gibt immer 0 zurück.

Um dies zu überprüfen, können Sie manuell eine beliebige schwebende Order platzieren (BuyStop, SellStop, ...),
und geben Sie sie dann in das Skript ein.
#include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart()
{
  ulong ticket = 250262937; //здесь ваш тикет
  
  if (!m_order.Select(ticket))
  {
    PrintFormat("COrderInfo::Select(#%I64u) failed", ticket);
    return;
  }
  
  PrintFormat("OrderType= %d", m_order.Type());
}

Vielleicht etwas mit der virtuellen Funktionstabelle? Bei der Fehlersuche komme ich nur zu virtual int CObject::Type()

PS. Ich habe es bereits selbst herausgefunden. COrderInfo hat 2 ähnliche Methoden: Type() und OrderType().

 
Vladimir Karputov:

Code + Beispiel + Protokolle.

Sie sehen, welche Situation ich meine.

#include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart()
{ 
  int LErr;
  bool bRC;
  double price;

  ResetLastError();
  
  price = 0.0;
  bRC = m_trade.Buy(0.1, "EURUSD", price, 0.0, 0.0);

  LErr = GetLastError();

  PrintFormat("! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
  //---

  ulong ticket = 1; //Позиции с таким тикетом нет
  
  ResetLastError();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError();
  
  PrintFormat("! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

Ich sehe keine SetResultRetcode- und SetResultComment-Methoden in CTrade, um sie vor jeder neuen Operation zurückzusetzen.

Ich muss meine Klasse erben, wo ich eine einzige Methode hinzufüge


class CTradeEx : public CTrade
{
public:
  void SetResult(MqlTradeResult& result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... .:

Sie sehen, welche Situation ich meine.

Ich sehe keine SetResultRetcode- und SetResultComment-Methoden in CTrade, um sie vor jeder neuen Operation zurückzusetzen.

Und wozu? Völlig unnötige Funktionen.

Erstens: Sie schießen in die Luft - Sie senden einen Handelsauftrag, ohne vorher zu prüfen - ohne zu prüfen, was die Operation zurückgegeben. Sehen Sie sich die Referenz an:PositionClose ist vom Typ bool.

Zweitens betrachten wir die Kette der Positionsschließung: Wenn die Position nicht gefunden wird (sie kann nicht mit dem angegebenen Ticket ausgewählt werden), wird "false" zurückgegeben.

//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean

Dabei werden die Strukturen nirgends gelöscht - weil es keinen Sinn macht - schließlich konnte die Position vorher nicht ausgewählt werden, also sind auch keine Informationen in den Strukturen vorhanden.

 
Vladimir Karputov:

Was soll das bringen? Völlig unnötige Funktionen.

Erstens: Sie schießen in die Luft - Sie senden einen Handelsauftrag, ohne vorher zu prüfen - ohne zu prüfen, was die Operation zurückgegeben. Schauen wir uns die Referenz an:PositionClose ist vom Typ bool.

Zweitens betrachten wir die Kette der Positionsschließung: Wenn die Position nicht gefunden wird (sie kann nicht mit dem angegebenen Ticket ausgewählt werden), wird "false" zurückgegeben.

Gleichzeitig werden die Strukturen nirgendwo gelöscht, da dies keinen Sinn macht - schließlich konnte die Position vorher nicht ausgewählt werden, daher gibt es keine Informationen in den Strukturen.

1) Wir können ebenso gut sagen, dass ResetLastError() eine absolut unnötige Funktion ist.

2) Es gibt eine Prüfung für das zurückgegebene Ergebnis. Stellen Sie sich analog dazu vor, Sie rufen eine WinAPI-Funktion auf, die einen Fehler zurückgibt, und GetLastError() (analog zu ResultRetcode) gibt einen beliebigen letzten Code zurück.

Wenn ich eine Prüfung vor dem Aufruf von PositionClose hinzufüge (was ich tun werde), überschreibt sie keine anderen Prüfungen vor anderen Aufrufen, wenn sich der RetCode nicht ändert.

Mein Expert Advisor schreibt Informationen in das Protokoll. Alles, was ich brauche, ist in log sane ResultRetcode und ResultComment zu schreiben, wenn einige Aufruf falsch zurückgegeben.

 
. ... Rick D. ... .:

1) Man könnte ebenso gut sagen, dass ResetLastError() völlig unnötig ist.

2) Es gibt eine Prüfung für das Rückgabeergebnis. Stellen Sie sich analog dazu vor, Sie rufen eine WinAPI-Funktion auf, die einen Fehler zurückgibt, und GetLastError() (analog zu ResultRetcode) gibt einen beliebigen letzten Code zurück.

Wenn ich vor dem Aufruf von PositionClose eine Prüfung hinzufüge (was ich tun werde), werden keine anderen Prüfungen vor anderen Aufrufen außer Kraft gesetzt, wenn sich der RetCode nicht ändert.

Mein Expert Advisor schreibt Informationen in das Protokoll. Alles, was ich tun muss, ist sane ResultRetcode und ResultComment in das Protokoll zu schreiben, wenn einige Aufruf falsch zurückgegeben.

Lesen Sie in der Hilfe der Klasse CTrade nach, wenn Sie dasErgebnis der Ausführung einer Handelsanfrage (Rückgabecode des Handelsservers) durch Aufruf der MethodeResultRetcode()überprüfen müssen.

 
Vladimir Karputov:

Lesen Sie in der Hilfe der Klasse CTrade, wanndas Ergebnis der Ausführung der Handelsanfrage (Rückgabecode des Handelsservers) durch den Aufruf der MethodeResultRetcode()überprüft werden soll.

Das können Sie behaupten.

1) Wenn PositionClose false zurückgibt, wird der Retcode nie gefüllt?

2) Wenn PositionClose true zurückgibt, dann wird der Retcode immer gefüllt?

 
Vladimir Karputov:

Auftrag -> Handel -> Position. Nehmen Sie den Eröffnungskurs der Position.

Können Sie ein Bild davon zeigen, wie dieser Auftrag -> Handel -> Position, es ist unter, wo die Geschäfte geschrieben werden, so dass es nicht zulassen, Kopieren gibt


 
Seric29:

Können Sie ein Bild davon zeigen, wie diese Order -> Trade -> Position, es ist am unteren Rand, wo Trades geschrieben werden, so dass es nicht lassen Sie kopieren.


Bitte schreiben Sie entweder Ihre Frage um oder setzen Sie Satzzeichen, oder besser noch fügen Sie ein Bild hinzu, was, wo und wer. Andernfalls stellt sich heraus, dass ich vertraute Buchstaben sehe, aber die Bedeutung und Ihren Standpunkt nicht verstehen kann.

Grund der Beschwerde: