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 3

 
leonerd:

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. In einer Situation, in der bei einem Tick eine Limit-Order gesetzt wird und striggeren ein Ereignis über das Setzen erhält... Bitte kommentieren.

Ich rufe ProcessTradeEvents() in OnTick() nach engine.OnTick(rates_data) auf.

Der Auftrag wurde von Ihrer Engine erteilt. Vielleicht habe ich es noch aufgerufen, als es noch keine Aktivierung gab..... Ich werde es jetzt mit einer manuellen Order überprüfen.

 
leonerd:

Der Auftrag wurde von Ihrer eigenen Maschine erteilt. Vielleicht habe ich ihn noch aufgerufen, als es noch keine Aktivierung gab..... Ich werde das jetzt mit einer manuellen Bestellung überprüfen.

Ja, ich glaube, es sind meine Hände, die krumm sind....

 
leonerd:

Ja, ich glaube, meine Hände sind schief...

Nein, es ist in der Bibliothek. Genauer gesagt, liegt es nicht in der Bibliothek, sondern in der Besonderheit der Aufzeichnung der Bestellhistorie im Terminal. In späteren Versionen der Bibliothek wird diese Besonderheit berücksichtigt, und alles wird korrekt aufgezeichnet. Versuchen Sie es mit Versionen um den 30. Januar herum - vor dem Thema Indikatoren. Ich kann mich nicht mehr daran erinnern, wo es jetzt behoben wurde. Ich habe aber in einem späteren Artikel darüber geschrieben - dort gab es eine Korrektur.
 

Hallo.

Ich bin beim Testen von TestDoEasyPart08.mq5 auf dieses Problem gestoßen - StopLoss und TakeProfit funktionieren nicht. Obwohl sie gesetzt sind - erscheinen die entsprechenden Linien auf dem Chart, und es kommen Meldungen an das Journal. Wenn Sie TrailStop einschalten, wird TakeProfit ausgelöst, aber StopLoss immer noch nicht. Was kann der Grund dafür sein?

P.S. Ich habe den gleichen Code auf einem anderen Computer (Laptop) ausgeführt und er funktioniert einwandfrei. Obwohl dort der gleiche Metatrader installiert ist.

 
MQL_User #:

Hallo.

Ich bin beim Testen von TestDoEasyPart08.mq5 auf dieses Problem gestoßen - StopLoss und TakeProfit funktionieren nicht. Obwohl sie gesetzt sind - erscheinen die entsprechenden Linien auf dem Chart, und es kommen Meldungen an das Journal. Wenn Sie TrailStop einschalten, wird TakeProfit ausgelöst, aber StopLoss immer noch nicht. Was kann der Grund dafür sein?

P.S. Ich habe den gleichen Code auf einem anderen Computer (Laptop) ausgeführt und er funktioniert einwandfrei. Obwohl dort der gleiche Metatrader installiert ist.

Guten Abend, bitte zeigen Sie zumindest die Meldungen, die im Log erscheinen.

Mit freundlichen Grüßen, Vladimir.

 
MQL_User #:

Hallo.

Ich bin beim Testen von TestDoEasyPart08.mq5 auf dieses Problem gestoßen - StopLoss und TakeProfit funktionieren nicht. Obwohl sie gesetzt sind - erscheinen die entsprechenden Linien auf dem Chart, und es kommen Meldungen an das Journal. Wenn Sie TrailStop einschalten, wird TakeProfit ausgelöst, aber StopLoss immer noch nicht. Was kann der Grund dafür sein?

P.S. Ich habe den gleichen Code auf einem anderen Computer (Laptop) ausgeführt und er funktioniert einwandfrei. Obwohl dort der gleiche Metatrader installiert ist.

Wenn Stop-(Limit-)Orders platziert werden, hängt ihre Auslösung nicht vom Programm, sondern vom Broker ab. Der Auftrag zur Platzierung von Stop-(Limit-)Orders wird vom Programm an den Server gesendet, und ihre Auslösung hängt vom Broker ab. Da sie platziert werden (ihre Linien werden auf dem Chart angezeigt), gibt es keine Fehler seitens des Programms. Höchstwahrscheinlich erreicht der Kurs die Stop-(Limit-)Orders nicht.

 
MrBrooklin #:

Guten Abend, zeigen Sie wenigstens die protokollierten Meldungen an.

Mit freundlichen Grüßen, Vladimir.

MrBrooklin, Artem.

Ich habe es im Strategietester gemacht (so wie ich es verstehe, hat der Broker nichts damit zu tun).

Die Meldungen lauten wie folgt:

2022.07.03 11:16:39.380 2022.01.03 07:00:00 instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 deal #2 buy 0.1 @Si at 81011 done (based on order #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 Geschäft durchgeführt [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 Auftrag durchgeführt buy 0.1 at 81011 [#2 buy 0.1 @Si at 81011]

Aber auf einem anderen Computer (Laptop), auf dem StopLoss und TakeProfit korrekt funktionieren, lauten die Meldungen wie folgt:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 Auftrag ausgeführt buy 0.1 at 81047 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - Position offen: 2022.01.03 07.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Opened 0.10 Buy #2 [0.10 Market order Buy #2] at 81047, sl 80996, tp 81096, magik 123

In der Tat, zwei Zeilen mehr...

Um die Dinge ein wenig zu vereinfachen, habe ich einen Expert Advisor mit diesem einfachen Code geschrieben:

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
#import "user32.dll"
  int GetAsyncKeyState(int a0);
#import
bool ZPressed, ZPress = false;
bool APressed, APress = false;
CTrade trade;

int OnInit()  {   return(INIT_SUCCEEDED);  }

void OnDeinit(const int reason)  {  }

void OnTick()
  {
  // Taste "Z" wird gedrückt
  if(MathAbs(GetAsyncKeyState(90))>1) ZPressed = ZPress = true;
  else ZPress = false;
  if(ZPressed && !ZPress)
    {
    ZPressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price - 30, tp = Price + 50;
    trade.Buy(1,Symbol(),0,sl,tp);
    printf("Buy"); 
    }
  // Taste "A" wird gedrückt
  if(MathAbs(GetAsyncKeyState(65))>1) APressed = APress = true;
  else APress = false;
  if(APressed && !APress)
    {
    APressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price + 30, tp = Price - 50;
    trade.Sell(1,Symbol(),0,sl,tp);
    printf("Sell");    
    }
  }

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {  }
//+------------------------------------------------------------------+

Wenn Sie die Taste "Z" drücken (oder besser gesagt, wenn Sie sie loslassen), öffnet er den Kauf, und wenn Sie die Taste "A" drücken, öffnet er den Verkauf.

Ich habe es im Testprogramm ausprobiert. Das Ergebnis ist dasselbe - auf einem Desktop-PC funktionieren StopLoss und TakeProfit nicht, aber auf einem Laptop funktionieren sie, d.h. alles funktioniert korrekt.

Ich habe auch versucht, den Code, auf den am Ende dieses Artikels verwiesen wird, im Tester auf einem PC und auf einem Laptop auszuführen, und es ist das Gleiche passiert - auf einem PC funktioniert es nicht, aber auf einem Laptop funktioniert es.

Die Schlussfolgerung ist also, dass es entweder eine Einstellung im Tester gibt, die das Auslösen von sl und tp erlaubt (die ich nicht kenne), oder dass der Tester selbst nicht korrekt funktioniert....

 
MQL_User #:

MrBrooklin, Artem.

Ich habe es in der Strategie-Tester (wie ich verstehe, hat der Broker nichts damit zu tun).

Die Nachrichten sind wie folgt:

2022.07.03 11:16:39.380 2022.01.03 07:00:00 instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 deal #2 buy 0.1 @Si at 81011 done (based on order #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 Geschäft ausgeführt [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 Auftrag ausgeführt buy 0.1 at 81011 [#2 buy 0.1 @Si at 81011]

Auf einem anderen Computer (Laptop), auf dem StopLoss und TakeProfit korrekt funktionieren, lauten die Meldungen jedoch wie folgt:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 Auftrag ausgeführt buy 0.1 at 81047 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - Position offen: 2022.01.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Open 0.10 Buy #2 [0.10 Market order Buy #2] at 81047, sl 80996, tp 81096, magik 123

In der Tat, zwei Zeilen mehr...

Um die Dinge ein wenig zu vereinfachen, habe ich einen Expert Advisor mit diesem einfachen Code geschrieben:

Wenn Sie die Taste "Z" drücken (oder besser gesagt, wenn Sie sie loslassen), öffnet er den Kauf, und wenn Sie die Taste "A" drücken, öffnet er den Verkauf.

Ich habe es im Testprogramm ausprobiert. Das Ergebnis ist dasselbe - auf einem Desktop-PC funktionieren StopLoss und TakeProfit nicht, aber auf einem Laptop funktionieren sie, d.h. alles funktioniert korrekt.

Ich habe auch versucht, den am Ende dieses Artikels verlinkten Code sowohl auf dem PC als auch auf dem Laptop im Testprogramm auszuführen, und es ist das Gleiche passiert - auf dem PC funktioniert es nicht, aber auf dem Laptop funktioniert es.

Die Schlussfolgerung ist also, dass es entweder eine Einstellung im Tester gibt, die es erlaubt, sl und tp auszulösen (die ich nicht kenne), oder dass der Tester selbst falsch funktioniert....

Wie groß ist die Streuung im Testgerät?
 

Die Spanne im Testgerät beträgt 1. Sowohl auf PC als auch auf Laptop. Symbol @Si.

Gibt es irgendeine Möglichkeit, dass es das beeinflussen kann?

Ich dachte, dass vielleicht Schlupf (Schlupf) beeinflusst irgendwie und versuchte, es zu ändern. Aber es funktioniert nicht.

 
MQL_User #:

Die Spanne im Testgerät beträgt 1. Sowohl auf PC als auch auf Laptop. Symbol @Si.

Kann dies irgendwelche Auswirkungen haben?

Ich dachte, dass vielleicht der Schlupf (Schlupf) sich irgendwie auswirkt und habe versucht, ihn zu ändern. Aber es funktioniert nicht.

In einem der Fälle erreicht der Preis nicht das Stopp-Niveau.