Fehler in SetTypeFillingBySymbol - Seite 5

 
Alain Verleyen:

Carl Ich verstehe nicht, warum Sie streiten? Es gibt einen Fehler in der "Standard Library" -Funktion SetTypeFillingBySymbol (), den Thorsten von Anfang an bemerkt hat. Dieser Fehler tritt sehr selten auf, da der GBE-Broker ein sehr ungewöhnliches Setup für sein Symbol verwendet (meiner Meinung nach ist es eine falsche Konfiguration, aber das ist eine andere Sache).

Wir sind jetzt bei Post 39, das ist eine Menge nutzloser Diskussionen. Ich möchte niemanden beleidigen, aber Sie ( und amando ) scheinen nicht zu wissen, wovon Sie mit dem Füllmodus sprechen.

Für die Füllmethode der Symbole gibt es die Option "NIX" oder No Identifier - wo ist da der Fehler?


Damit gilt (in Deutsch):

Dieser Modus ist für Markt (Buy und Sell), Limit- und Stop-Limit-Aufträge verwendet, und nur in der Modi "Market execution" und "Exchange execution". Im Falle von Teilausfüllung wird ein Markt- oder Limit-Order mit dem Restvolumen nicht entfernt und arbeitet weiter.

Nutzlose Diskussion- richtig! Aber hier versucht er einen Fehler herbeizureden (statt auf Basis der Gegebenheiten sein Problem zu lösen), der wohl keiner ist. Ein Broker hat wohl diese NIX- Option, also müssen sein Nutzer damit umgehen lernen oder den Broker wechseln.

Aber ich halte mich jetzt 'raus, es ist zugegeben sinnlos.

 
Carl Schreiber :

Für die Füllmethode der Symbole gibt es die Option "NIX" oder No Identifier - wo ist da der Fehler?


Damit gilt (in Deutsch):

Nutzlose Diskussion- richtig! Aber hier versucht er einen Fehler herbeizureden (statt auf Basis der Gegebenheiten sein Problem zu lösen), der wohl keiner ist. Ein Broker hat wohl diese NIX- Option, also müssen sein Nutzer damit umgehen lernen oder den Broker wechseln.

Aber ich halte mich jetzt 'raus, es ist zugegeben sinnlos.

In den Symboleinstellungen hat der "Return" -Modus "Keine Kennung", da er NICHT aktiviert oder deaktiviert werden kann, immer für die Ausführung in Exchange? Market verwendet werden kann und bei der Sofort- / Anforderungsausführung irrelevant ist (er kann nicht verwendet werden).

Wenn Sie jedoch eine Bestellung aufgeben, MÜSSEN Sie einen korrekten Füllmodus verwenden, andernfalls wird Ihre Anfrage abgelehnt.

Das Problem ist, dass der Auftragsfüllmodus eines Trade-Objekts (CTrade.mqh) standardmäßig ORDER_FILLING_FOK (im Konstruktor) lautet. Wenn Sie die SetTypeFillingBySymbol () -Methode verwenden, bleibt der Füllmodus von SYMBOL_FILLING_FOK und SYMBOL_FILLING_IOC unverändert (ORDER_FILLING_IOC) . Dann muss der Benutzer den Rückgabewert überprüfen und den Auftragsfüllungsmodus richtig einstellen, da sonst Ihre Handelsanfrage abgelehnt wird.

Aber was nützt es dann, eine Klasse zu verwenden, die sich am Ort des Benutzers um solche Dinge kümmert? Eine korrekte Implementierung wäre:

 //+------------------------------------------------------------------+ 
 //| Set order filling type according to symbol filling mode          | 
 //+------------------------------------------------------------------+ 
 bool CTrade::SetTypeFillingBySymbol( const string symbol)
  {
 //--- get possible filling policy types by symbol 
   uint filling=( uint ) SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE );
   if ((filling& SYMBOL_FILLING_FOK )== SYMBOL_FILLING_FOK )
     {
      m_type_filling= ORDER_FILLING_FOK ;
       return ( true );
     }
   if ((filling& SYMBOL_FILLING_IOC )== SYMBOL_FILLING_IOC )
     {
      m_type_filling= ORDER_FILLING_IOC ;
       return ( true );
     }
   ENUM_SYMBOL_TRADE_EXECUTION exec=( ENUM_SYMBOL_TRADE_EXECUTION ) SymbolInfoInteger (symbol, SYMBOL_TRADE_EXEMODE );
   if (exec== SYMBOL_TRADE_EXECUTION_MARKET || exec== SYMBOL_TRADE_EXECUTION_EXCHANGE )
     {
      m_type_filling= ORDER_FILLING_RETURN ;
       return ( true );      
     }
 //--- 
   return ( false );
  }

Es ist zwar nicht behoben, aber wenn Sie einen EA codieren möchten, der unter allen Umständen funktioniert, müssen Sie in Ihrem Code Folgendes tun:

  if(TestTrade.SetTypeFillingBySymbol(_Symbol))
    Print("True SetTypeFillingBySymbol");
  else
    {
    Print("False SetTypeFillingBySymbol");
    ENUM_SYMBOL_TRADE_EXECUTION exec=(ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_EXEMODE);
    if(exec==SYMBOL_TRADE_EXECUTION_MARKET || exec==SYMBOL_TRADE_EXECUTION_EXCHANGE)
      {
      TestTrade.SetTypeFilling(ORDER_FILLING_RETURN);
      Print("Order TypeFilling forced to ORDER_FILLING_RETURN");
      }
    else
      {
      //--- This should never happen if the broker server is configured correctly
      Alert("Order type filling can't be set. Impossible to trade (in theory).");      
      }
    }

Ich hoffe, Sie werden verstehen, dass jetzt etwas nicht stimmt.

Tatsächlich ist es sogar etwas komplizierter, wenn wir ausstehende Aufträge oder Marktaufträge berücksichtigen, aber lassen Sie es uns relativ einfach halten.