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 Ereignissesif(event!=NULL)
{
event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time()); // Ereigniszeitevent.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.
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...
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östif(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());
}
//--- Änderungelse
{
//--- Geänderter Preis für ausstehende Aufträgeif(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 StopLosselseif(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 TakeProfitelseif(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 TakeProfitelseif(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 Auftragselseif(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 Auftragselseif(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 Auftragselseif(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-Positionelseif(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
//--- Geänderte TakeProfit-Positionelseif(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 Positionelseif(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 Änderungsereignissesevent=new CEventModify(this.m_trade_event_code,order.Ticket());
}
//--- Erstellen eines Ereignissesif(event!=NULL)
{
event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time()); // Ereigniszeitevent.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ührteevent.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket()); // Ticket der Bestellung, die das Ereignis ausgelöst hatevent.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder()); // Art der Ereignisbestellungevent.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket()); // Veranstaltungsticket bestellenevent.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder()); // Typ des ersten Positionsauftragsevent.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket()); // Ticket der ersten Positionsbestellungevent.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID()); // Positionsbezeichnerevent.SetProperty(EVENT_PROP_POSITION_BY_ID,0); // Kennung der Zählerpositionevent.SetProperty(EVENT_PROP_MAGIC_BY_ID,0); // Magische Nummer der Zählerpositionevent.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev()); // Art des Positionsauftrags vor der Richtungsänderungevent.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket()); // Auftragsticket vor Richtungswechsel positionierenevent.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder()); // Auftragstyp der aktuellen Positionevent.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket()); // Ticket der Reihenfolge der aktuellen Positionevent.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev()); // Auftrag zur Preisfestsetzung vor der Änderungevent.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev()); // StopLoss-Kurs vor Änderungevent.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev()); // TakeProfit-Preis vor Änderungevent.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask); // Preisanfrage zum Zeitpunkt der Veranstaltungevent.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid); // Geldkurs zum Zeitpunkt des Ereignissesevent.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic()); // Magische Bestellnummerevent.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev()); // Zeitpunkt der ersten Positionsbestellungevent.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev()); // Der Preis, zu dem das Ereignis eingetreten istevent.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price()); // Preisfestsetzung bestellenevent.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price()); // Schlusskurs der Bestellungevent.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss()); // StopLoss-Auftragspreisevent.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit()); // Preis des TakeProfit-Auftragsevent.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume()); // Gewünschtes Auftragsvolumenevent.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0); // Ausgeführtes Auftragsvolumenevent.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume()); // Verbleibendes (nicht ausgeführtes) Auftragsvolumenevent.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0); // Ausgeführtes Positionsvolumenevent.SetProperty(EVENT_PROP_PROFIT,0); // Gewinnevent.SetProperty(EVENT_PROP_SYMBOL,order.Symbol()); // Symbol bestellenevent.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 Ereignistypsevent.SetChartID(this.m_chart_id);
event.SetTypeEvent();
//--- Wenn das Ereignisobjekt nicht in der Liste enthalten ist, fügen Sie es hinzuif(!this.IsPresentEventInList(event))
{
this.m_list_trade_events.InsertSort(event);
//--- Senden einer Ereignismeldung und Setzen des Wertes des letzten Handelsereignissesevent.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 auselse
{
::Print(DFUN_ERR_LINE,TextByLanguage("Eine solche Veranstaltung steht bereits auf der Liste".,"This event is already in the list."));
delete event;
}
}
}
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östif(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());
}
//--- Änderungelse
{
//--- Geänderter Preis für ausstehende Aufträgeif(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 StopLosselseif(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 TakeProfitelseif(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 TakeProfitelseif(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 Auftragselseif(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 Auftragselseif(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 Auftragselseif(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-Positionelseif(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
//--- Geänderte TakeProfit-Positionelseif(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 Positionelseif(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 Änderungsereignissesreason=EVENT_REASON_MODIFY;event=new CEventModify(this.m_trade_event_code,order.Ticket());
}
//--- Erstellen eines Ereignissesif(event!=NULL)
{
event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time()); // Ereigniszeitevent.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ührteevent.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket()); // Ticket der Bestellung, die das Ereignis ausgelöst hatevent.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder()); // Art der Ereignisbestellungevent.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket()); // Veranstaltungsticket bestellenevent.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder()); // Typ des ersten Positionsauftragsevent.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket()); // Ticket der ersten Positionsbestellungevent.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID()); // Positionsbezeichnerevent.SetProperty(EVENT_PROP_POSITION_BY_ID,0); // Kennung der Zählerpositionevent.SetProperty(EVENT_PROP_MAGIC_BY_ID,0); // Magische Nummer der Zählerpositionevent.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev()); // Art des Positionsauftrags vor der Richtungsänderungevent.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket()); // Auftragsticket vor Richtungswechsel positionierenevent.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder()); // Auftragstyp der aktuellen Positionevent.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket()); // Ticket der Reihenfolge der aktuellen Positionevent.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev()); // Auftrag zur Preisfestsetzung vor der Änderungevent.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev()); // StopLoss-Kurs vor Änderungevent.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev()); // TakeProfit-Preis vor Änderungevent.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask); // Preisanfrage zum Zeitpunkt der Veranstaltungevent.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid); // Angebotspreis zum Zeitpunkt des Ereignissesevent.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic()); // Magische Bestellnummerevent.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev()); // Zeitpunkt der ersten Positionsbestellungevent.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev()); // Der Preis, zu dem das Ereignis eingetreten istevent.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price()); // Preisfestsetzung bestellenevent.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price()); // Schlusskurs der Bestellungevent.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss()); // StopLoss-Auftragspreisevent.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit()); // Preis des TakeProfit-Auftragsevent.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume()); // Gewünschtes Auftragsvolumenevent.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0); // Ausgeführtes Auftragsvolumenevent.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume()); // Verbleibendes (nicht ausgeführtes) Auftragsvolumenevent.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0); // Ausgeführtes Positionsvolumenevent.SetProperty(EVENT_PROP_PROFIT,0); // Gewinnevent.SetProperty(EVENT_PROP_SYMBOL,order.Symbol()); // Symbol bestellenevent.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol()); // Symbol für die Zählerposition//--- Dekodierung des Ereigniscodes und Einstellung des Ereignistypsevent.SetTypeEvent();
//--- Wenn das Ereignisobjekt nicht in der Liste enthalten ist, fügen Sie es hinzuif(!this.IsPresentEventInList(event))
{
this.m_list_trade_events.InsertSort(event);
//--- Senden einer Ereignismeldung und Setzen des Wertes des letzten Handelsereignissesthis.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 auselse
{
::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....
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.
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.
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 abrufenint 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 Ereignissefor(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 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
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.
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.
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?
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?
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:
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....
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.
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, Ä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.
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:
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.