Frage zur Funktion OnTradeTransaction - Seite 2

 
Mikalas:

Ja, es ist möglich, OnTradeTransaction nicht zu verwenden, aber dann müssten Sie sich durch die Historie wühlen, was die Gesamtleistung des EAs verringern würde.

Jeder Entwickler hat eine Wahl!

Deshalb habe ich angefangen, in diese Richtung zu graben...

Danke für die Klarstellung. Ich werde weiter graben. Keiner drängt mich. :))))

 
AlexeyVik:

Deshalb habe ich angefangen, in diese Richtung zu graben...

Danke für die Klarstellung. Ich werde weiter graben. Keiner drängt mich. :))))

Die Sache ist, das Beispiel, das ich gegeben habe, ist nur eine Versicherung, dass das TradeTransaction Ereignis nicht passieren wird

In der Tat, ich habe 6 Monate der täglichen Arbeit des EA auf einem realen Konto mit 2000 Transaktionen pro Tag hatte,

Ich hatte noch NIE eine "Notsituation"!

Viel Glück!

 
C-4:
Als ob wir alles verstanden hätten und vor Freude in die Hände klatschen würden. Tut mir leid, aber Ihr Code ist eine Katastrophe.

Ach ja, das habe ich ganz vergessen, Vasiliy!

Der Code funktioniert zu 100% - werfen Sie den EA auf die Demo und sehen Sie, wie er funktioniert

im normalen Modus, und kommentieren Sie dann die Funktion OnTradeTransaction aus, und Sie werden

werden Sie sehen, wie der "Notfall"-Modus funktioniert.

 
AlexeyVik:

Also, wenn Sie nicht asynchrony verwenden, gibt es keine Notwendigkeit für OnTradeTransaction Handler, weil die Eulen für eine Antwort vom Server warten?

Machen Sie die Dinge nicht kompliziert. Für den Handel auf FORTS ist keine Asynchronität erforderlich. Für den Anfang siehe diesen Artikel, Kapitel 3: "Die Grundlagen der asynchronen Operationen". Es ist nicht viel, es ist sehr grundlegend, aber es ist genug, um mit dem Studium zu beginnen. Der dort beschriebene Code ist zu 100 % asynchron, aber das hindert ihn nicht daran, im synchronen Modus zu arbeiten, ohne alle OnTradeTransaction- und anderen Ereignisse zu erhalten.

AlexeyVik:

Bisher habe ich jedoch noch nicht herausgefunden, wie ich am besten feststellen kann, ob ein Stoppauftrag aktiviert wurde. Zum Beispiel, ich setze Markt Buy 0,1 und SellStop 0,3, aber wenn es 0,3 aktiviert, bleibt es 0,2 und an welchem Punkt sollte ich es folgen... Es stellt sich also heraus, dass wir bei jedem Tick zwei Befehle befolgen müssen. Und ich wollte die Eulen entlasten und nur kontrollieren, wenn die Transaktion stattfindet. Ich wollte nicht einmal kontrollieren, sondern prüfen, was passiert ist, und entscheiden, was zu tun ist. Aber ich denke, das ist nicht der Fall... Vielleicht ist es besser, zu den alten und bewährten Methoden zurückzukehren...

Die Lösung sollte sich an Ihrer Aufgabe orientieren. Im MetaTrader 5 haben Sie immer nur eine aktive Position, die Sie im Auge behalten müssen. Es besteht keine Notwendigkeit, die Bestellhistorie einzusehen. Wenn Sie dennoch die Auftragshistorie benötigen, müssen Sie Ihr Ziel klären.

 
Mikalas:

Ach ja, das habe ich ganz vergessen, Vasiliy!

Der Code funktioniert zu 100% - werfen Sie den EA auf die Demo und sehen Sie, wie er funktioniert

im normalen Modus, und kommentieren Sie dann die Funktion OnTradeTransaction aus, und Sie werden

werden Sie sehen, wie der "Notfall"-Modus funktioniert.

Ich habe mir Ihren Code genauer angesehen. Sie machen es zu kompliziert. Es sollte keinen "Notfall"-Modus geben. Unabhängig davon, ob Sie synchronen oder asynchronen Handel betreiben, müssen Sie sich auf die Analyse des Handelsumfelds konzentrieren. Die Analyse von Ereignissen des Typs OnTradeTransaction hat einen Hilfscharakter.

Mikalas:

Ja, Sie können auf die Verwendung von OnTradeTransaction verzichten, aber in diesem Fall müssen Sie die Historie durchsehen, was die Gesamtleistung eines EA erheblich beeinträchtigt.

Jeder Entwickler hat eine Wahl!

Das ist nicht wahr. Die Analyse der Historie beeinträchtigt die Leistung des EA nicht. Anstelle Ihrer langen CheckOrder() reicht es aus, etwas wie dieses zu schreiben (echter Arbeitscode):

///
/// Отслеживает поступление новых трейдов в истории трейдов.
///
void TrackingHistoryDeals()
{
    int total = HistoryDealsTotal();
    //Перебираем все доступные трейды и формируем на их основе прототипы будущих позиций типа COrder
    for(; dealsCountNow < HistoryDealsTotal(); dealsCountNow++)
    {  
        ulong ticket = HistoryDealGetTicket(dealsCountNow);
        AddNewDeal(ticket);
        graphRebuild = true;
    }
}

Das ist alles. Das Eintreffen neuer Abschlüsse wird automatisch von der Funktion TrackingHistoryDeals() erkannt, die wiederum vom System-Timer aufgerufen wird. Diese Funktion muss auch in OnTradeTransaction() aufgerufen werden, z.B. beim Auftreten des Ereignisses TRADE_TRANSACTION_DEAL_ADD, um Geschwindigkeit zu gewinnen und nicht von der eingestellten Timer-Erlaubnis abhängig zu sein. Wenn dieses Ereignis verloren geht, erfährt der Expert Advisor etwas später von den Änderungen (in meinem Fall sind es 200 ms), wartet auf den nächsten Aufruf des Timers und erhält Informationen über die Auslösung der Order.

 
C-4:

Ich habe mir Ihren Code genauer angesehen. Sie machen die Dinge kompliziert. Es sollte keinen "Crash"-Modus geben. Unabhängig davon, ob Sie einen synchronen oder asynchronen Handel betreiben, müssen Sie sich auf die Analyse des Handelsumfelds konzentrieren. Die Analyse von Ereignissen wie OnTradeTransaction hat einen Hilfscharakter.

Das ist nicht wahr. Die Analyse der Historie beeinträchtigt die Leistung des Expert Advisors nicht. Anstelle Ihrer langen CheckOrder() brauchen Sie nur etwas wie das Folgende zu schreiben (echter Arbeitscode):

Das ist alles. Das Eintreffen neuer Abschlüsse wird automatisch von der Funktion TrackingHistoryDeals() erkannt, die wiederum vom Systemtimer aufgerufen wird. Diese Funktion muss auch in OnTradeTransaction() aufgerufen werden, z.B. beim Auftreten des Ereignisses TRADE_TRANSACTION_DEAL_ADD, um Geschwindigkeit zu gewinnen und nicht von der eingestellten Timer-Erlaubnis abhängig zu sein. Wenn das Ereignis verloren geht, erfährt der Expert Advisor etwas später von den Änderungen (in meinem Fall sind es 200 ms), wartet auf den nächsten Aufruf des Timers und erhält Informationen über die Auslösung der Order.

Wir sprechen unterschiedliche Sprachen.

Sie vertreten Ihre Meinung, und ich werde, wenn Sie es mir erlauben, meine vertreten.

Sie sehen nicht einmal die offensichtlichen Dinge:

Wenn das TradeTransaction-Ereignis eintrifft, brauchen Sie nichts mehr zu überprüfen - ALLE Daten sind bereits vorhanden!

Die Funktion CheckOrder() funktioniert überhaupt nicht, wenn das Ereignis TradeTransaction eingetroffen ist!!!

 
Mikalas:

Wir sprechen in "verschiedenen Sprachen".

Bleiben Sie bei Ihrer Meinung, und ich werde, mit Ihrer Erlaubnis, bei meiner bleiben.

Nein, wir sprechen die gleiche Sprache - MQL5 und sein asynchroner Dialekt OrderSendAsync. Wie auch immer man es betrachtet, die Aufgaben in Async müssen auf die gleiche Weise gelöst werden. Schauen Sie sich meinen obigenArtikel an. Asynchroner Code - synchrone Interaktion mit externen Experten. Im Wesentlichen eine nicht-triviale Ausprägung des Polymorphismus. Das liegt daran, dass der Schwerpunkt dieses Codes auf der Analyse von Veränderungen im Handelsumfeld liegt. Dies beweist einmal mehr, dass das Ereignismodell zwar nützlich, aber zweitrangig ist und wir auch bei asynchronen Operationen darauf verzichten können.
 
C-4:
Nein, wir sprechen die gleiche Sprache - MQL5 und sein asynchroner Dialekt OrderSendAsync. Wie auch immer man es betrachtet, man muss mit Async die gleichen Probleme lösen. Schauen Sie sich meinen obigenArtikel an. Asynchroner Code - synchrone Interaktion mit externen Experten. Im Wesentlichen eine nicht-triviale Ausprägung des Polymorphismus. All dies ist der Tatsache zu verdanken, dass der Schwerpunkt dieses Codes auf der Analyse von Veränderungen im Handelsumfeld liegt. Dies beweist einmal mehr, dass das ereignisgesteuerte Modell zwar nützlich, aber zweitrangig ist und wir auch bei asynchronen Vorgängen ohne es auskommen können.
Vasiliy, seien Sie nicht stur, führen Sie das Beispiel auf Demo aus - dann werden Sie ALLES verstehen!
 
Mikalas:
Vasily, lassen Sie sich nicht aufhalten und führen Sie das Beispiel auf einer Demo aus - dann werden Sie ALLES verstehen!

Danke, ich habe keine Lust mehr:

2015.02.05 23:37:21.147 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 14

2015.02.05 23:37:20.767 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 13

2015.02.05 23:37:20.464 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 12

2015.02.05 23:37:20.105 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 11

2015.02.05 23:37:19.912 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 10

2015.02.05 23:37:19.832 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 9

2015.02.05 23:37:19.036 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 7

2015.02.05 23:37:05.723 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 6

2015.02.05 23:36:59.919 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 5

2015.02.05 23:36:59.199 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 4

2015.02.05 23:36:53.693 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 3

2015.02.05 23:36:52.689 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Orderticket nicht erhalten. Anfrage = 2

2015.02.05 23:36:44.410 Experten AutoTrading ist aktiviert

2015.02.05 23:36:41.995 TestTradeTrans (AUDCAD,H1) Order nicht gesendet! AUDCAD Return Code = AutoTrading ist vom Client-Terminal nicht erlaubt

2015.02.05 23:36:39.996 TestTradeTrans (AUDCAD,H1) Order nicht gesendet! AUDCAD Return Code = AutoTradeTrans ist vom Client-Terminal nicht erlaubt

2015.02.05 23:36:39.958 TestTradeTrans (AUDCAD,H1) Order nicht gesendet! AUDCAD Return Code = AutoTradeTrans ist vom Client-Terminal nicht erlaubt

2015.02.05 23:36:34.581 MQL5 'TestTradeTrans.mq5' erfolgreich kompiliert

Ich habe es geschafft, ihn zu deaktivieren, sonst hätte er das gesamte Terminal überflutet.

Z.I. Übrigens, versuchen Sie nicht, diesen Code in den Artikel einzubetten. Dieses Beispiel ist unter keinen Umständen akzeptabel, denn es spammt fürchterlich mit unzähligen Aufträgen bei jedem Tick!!!

 
C-4:

Danke, ich habe keine Lust mehr:

Ich habe es geschafft, ihn abzuschalten, sonst hätten die Sprünge das ganze Terminal überflutet.

:)

1. BEISPIEL für FORTS

2. kann man keine Brackpoints setzen?

3. Ich habe den Eindruck, dass Sie die Nachrichten durch eine Leitung lesen :)

Gehen wir es so an.

Ich werde Ihnen Fragen stellen, und Sie werden sie beantworten, OK?

Frage 1: Wie erkennen Sie das Order-Ticket (durch Senden des Befehls OrderSendAsync), wenn kein TradeTransaction-Ereignis eingetroffen ist (oder nicht verwendet wird)?

Grund der Beschwerde: