Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil VI): Ereignisse von Änderungen von Orders und Positionen" - Seite 2

 

Artem, nochmals vielen Dank!
Die Methode"void CEventsCollection::CreateNewEvent(COrderControl* order)" wird verwendet, um ein Handelsereignis in Abhängigkeit von der Art der Auftragsänderung zu erstellen, d.h. es wird ein Ereignis erstellt, das mit jeder Auftragsänderung verbunden ist.....
Und der Grund der Auftragsänderung wird an das erstellte Ereignis gesendet: EVENT_REASON_STOPLIMIT_TRIGGERED.

//--- Erstellen eines Ereignisses
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Ereigniszeit
      event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);  // Ereignisursache (aus der Aufzählung ENUM_EVENT_REASON)

Wenn ich Recht habe, korrigieren Sie es bitte, wenn nicht, erklären Sie bitte, was ich nicht gesehen habe.

Vielen Dank für die Bibliothek, Sie haben meine Arbeit in mehreren Fällen vereinfacht,
besonders wenn die Hauptarbeit nicht mit der Programmierung verbunden ist.

 
BmC:

Artem, nochmals vielen Dank!
Die Methode"void CEventsCollection::CreateNewEvent(COrderControl* order)" wird verwendet, um ein Handelsereignis in Abhängigkeit von der Art der Auftragsänderung zu erstellen, d.h. sie erstellt ein Ereignis, das mit jeder Auftragsänderung verbunden ist.....
Und der Grund der Auftragsänderung wird an das erstellte Ereignis gesendet: EVENT_REASON_STOPLIMIT_TRIGGERED.

Wenn ich richtig liege, korrigieren Sie mich bitte, wenn nicht, erklären Sie mir bitte, was ich nicht gesehen habe.

Vielen Dank für die Bibliothek, Sie haben meine Arbeit in mehreren Fällen vereinfacht,
besonders wenn die Hauptarbeit nicht mit der Programmierung verbunden ist.

Ohne auf die genaue Stelle der zitierten Zeilen zu verweisen, kann ich nicht verstehen, wovon Sie genau sprechen - nur durch Suchen (Umschalt+Strg+F) konnte ich diesen Code nicht in allen Bibliotheksdateien finden...

event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);

Wo ist er zu finden?

 
Hier sind die Zeilen aus der Beschreibung im ersten Teil dieses Artikels und der Code am Ende des Artikels:
//+------------------------------------------------------------------+
//|| Erzeugt ein Handelsereignis in Abhängigkeit von der Auftragsänderungsart.
//+------------------------------------------------------------------+
void CEventsCollection::CreateNewEvent(COrderControl* order)
  {
   if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
     {
      Print(DFUN,TextByLanguage("Abruf der aktuellen Preise nach Ereignissymbol fehlgeschlagen","Failed to get current prices by event symbol "),order.Symbol());
      return;
     }
   CEvent* event=NULL;
//--- Ausstehende StopLimit-Order ausgelöst
   if(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
     {
      this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
      event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
     }
//--- Änderung
   else
     {
      //--- Geänderter Preis für ausstehende Aufträge
      if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
      //--- Geänderter Preis der schwebenden Order und ihr StopLoss
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
      //--- Geänderter Preis des schwebenden Auftrags und sein TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
      //--- Änderung des Preises des schwebenden Auftrags, seines StopLoss und TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      //--- Geänderter StopLoss des schwebenden Auftrags
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Geänderter TakeProfit des schwebenden Auftrags
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- Geänderter StopLoss und TakeProfit des schwebenden Auftrags
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;

      //--- Geänderte StopLoss-Position
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Geänderte TakeProfit-Position
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- Geänderter StopLoss und TakeProfit der Position
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      
      //--- Erstellen eines Änderungsereignisses
      event=new CEventModify(this.m_trade_event_code,order.Ticket());
     }
//--- Erstellen eines Ereignisses
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Ereigniszeit
      event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);  // Ereignisursache (aus der Aufzählung ENUM_EVENT_REASON)
      event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // Auftragsart, deren Auslösung zu dem Ereignis führte
      event.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket());               // Ticket der Bestellung, die das Ereignis ausgelöst hat
      event.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder());             // Art der Ereignisbestellung
      event.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket());              // Veranstaltungsticket bestellen
      event.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder());          // Typ des ersten Positionsauftrags
      event.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket());           // Ticket der ersten Positionsbestellung
      event.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID());                 // Positionsbezeichner
      event.SetProperty(EVENT_PROP_POSITION_BY_ID,0);                               // Kennung der Zählerposition
      event.SetProperty(EVENT_PROP_MAGIC_BY_ID,0);                                  // Magische Nummer der Zählerposition
         
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev());      // Art des Positionsauftrags vor der Richtungsänderung
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket());           // Auftragsticket vor Richtungswechsel positionieren
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder());         // Auftragstyp der aktuellen Position
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket());          // Ticket der Reihenfolge der aktuellen Position
      
      event.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev());            // Auftrag zur Preisfestsetzung vor der Änderung
      event.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev());           // StopLoss-Kurs vor Änderung
      event.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev());         // TakeProfit-Preis vor Änderung
      event.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask);                // Preisanfrage zum Zeitpunkt der Veranstaltung
      event.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid);                // Geldkurs zum Zeitpunkt des Ereignisses
         
      event.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic());                      // Magische Bestellnummer
      event.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev());           // Zeitpunkt der ersten Positionsbestellung
      event.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev());                  // Der Preis, zu dem das Ereignis eingetreten ist
      event.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price());                       // Preisfestsetzung bestellen
      event.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price());                      // Schlusskurs der Bestellung
      event.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss());                      // StopLoss-Auftragspreis
      event.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit());                    // Preis des TakeProfit-Auftrags
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume());            // Gewünschtes Auftragsvolumen
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0);                        // Ausgeführtes Auftragsvolumen
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume());            // Verbleibendes (nicht ausgeführtes) Auftragsvolumen
      event.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0);                     // Ausgeführtes Positionsvolumen
      event.SetProperty(EVENT_PROP_PROFIT,0);                                       // Gewinn
      event.SetProperty(EVENT_PROP_SYMBOL,order.Symbol());                          // Symbol bestellen
      event.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol());                    // Symbol für die Zählerposition
      //--- Einstellung der Zeitplankennung des Kontrollprogramms, Dekodierung des Ereigniscodes und Einstellung des Ereignistyps
      event.SetChartID(this.m_chart_id);
      event.SetTypeEvent();
      //--- Wenn das Ereignisobjekt nicht in der Liste enthalten ist, fügen Sie es hinzu
      if(!this.IsPresentEventInList(event))
        {
         this.m_list_trade_events.InsertSort(event);
         //--- Senden einer Ereignismeldung und Setzen des Wertes des letzten Handelsereignisses
         event.SendEvent();
         this.m_trade_event=event.TradeEvent();
        }
      //--- Wenn dieses Ereignis bereits in der Liste enthalten ist - löschen Sie das neue Ereignisobjekt und geben Sie eine Fehlermeldung aus
      else
        {
         ::Print(DFUN_ERR_LINE,TextByLanguage("Eine solche Veranstaltung steht bereits auf der Liste".,"This event is already in the list."));
         delete event;
        }
     }
  }
Unterstreichen Sie diese Zeile!
 
Artyom Trishkin:

Ohne auf die genaue Stelle der zitierten Zeilen zu verweisen, kann ich nicht verstehen, wovon Sie genau sprechen - nur durch Suchen (Umschalt+Strg+F) konnte ich solchen Code nicht in allen Bibliotheksdateien finden...

Wo ist er zu finden?

Vielleicht haben Sie ihn in den nächsten Kapiteln der Bibliotheksbeschreibung bereits behoben? Für mich ist Ihre Bibliothek sehr geeignet für meine Strategie und ich verstehe sie sehr gut, da Sie neben der Bibliothek auch eine Methodik für die korrekte Programmierung erstellt haben.
 
BmC:
Hier sind die Zeilen aus der Beschreibung im ersten Teil dieses Artikels und der Code am Ende des Artikels: Unterstreichen Sie diese Zeile!

Im Moment - in der aktuellen Version der Bibliothek, sieht die Methode so aus:

//+------------------------------------------------------------------+
//|| Erzeugt ein Handelsereignis in Abhängigkeit von der Auftragsänderungsart.
//+------------------------------------------------------------------+
void CEventsCollection::CreateNewEvent(COrderControl* order)
  {
   ENUM_EVENT_REASON reason=WRONG_VALUE;
   if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
     {
      ::Print(DFUN,CMessage::Text(MSG_LIB_SYS_NOT_GET_CURR_PRICES),order.Symbol());
      return;
     }
   CEvent* event=NULL;
//--- Ausstehende StopLimit-Order ausgelöst
   if(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
     {
      reason=EVENT_REASON_STOPLIMIT_TRIGGERED;
      this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
      event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
     }
//--- Änderung
   else
     {
      //--- Geänderter Preis für ausstehende Aufträge
      if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
      //--- Änderung des Preises der schwebenden Order und ihres StopLoss
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
      //--- Geänderter Preis des schwebenden Auftrags und sein TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
      //--- Änderung des Preises des schwebenden Auftrags, seines StopLoss und TakeProfit
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      //--- Geänderter StopLoss des schwebenden Auftrags
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Geänderter TakeProfit des schwebenden Auftrags
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- Geänderter StopLoss und TakeProfit des schwebenden Auftrags
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;

      //--- Geänderte StopLoss-Position
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- Geänderte TakeProfit-Position
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- Geänderter StopLoss und TakeProfit der Position
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      
      //--- Erstellen eines Änderungsereignisses
      reason=EVENT_REASON_MODIFY;
      event=new CEventModify(this.m_trade_event_code,order.Ticket());
     }
//--- Erstellen eines Ereignisses
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // Ereigniszeit
      event.SetProperty(EVENT_PROP_REASON_EVENT,reason);                            // Ereignisursache (aus der Aufzählung ENUM_EVENT_REASON)
      event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // Auftragsart, deren Auslösung zu dem Ereignis führte
      event.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket());               // Ticket der Bestellung, die das Ereignis ausgelöst hat
      event.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder());             // Art der Ereignisbestellung
      event.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket());              // Veranstaltungsticket bestellen
      event.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder());          // Typ des ersten Positionsauftrags
      event.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket());           // Ticket der ersten Positionsbestellung
      event.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID());                 // Positionsbezeichner
      event.SetProperty(EVENT_PROP_POSITION_BY_ID,0);                               // Kennung der Zählerposition
      event.SetProperty(EVENT_PROP_MAGIC_BY_ID,0);                                  // Magische Nummer der Zählerposition
         
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev());      // Art des Positionsauftrags vor der Richtungsänderung
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket());           // Auftragsticket vor Richtungswechsel positionieren
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder());         // Auftragstyp der aktuellen Position
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket());          // Ticket der Reihenfolge der aktuellen Position
      
      event.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev());            // Auftrag zur Preisfestsetzung vor der Änderung
      event.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev());           // StopLoss-Kurs vor Änderung
      event.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev());         // TakeProfit-Preis vor Änderung
      event.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask);                // Preisanfrage zum Zeitpunkt der Veranstaltung
      event.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid);                // Angebotspreis zum Zeitpunkt des Ereignisses
         
      event.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic());                      // Magische Bestellnummer
      event.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev());           // Zeitpunkt der ersten Positionsbestellung
      event.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev());                  // Der Preis, zu dem das Ereignis eingetreten ist
      event.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price());                       // Preisfestsetzung bestellen
      event.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price());                      // Schlusskurs der Bestellung
      event.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss());                      // StopLoss-Auftragspreis
      event.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit());                    // Preis des TakeProfit-Auftrags
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume());            // Gewünschtes Auftragsvolumen
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0);                        // Ausgeführtes Auftragsvolumen
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume());            // Verbleibendes (nicht ausgeführtes) Auftragsvolumen
      event.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0);                     // Ausgeführtes Positionsvolumen
      event.SetProperty(EVENT_PROP_PROFIT,0);                                       // Gewinn
      event.SetProperty(EVENT_PROP_SYMBOL,order.Symbol());                          // Symbol bestellen
      event.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol());                    // Symbol für die Zählerposition
      //--- Dekodierung des Ereigniscodes und Einstellung des Ereignistyps
      event.SetTypeEvent();
      //--- Wenn das Ereignisobjekt nicht in der Liste enthalten ist, fügen Sie es hinzu
      if(!this.IsPresentEventInList(event))
        {
         this.m_list_trade_events.InsertSort(event);
         //--- Senden einer Ereignismeldung und Setzen des Wertes des letzten Handelsereignisses
         this.m_trade_event=event.TradeEvent();
         this.m_is_event=true;
         event.SendEvent();
         CBaseObjExt::EventAdd(this.m_trade_event,order.Ticket(),order.Price(),order.Symbol());
        }
      //--- Wenn dieses Ereignis bereits in der Liste enthalten ist - löschen Sie das neue Ereignisobjekt und geben Sie eine Fehlermeldung aus
      else
        {
         ::Print(DFUN_ERR_LINE,CMessage::Text(MSG_LIB_SYS_EVENT_ALREADY_IN_LIST));
         delete event;
        }
     }
  }
//+------------------------------------------------------------------+

Also, entweder war es ein Fehler und wurde längst behoben, oder es ist in der diskutierten Version der Bibliothek nicht kritisch. Ich weiß nicht mehr genau, wie es war....

 
Artyom Trishkin:

Im Moment - in der aktuellen Version der Bibliothek - sieht die Methode wie folgt aus:

Also, entweder war es ein Fehler und wurde längst behoben, oder es ist in der diskutierten Version der Bibliothek nicht kritisch. Ich weiß nicht mehr genau, wie es war...

Das ist sehr wichtig, vom Autor ist es sogar noch wichtiger. Wenn Sie Ihre ursprüngliche Idee nicht aufgegeben haben. Um unerfahrenen Programmierern wie mir bei meiner Arbeit zu helfen. Wenn man ein Anfänger (ein Student) ist und gerade eine Programmiersprache oder das Programmieren im Allgemeinen lernt, gibt es eine Menge Zweifel und Fragen, wenn man seine Arbeit (Bibliothek) studiert. In diesem Fall war ich mir bis zum letzten Moment nicht sicher, ob es ein Fehler oder Ihre Absicht war. Ich bin Ihren Code mehr als einmal durchgegangen. Und für mich ist es sehr wichtig: "entweder habe ich den Sinn des Autors nicht verstanden, oder es ist nur ein Tippfehler des Autors in seinem großen Projekt."
Und wie können Sie sagen, dass es nicht kritisch ist?! Das ist falsch von Ihnen, damit verwirren Sie und ich nur die Leser. Die studieren oder lernen, wie ich, aus Ihrer Bibliothek.

 
BmC:

Das ist sehr wichtig, aus Sicht des Autors ist es sogar noch wichtiger. Wenn Sie Ihre ursprüngliche Idee nicht aufgegeben haben. Um Programmieranfängern wie mir bei meiner Arbeit zu helfen. Wenn man ein Anfänger (ein Student) ist und gerade eine Programmiersprache oder das Programmieren im Allgemeinen lernt, gibt es eine Menge Zweifel und Fragen, wenn man seine Arbeit (Bibliothek) studiert. In diesem Fall war ich mir bis zum letzten Moment nicht sicher, ob es ein Fehler oder Ihre Absicht war. Ich bin Ihren Code mehr als einmal durchgegangen. Und für mich ist es sehr wichtig: "entweder habe ich den Sinn des Autors nicht verstanden, oder es ist nur ein Tippfehler des Autors in seinem großen Projekt."
Und wie können Sie sagen, dass es nicht kritisch ist?! Das ist falsch von Ihnen, damit verwirren Sie und ich nur die Leser. Die studieren oder lernen, wie ich, aus Ihrer Bibliothek.

:)

Ich habe Ihnen den Code mit den farblich hervorgehobenen Korrekturen gezeigt. Füge sie in die Version der Bibliothek ein, die diesem Artikel beigefügt ist.

Ich weiß natürlich nicht mehr, ob es mein Fehler war oder ob er in dieser Version nicht kritisch ist und mir deshalb beim Debuggen entgangen ist. Immerhin sind es schon über vierzig Artikel, und dieser ist schon so lange her. Höchstwahrscheinlich handelte es sich um einen Fehler, der in späteren Artikeln korrigiert wurde - viele Dinge in der Bibliothek werden bereits im laufenden Betrieb erstellt. Natürlich gab es, und zwar mehr als eine, Testversionen der Bibliothek. Aber seit dem Beginn der Beschreibung ihrer Erstellung wurde vieles überarbeitet und hinzugefügt. Deshalb ist diese Artikelserie als eine Beschreibung der Erstellung der Bibliothek angelegt. Auf diese Weise versuche ich, den Leser in den Prozess der Erstellung der Bibliothek einzubeziehen. Mit Versuchen und Fehlern und mit Anleitungen, wie man sie behebt - um den ganzen Prozess sichtbar zu machen - um sozusagen "all die Schmerzen der Schöpfung" zu enthüllen :) :)

Ich entschuldige mich also für etwaige Unklarheiten in Ihrem Verständnis dessen, was vor sich geht.....
Nehmen Sie einfach die oben vorgeschlagenen Änderungen vor. Oder lassen Sie es bis zu dem Artikel, in dem es korrigiert wird.

 
Ich möchte das letzte Ereignissymbol, das Ticket und den Typ (Öffnen, Schließen, Ändern) abrufen, wie geht das?
 
Andrii Miknevich:
Ich möchte das letzte Ereignissymbol, das Ticket und den Typ (Öffnen, Schließen, Änderung) abfragen. Wie mache ich das richtig?

Wie ich sehe, ist Artyom so beschäftigt, dass er gar nicht im Forum erscheint. )))))))) Vielleicht kann ich Ihnen einen Tipp geben, nachdem ich mit seiner Bibliothek experimentiert habe. Heute bin ich diese Experimente durchgegangen und habe eine solche Funktion gefunden. In dem Kommentar steht, dass die Funktion eine Liste aller offenen Stellen bekommt.

void OrderActivated()
{
Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
//--- Abrufen der Liste aller offenen Stellen
CArrayObj* list = engine.GetListMarketPosition();
if(list == NULL || list.Total() == 0)
return;
int index = CSelect::FindOrderMax(list, ORDER_PROP_TIME_OPEN);
COrder *pos = list.At(index);
if(pos == NULL)
return;

pos.Print();
}/*******************************************************************/

Leider kann ich nicht erklären, wofür sie da ist, ich habe alles vergessen, aber vielleicht kannst du es herausfinden....

Nun... wenn Sie das nicht können, warten Sie. Artem wird Zeit finden und antworten.

 

Wenn ein Tick empfangen wird, auf den eine Pending Order gesetzt und gleichzeitig aktiviert (getriggert) wird (ich habe mit Buy Stop getestet), registriert Ihre Engine nicht alle Ereignisse...

Das Ereignis TRADE_EVENT_PENDING_ORDER_PLASED wird empfangen, aber nicht TRADE_EVENT_PENDING_ORDER_ACTIVATED.

Mein Code sieht ungefähr so aus:

//+------------------------------------------------------------------+
//| Handelsereignisse verarbeiten|
//+------------------------------------------------------------------+ 
void ProcessTradeEvents(void)
  {
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
   static CEvent *last_processed=NULL;
   
   if(engine.LastTradeEvent()!=last_event)
     {      
      if(last_event==TRADE_EVENT_NO_EVENT)
         return;
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      list=CSelect::ByEventProperty(list,EVENT_PROP_SYMBOL,Symbol(),EQUAL);
      if(list==NULL || list.Total()<=0)
         return;      
      last_event=engine.LastTradeEvent();
      //--- Index des alten Ereignisses abrufen
      int index_of_old_event=0;
      if(last_processed==NULL)
         index_of_old_event=-1;
      else
        {
         for(int i=list.Total()-1;i>=0;i--)
           {
            CEvent *event=list.At(i);
            if(event==NULL)
               return;
            ENUM_TRADE_EVENT event_type=event.TypeEvent();
            if(last_processed!=NULL && event.IsEqual(last_processed))
              {
               index_of_old_event=i;
               break;
              }
           }
        }
      //--- Überprüfung aller neuen Ereignisse
      for(int i=index_of_old_event+1;i<list.Total();i++)
        {
         CEvent *event=list.At(i);
         if(event==NULL)
            break;
         if(last_processed!=NULL && event.IsEqual(last_processed))
            break; 
         Print(__FUNCTION__+": event : ",event.TypeEventDescription());
         switch(event.TypeEvent())
           {
            case TRADE_EVENT_PENDING_ORDER_PLASED:
              {
               // etwas Code
              }
            break;
            case TRADE_EVENT_PENDING_ORDER_REMOVED:
              {
               // etwas Code
              }
            break;
            case TRADE_EVENT_PENDING_ORDER_ACTIVATED:
              {
               // etwas Code
              }
            break;

            case TRADE_EVENT_POSITION_CLOSED:
              {
               // etwas Code
              }
            break;
            case TRADE_EVENT_POSITION_CLOSED_BY_SL:
              {
               // etwas Code
              }
            break;
            case TRADE_EVENT_POSITION_CLOSED_BY_TP:
              {
                // etwas Code
              }
            break;
            case TRADE_EVENT_MODIFY_ORDER_PRICE:
              {
                // etwas Code
              }
            break;

            case TRADE_EVENT_MODIFY_POSITION_SL:
              {
                // etwas Code
              }
            break;
            case TRADE_EVENT_MODIFY_POSITION_TP:
              {
                // etwas Code
              }
            break;
           }
        }
      last_processed=list.At(list.Total()-1);
      Comment("\nLast trade event: ",last_processed.TypeEventDescription());
     }
  }

Ich suche zuerst den Index des alten (verarbeiteten) Ereignisses in der Schleife, und dann gehe ich von ihm ausgehend in einer Schleife durch alle neuen Ereignisse bis zum Ende. Also, in einer Situation, in der auf einen Tick eine Limit-Order gesetzt wird und striggeren erhält ein Ereignis über die Einstellung... Bitte kommentieren.

Ich rufe ProcessTradeEvents() in OnTick() nach engine.OnTick(rates_data) auf.
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Свойства ордеров - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5