Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil IV)." - Seite 3

 

Das ist vom Gehalt her wie eine sehr interessante Vorlesung. Ich werde auf jeden Fall die ganze Serie mitmachen.

Leider kommt es vielleicht sogar mit Absicht zu kleinen Fehlern - der Inhalt ist sehr komplex und vielleicht soll man am Ball bleiben.

Und zwar wird in der "

CMarketCollection::Refresh

" das Feld total_market nicht gefunden - sowas passierte schon vorher bei ORDER_STATUS_MARKET. Die Umstellungen von leicht-zu-komplex ist nunmal sehr beeindruckend. 

An der Refresh-Stelle ging es bei mir nicht mehr weiter, da auch das nächste Objekt nicht auf Anhieb laufen wollte. Da habe ich dann gerne den Download genommen.

mfG

Marc Tolkmitt

 

Seltsam, ich kann die einfachste Logik mit Ihren Methoden nicht erkennen...

Hier muss ich die Schlusszeit des letzten Handels abfragen. Es scheint, dass die Bibliothek einen Mechanismus für die Arbeit mit abstrakten Aufträgen a la MT4 hat, aber ich sehe keine Methoden für die Arbeit mit ihnen.

Ich fordere Deals an, aber ORDER_PROP_TIME_CLOSE wird nicht unterstützt:

bool last_trade_time_filter=true;
   CArrayObj *all_trades=engine.GetListDeals();
   if(all_trades!=NULL && all_trades.Total()>0)
     {
      CArrayObj *sym_all_trades=CSelect::ByOrderProperty(all_trades,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
      if(sym_all_trades!=NULL && sym_all_trades.Total()>0)
        {
         CArrayObj *sym_all_trades_recent=CSelect::ByOrderProperty(sym_all_trades,ORDER_PROP_TIME_CLOSE,iTime(NULL,PERIOD_CURRENT,1),EQUAL_OR_MORE);
         if(sym_all_trades_recent.Total()>0)
           {
            // es kommt nicht hierher
            last_trade_time_filter=false;
           }
            
        }
     }
 
leonerd die Schlusszeit des letzten Handels abfragen. Es scheint, dass die Bibliothek einen Mechanismus für die Arbeit mit abstrakten Aufträgen a la MT4 hat, aber ich sehe keine Methoden für die Arbeit mit ihnen.

Ich fordere Deals an, aber ORDER_PROP_TIME_CLOSE wird nicht unterstützt:

Ok, es ist irgendwie nicht korrekt, die Schlusszeit für einen Trade abzufragen. Aber es funktioniert auch nicht mit GetListHistoryOrders()...

 
leonerd die Schlusszeit des letzten Handels abfragen. Es scheint, dass die Bibliothek einen Mechanismus für die Arbeit mit abstrakten Aufträgen a la MT4 hat, aber ich sehe keine Methoden für die Arbeit mit ihnen.

Ich fordere Deals an, aber ORDER_PROP_TIME_CLOSE wird nicht unterstützt:

Im Testexpert Advisor, im Button Press Handler.

//+------------------------------------------------------------------+
//| Behandlung von Tastendrucken|
//+------------------------------------------------------------------+
void PressButtonEvents(const string button_name)

(und dies ist nur ein Beispiel dafür, wie man Ereignisse behandelt und Daten abruft).

Dort gibt es Codeblöcke, die für das Schließen von Positionen zuständig sind. Sie können sehen, wie es dort implementiert ist. Zum Beispiel ein Codeblock zum Schließen eines Kaufs durch das aktuelle Symbol mit maximalem Gewinn:

      //--- Wenn die Taste BUTT_CLOSE_BUY gedrückt wird: Kauf mit maximalem Gewinn schließen
      else if(button==EnumToString(BUTT_CLOSE_BUY))
        {
         //--- Abrufen der Liste aller offenen Stellen
         CArrayObj* list=engine.GetListMarketPosition();
         //--- Wählen Sie aus der Liste nur Kaufpositionen und nur nach dem aktuellen Symbol
         list=CSelect::ByOrderProperty(list,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
         list=CSelect::ByOrderProperty(list,ORDER_PROP_TYPE,POSITION_TYPE_BUY,EQUAL);
         //--- Sortieren der Liste nach Gewinn unter Berücksichtigung von Provision und Swap
         list.Sort(SORT_BY_ORDER_PROFIT_FULL);
         //--- Ermittelt den Index der Kaufposition mit dem höchsten Gewinn
         int index=CSelect::FindOrderMax(list,ORDER_PROP_PROFIT_FULL);
         if(index>WRONG_VALUE)
           {
            //--- Abrufen des Objekts "Kaufposition" und Schließen der Ticketposition
            COrder* position=list.At(index);
            if(position!=NULL)
              {
               //--- Wenn die Schaltflächen für die Erstellung eines schwebenden Antrags nicht gedrückt werden - schließen Sie die Position
               if(!pressed_pending_close_buy)
                  engine.ClosePosition((ulong)position.Ticket());
               //--- Andernfalls - Erstellen einer ausstehenden Anfrage zur Schließung einer Position für ein Ticket
               //--- und Bedingungen in Abhängigkeit von aktiven Schaltflächen festlegen
               else
                 {
                  int id=engine.ClosePositionPending(position.Ticket());
                  if(id>0)
                    {
                     //--- den Preis und die Aktivierungszeit der anstehenden Anfrage festlegen und die Aktivierungsparameter einstellen
                     double bid=SymbolInfoDouble(NULL,SYMBOL_BID);
                     double price_activation=NormalizeDouble(bid+distance_pending_request*g_point,g_digits);
                     ulong  time_activation=TimeCurrent()+bars_delay_pending_request*PeriodSeconds();
                     SetPReqCriterion((uchar)id,price_activation,time_activation,BUTT_CLOSE_BUY,EQUAL_OR_MORE,bid,TimeCurrent());
                    }
                 }
              }
           }
        }

Über geschlossene Positionen - ich habe es vor langer Zeit gemacht, jetzt kann ich Ihnen nicht sagen, wie Sie auf einen Blick bekommen, was Sie brauchen. Ich werde es mir später ansehen und schreiben - ich bin im Moment sehr beschäftigt.

 
Artyom Trishkin #:

Im Test-Expert Advisor, im Button Press Handler

(und dies ist nur ein Beispiel für die Verarbeitung von Ereignissen und den Erhalt von Daten).

Dort gibt es Codeblöcke, die für das Schließen von Positionen zuständig sind. Sie können dort sehen, wie es implementiert ist. Zum Beispiel ein Codeblock zum Schließen eines Kaufs auf dem aktuellen Symbol mit maximalem Gewinn:

Über geschlossene Positionen - ich habe es vor langer Zeit gemacht, jetzt kann ich Ihnen nicht sagen, wie Sie auf einen Blick bekommen, was Sie brauchen. Ich werde es mir später ansehen und schreiben - ich bin im Moment sehr beschäftigt.

Danke, aber es ist nicht nötig, die Veranstaltung zu verfolgen.

 
ORDER_STATUS_MARKET_ORDER gibt Fehler: undeclared Bezeichner. sieht aus wie Dinge in den letzten Versionen für MQL 5 geändert, es zeigt sich sowohl in COrder::OrderMagicNumber und CMarketOrder Constructor!
 
theonementor # :
ORDER_STATUS_MARKET_ORDER gibt Fehler: undeclared Bezeichner. sieht aus wie Dinge in den letzten Versionen für MQL 5 geändert, es zeigt sich sowohl in COrder::OrderMagicNumber und CMarketOrder Constructor!

Ich habe die MQL5.zip-Archivdatei heruntergeladen, die dem Artikel beigefügt ist - jede Datei einzeln und alle zusammen (beim Kompilieren von Engine.mqh oder TestDoEasyPart04.mq5) werden ohne Fehler kompiliert.

Was genau tun Sie, dass Sie einen Kompilierungsfehler erhalten?

 
Artyom Trishkin #:

Ich habe die MQL5.zip-Archivdatei heruntergeladen, die dem Artikel beigefügt ist - jede Datei einzeln und alle zusammen (beim Kompilieren von Engine.mqh oder TestDoEasyPart04.mq5) werden ohne Fehler kompiliert.

Was genau tun Sie, dass Sie einen Kompilierungsfehler erhalten?

Ich habe es herausgefunden, es fehlte ein Eintrag im define enum. irgendwie fehlte er (obwohl ich den Code aus dem Tutorial in den Editor kopiert habe)
 
theonementor # :
Habe es herausgefunden, es fehlte ein Eintrag in der define enum. irgendwie fehlte er (obwohl ich den Code aus dem Tutorial in den Editor kopiert habe)

Die Codes im Artikel stimmen nicht immer mit den Codes in den angehängten Dateien überein. Manchmal übersehe ich etwas während der Beschreibung, und manchmal wird etwas nach dem Schreiben des Artikels hinzugefügt. Der Artikel ist keine Schritt-für-Schritt-Anleitung im "read-copy-use"-Stil, sondern nur eine detaillierte Erklärung in Form von Schulungsmaterial. Und kleine Fehler und Auslassungen regen zum Nachdenken an, und das ist gut so)