Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 173

 
fxsaber:

Oben aktualisiert.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

fxsaber, 2020.04.09 13:13

Es sieht so aus, als ob Sie überhaupt nicht darauf gestoßen sind. Werfen Sie einen Blick in die Dokumentation. Pro Bestellung gibt es zwei Bände.

Dies sind Live-Limiter. Die erste Zahl ist das ursprüngliche Volumen, die zweite ist das gegossene Volumen. Sobald sie gleich werden oder gelöscht werden, gehen sie in die Geschichte ein.


Ist das nicht ein Auftrag, der in zwei Teilen ausgeführt wird? Es scheint seltsam, dass die nicht ausgeführten Bände die gleichen sind.

 
Alexey Viktorov:

Ist das nicht ein Auftrag, der in zwei Teilen ausgeführt wird? Es ist ein seltsamer Zufall, dass die nicht ausgeführten Bände die gleichen sind.

Ein Zufall. Sie haben sogar verschiedene Mags.

 
fxsaber:

Es kann keine Ordnung im Ordnungsmodus geben, wenn er lebendig ist. Wenn sie tot sind, wird es eine Zeit der ersten Hinrichtung geben, wie ursprünglich gesagt.


Gefunden in der Geschichte.

 
fxsaber:

Wenn Sie die Seite über CloseBy zuklappen, scheint sie die Majicies zu verlieren. Das muss ich mir ansehen.

Dies scheint der Grund zu sein, warum der erste Code unten nicht funktioniert.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Geschichte Gewinn in MQL5 ?

fxsaber, 2017.08.26 19:16

  1. MQL5
    double Profit( void )
    {
     double Res = 0;
    
     if (HistorySelect(0, INT_MAX))
       for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
       {
         const ulong Ticket = HistoryDealGetTicket(i);
         
         if((HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) && (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symbol()))
           Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
       }
         
      return(Res);
    }


  2. MQL5 + MQL4
    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    double Profit( void )
    {
     double Res = 0;
    
     for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
       if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == MagicNumber) && (OrderSymbol() == Symbol()))
         Res += OrderProfit();
         
      return(Res);
    }

Die Zählung des Gewinns in der Magie scheint ein Problem zu sein.

 
Die Auftragspreise sind normalisiert, die Abschlüsse nicht. Das Skript findet solche Geschäfte.
void OnStart()
{
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--) // Перебираем все сделки
    {
      const ulong Ticket = HistoryDealGetTicket(i); // Тикет сделки
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE); // Цена сделки
      
      if (NormalizeDouble(Price, 5) != Price) // Если цена сделки не нормализована,      
        Print(Ticket);                        // печатаем тикет сделки.
    }
}
 

Die Pfeile zum Öffnen/Schließen von Positionen, die MT5 automatisch in Echtzeit platziert, basieren auf TradeTransaction-Events.


Gerade habe ich gesehen, dass diese Ereignisse (Öffnen und Schließen von etwa einem Dutzend Positionen) wegen eines kurzzeitigen Verbindungsausfalls nicht im Terminal ankamen - es war so zufällig, dass ich an meinem PC saß und sie mit dem Auge betrachtete. Folglich gibt es keine entsprechenden Pfeile.


Und, wie hier schon manchmal gesagt wurde, kann man sich bei Kampf-EAs nicht auf OnTradeTransaction verlassen. Schade, dass es keinen zuverlässigen öffentlichen Mechanismus für den Umgang mit OrderSendAsync gibt.

 
fxsaber:

Schade, dass es keinen zuverlässigen öffentlichen Mechanismus für den Umgang mit OrderSendAsync gibt.

können die Dienste auf die Berufe zugreifen? - wenn ja, dann ist es möglich, alle 10 ms zu überwachen und das Ereignis an das Diagramm zu senden

Ich habe mir die Hilfe angesehen und dachte, dass ich vielleicht die Dienste hinzugefügt bekommen habe, aber ich glaube, das war schon letztes Jahr so:

-Es handelt sich um ein Programm, das im Gegensatz zu Indikatoren, Expert Advisors und Skripten keine Bindung an einen Chart benötigt. Ähnlich wie bei Skripten werden bei Diensten keine Ereignisse außer dem Startereignis verarbeitet. Um einen Dienst zu starten, muss sein Code die OnStart-Handler-Funktion enthalten. Dienste akzeptieren keine anderen Ereignisse außer Start, aber sie können selbst benutzerdefinierte Ereignisse an Diagramme senden, indem sie EventChartCustom

UPD: Ich habe ein Service-Skript erstellt.

struct SOrderInfo
{
   int positionstotal;
   int orderstotal;
   int historyorderstotal;
   bool operator==(const SOrderInfo &v){return(positionstotal==v.positionstotal && orderstotal==v.orderstotal && historyorderstotal==v.historyorderstotal);}
};
//+------------------------------------------------------------------+
int OnStart()
{
   SOrderInfo CurrState = UpdateOrdersInfo();
   SOrderInfo LastState = CurrState;
   while(!IsStopped())
   {
      Sleep(10);
      CurrState = UpdateOrdersInfo();
      if(CurrState == LastState) continue;
      LastState = CurrState;
      Print("Orders changed!");
   }
   return(0);
}
//+------------------------------------------------------------------+
SOrderInfo UpdateOrdersInfo()
{
   SOrderInfo result;
   result.positionstotal     = PositionsTotal();
   result.orderstotal        = OrdersTotal();
   result.historyorderstotal = HistoryOrdersTotal();
   return(result);
}
//+------------------------------------------------------------------+

Ich habe mehrere Aufträge eröffnet und sie manuell geschlossen.

 
Igor Makanu:

können die Dienste auf die Berufe zugreifen? - wenn ja, ist es möglich, alle 10ms zu überwachen und ein Ereignis an das Diagramm zu senden

Dies unterscheidet sich nicht von der gleichen Überschreitung in der sowtronic. Nur reicht es nicht aus, die Menge zu vergleichen, die Interna können sich ändern.

 
Andrey Khatimlianskii:

Das ist nicht anders als der gleiche Overkill in Owletnik. Nur reicht es nicht aus, die Menge zu vergleichen, die Interna können sich ändern.

Dienste wie Alerters sind sehr gut. Sie brauchen keine Diagramme, sie werden automatisch mit Terminal gestartet. Sie müssen sich nur mit der Situation beim Wechsel zwischen den Konten auseinandersetzen.

Der Dienst kann auch ein Kampfberater sein. Ohne die grafische Benutzeroberfläche ist es einfach nicht sehr praktisch.
 
Andrey Khatimlianskii:

Das ist nicht anders als der gleiche Overkill in Owletnik. Nur reicht es nicht aus, die Menge zu vergleichen, die Interna können sich ändern.

ist anders.

es gibt sogenannte Kontroll- und Verwaltungsaufgaben

EA - Verwaltung, Dienstleistung - Kontrolle

die Kontrolle darf nicht überflüssig sein - man nimmt dem System alle Ressourcen und erhält ein instabiles System anstelle von Kontrolle

Sie müssen die Kritikalität der Ereignisse definieren, imho sind das Schließen und Öffnen von Aufträgen kritische Ereignisse, die kontrolliert werden müssen, während das Ändern von TP und SL wie bisher durchgeführt werden kann (ein paar fehlgeschlagene Versuche - lassen Sie es gut sein, beim nächsten Tick versuchen wir es erneut)

und die Art und Weise Sie vorschlagen - Kontrolle alles möglich ist - können Sie den Zustand der Aufträge in SQLite wiederholen, dann gibt es ein Problem der Synchronisation der Datenbank mit dem Dienst und EA.... all dies ist unnötig


Ich denke, das Schema sollte einfacher sein - es sollte wie folgt aussehen: Erhalten Sie dasOnTradeTransaction-Ereignis vom Terminal in EA und erzeugen Sie das OnChartEvent-Ereignis vom Dienst für zusätzliche Kontrolle in EA