Der große und schreckliche MT4 für immer (oder wie man einen Übergang strategisch plant) - Seite 20

 
Andrey Khatimlianskii:

Du kannst nicht mit deiner Zunge sprechen. Sie sollten mich unterrichten. Mich, bitte.

Es gibt ein Problem, und zwar nicht nur bei diesem Makler.
Und das Problem liegt nicht im Warten auf die Ausführung eines bestimmten Auftrags (das ist eine andere Sache), sondern in der Tatsache, dass sie im Moment der Auftragsausführung vorübergehend aus allen Listen (offene, geschlossene, Geschäfte, Positionen) verschwinden.

Wir könnten natürlich eine weitere Stütze gebrauchen. Aber wir wollen eine menschliche Lösung finden. Und so arbeitet fxsaber in aller Öffentlichkeit daran und lauscht dem Gebell der vorbeikommenden Gratulanten.

Ich persönlich hoffe, Sie können die Dokumentation verstehen

Während der Expert Advisor Handelsgeschäfte mit dem OnTradeTransaction()-Handler abwickelt, fährt das Terminal mit der Bearbeitung neu eingegangener Handelsgeschäfte fort. Daher kann sich der Zustand eines Handelskontos bereits während der Ausführung von OnTradeTransaction() ändern. Während ein MQL5-Programm zum Beispiel einen neuen Auftrag hinzufügt, kann dieser ausgeführt, aus der Liste der offenen Aufträge gelöscht und in die Historie verschoben werden. Das Programm wird weiterhin über alle diese Ereignisse informiert werden.
und dies gilt nicht nur für den OnTradeTransaction()- Ereignishandler , sondern auch für jeden Teil des Codes, nachdem OrderSend() gesendet wurde. Warten Sie auf den Abschluss der Transaktion. Es gibt keine anderen Optionen und es wird auch keine geben. Überlegen Sie einmal, warum in mql4 alles so einfach ist? Nun, das liegt daran, dass diese Erwartungen weit weg von Ihren Augen festgelegt sind. Und in MQL5 halten Sie alle Kontrollen und Erwartungen irgendwie für Krücken. Und warum?
 
Alexey Viktorov:

Ich persönlich hoffe, dass Sie genug Einsicht in solche Worte der Dokumentation haben

Dies betrifft nicht nur den OnTradeTransaction()- Ereignishandler , sondern auch jeden Teil des Codes, nachdem OrderSend() gesendet wurde. Warten Sie auf den Abschluss der Transaktion. Es gibt keine anderen Optionen und es wird auch keine geben. Überlegen Sie einmal, warum in mql4 alles so einfach ist? Nun, das liegt daran, dass diese Erwartungen weit weg von Ihren Augen festgelegt sind. Und in MQL5 halten Sie alle Kontrollen und Erwartungen irgendwie für Krücken. Und warum?

Alexey, Sie sind vom Thema abgekommen. Tut mir leid, ich habe weder Zeit noch Lust, das alles noch einmal zu erklären.

 

Ich habe es auf diese Weise versucht:

void OnTrade()
{
   HistorySelect(TimeCurrent(),0);
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

5 Mal habe ich meinen Code ausgeführt, bis genau 10 Positionen offen waren

 
Igor Makanu:

Ich habe es auf diese Weise versucht:

Meinen Code 5 Mal ausführen, bis genau 10 Positionen geöffnet sind

Es scheint ein Fehler bei der Einstellung der HistorySelect-Eingänge vorzuliegen.

 
fxsaber:

Sieht nach einem Fehler bei der Einstellung der HistorySelect-Eingänge aus.

Idee, den Server zu erreichen und zu synchronisieren

als Drehbuch umgeschrieben:

//+------------------------------------------------------------------+
void OnStart()
{
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
   datetime t_start = TimeCurrent();
   while(PositionsTotal() < 10)
   {
      BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      if(!HistorySelect(TimeCurrent(), t_start) || ! OrderSend(BuyRequest, result)) continue;
      if(PositionsTotal() >= 10) return;
   }
}
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
{
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);

   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
//+------------------------------------------------------------------+

mehrmals ausgeführt, auch 10 Positionen geöffnet, die aktuelle Startzeit des Skripts hinzugefügt

 
Igor Makanu:

die Idee, den Server zu erreichen und zu synchronisieren

als Drehbuch umgeschrieben:

ein paar Mal ausgeführt, auch 10 Positionen geöffnet, die aktuelle Startzeit des Skripts hinzugefügt

Was wird diese Veränderung zeigen?

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

      if(!_B(HistorySelect(TimeCurrent(), t_start), 1) || ! OrderSend(BuyRequest, result)) continue;
 
fxsaber:

Was wird diese Veränderung zeigen?


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh ist eingeschaltet.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 20 mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

Positionen sind immer noch 10 %, noch keine Verdoppelung
 
Igor Makanu:

Positionen sind immer noch 10 Stück, noch keine Verdoppelung

An der Ausführungszeit von HistorySelect können Sie deutlich erkennen, dass es keine Anfragen an den Trade-Server stellt.


Mehrere Versionen.

  1. Sie haben Glück.
  2. Diese Verzweigung hat eine stille Änderung in der neuen Version des Terminals verursacht. Das ist leicht zu bestätigen, wenn es in den alten Ländern eine Rückwirkung gibt.
  3. Ungewöhnliches Verhalten von HistorySelect, wenn From >= To.
  4. Handels-Server. Name?


Versuchen Sie auf die gleiche Weise, die Verdoppelung hier loszuwerden.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

The Great and Powerful MT4 Forever (oder wie man die richtige Strategie für den Wechsel findet)

fxsaber, 2021.05.05 02:04

// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
    else if (!OrdersTotal())
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}

Führen Sie diesen Code auf einem leeren Demokonto aus und sehen Sie, ob zwei Positionen innerhalb weniger Sekunden eröffnet werden.

 

Ich bin zufällig darauf gestoßen und habe es gelesen - es ist eine Schande!

Niemandem sollte man trauen!
 
fxsaber:

An der Ausführungszeit von HistorySelect können Sie deutlich erkennen, dass es keine Anfragen an den Trade-Server stellt.


Mehrere Versionen.

  1. Sie haben Glück.
  2. Diese Verzweigung hat eine stille Änderung in der neuen Version des Terminals verursacht. Das ist leicht zu bestätigen, wenn es in den alten Ländern eine Rückwirkung gibt.
  3. Ungewöhnliches Verhalten von HistorySelect, wenn From >= To.
  4. Handels-Server. Name?


Versuchen Sie auf die gleiche Weise, die Verdoppelung hier loszuwerden.

1. leider können wir in unserem Geschäft nicht ohne sie überleben ))

2. ich frage vor ein paar Tagen, welche Build (nicht Beta) relevant ist, Schweigen, habe ich beschlossen, nicht zu aktualisieren, auf einem Laptop und auf einem PC ist es schwer zu verstehen, welche Builds relevant sind - ich habe nicht mit den Terminals für ein paar Monate gearbeitet, ich weiß nicht folgen. Jetzt auf dem PC Build 2903.

3. ich passe, Sie sind für dieses Bankett verantwortlich, die Entwickler schweigen, meine Vermutung... Daumen in den Himmel, ich denke, das Problem ist in der Netzwerk-Latenz, und mehrere Sockets? Terminal, keine Synchronisation, ein Socket Preise, eine andere OrderSend, eine andere, wo OnTrade()..... so Pakete fliegen von wo und wo

4. jetzt habe ich robotforex + 100 mbps optisch (ETTH), ich hatte eine schlechte mobile Internet und fhopin auf meinem Laptop


Ich habe es 2 Minuten lang probiert, das Skript hat 2 Minuten lang geflackert, immer eine Position, keine Umkehrungen, ich habe das Skript von Hand abgenommen