Bibliotheken: MT4Orders - Seite 33

 
fxsaber:

Alle Änderungen sind in der Kopfzeile aufgeführt.

Ja, aber Sie können nicht sehen, was sie sind. Ich zeige es Ihnen, wenn ich es tue.


fxsaber:

ZY hat sich meine Arbeiten in KB angesehen... es ist besser, zip zu vergessen.

Eben. Zips werden nicht aktualisiert (

 
// Liste ändern:
// 08.02.2019
// Hinzufügen: Der Positionskommentar wird gespeichert, wenn er teilweise über OrderClose geschlossen wird.
// Wenn es notwendig ist, den Kommentar einer offenen Position bei teilweiser Schließung zu ändern, kann er in OrderClose gesetzt werden.
 

Es gibt Aufgaben, die nicht nur mit MQL4 gelöst werden können.

Aber MT4-Stil und MT5-Stil können parallel verwendet werden. Hier ist ein Beispiel für eine solche Kombination.

Forum zum Handel, zu automatisierten Handelssystemen und zum Testen von Handelsstrategien.

OnTradeTransaction Transaktionsverarbeitung

fxsaber, 2019.02.08 12:37 Uhr.

Aufgabe

Pending Orders werden auf Netting platziert (können multidirektional und in beliebiger Anzahl von jedem Typ sein). Es ist notwendig, seine SL/TP in Form von Stop/Limit Pending Orders bei jeder Auslösung der ursprünglichen Pending Order zu platzieren. In diesem Fall sollten SL/TP-Aufträge abhängig sein: Wenn ein Auftrag ausgelöst wird, wird der zweite gelöscht. Die ursprüngliche und die SL/TP-Pending-Order können teilweise ausgelöst werden. Der Expert Advisor kann jederzeit neu geladen werden, einschließlich der Übertragung auf ein anderes Terminal.


Lösung

#include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

input int inTP = 100;
input int inSL = 200;
sinput MAGIC_TYPE inMagicNumber = 0;
sinput string inStrKey = "SLTP";

int GetAmountDeals()
{
  return(HistorySelect(0, INT_MAX) ? HistoryDealsTotal() : 0);
}

bool IsMyString( const string Str, const string Key )
{
  return(StringSubstr(Str, 0, StringLen(Key)) == Key);
}

string ToMyString( const string Str, const string Key )
{
  return(Key + Str);
}

struct ORDER
{
  int Type;
  TICKET_TYPE Ticket;
  double Lots;
  double OpenPrice;
  MAGIC_TYPE Magic;
  string Comment;
  
  ORDER() : Type(OrderType()), Ticket(OrderTicket()), Lots(OrderLots()),
            OpenPrice(OrderOpenPrice()), Magic(OrderMagicNumber()), Comment(OrderComment())
  {
  }
};

#define _CS(A) ((!::IsStopped()) && (A))

bool GetPairOrder()
{
  bool Res = false;

  ORDER Order;
  Order.Type = 6 - Order.Type + ((Order.Type & 1) << 1);
  
  for (int i = OrdersTotal() - 1; _CS((i >= 0) && (!Res)); i--)
    Res = OrderSelect(i, SELECT_BY_POS) && (OrderType() == Order.Type) &&
          (OrderMagicNumber() == Order.Magic) && (OrderComment() == Order.Comment);
    
  return(Res);
}

void CheckSLTP( const string Symb, const MAGIC_TYPE Magic, const string Key, const int Slip = 100 )
{    
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() > OP_SELL)  &&
        (OrderMagicNumber() == Magic) && (OrderSymbol() == Symb) && IsMyString(OrderComment(), Key))
    {
      const ORDER Order;      
      
      if (!_CS(GetPairOrder()))
      {
        OrderDelete(Order.Ticket);
        
        i = OrdersTotal();
      }
      else if (_CS(OrderLots() < Order.Lots))
      {
        if (OrderDelete(Order.Ticket))
          OrderSend(OrderSymbol(), Order.Type, OrderLots(), Order.OpenPrice, Slip, 0, 0, Order.Comment, Order.Magic);
          
        i = OrdersTotal();          
      }
    }
}

void CheckFill( const string Symb, const MAGIC_TYPE Magic, const string Key, const int SL, const int TP )
{    
  static int PrevDeals = GetAmountDeals();
  
  const double point = SymbolInfoDouble(Symb, SYMBOL_POINT);
  const int NewDeals = GetAmountDeals();
  
  while (_CS(PrevDeals < NewDeals))
  {
    const ulong Ticket = HistoryDealGetTicket(PrevDeals);
    
    if (Ticket && (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == Magic) &&
                  (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb) &&
                  !IsMyString(HistoryDealGetString(Ticket, DEAL_COMMENT), Key))
    {
      const double Lots = HistoryDealGetDouble(Ticket, DEAL_VOLUME);
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE);
      const int Type = 1 - (int)HistoryDealGetInteger(Ticket, DEAL_TYPE);
      const double Koef = Type ? -point : point;
      const string Comment = ToMyString((string)Ticket, Key);
      
      if (OrderSend(Symb, Type + OP_BUYLIMIT, Lots, Price - Koef * TP, 0, 0, 0, Comment))
        OrderSend(Symb, Type + OP_BUYSTOP, Lots, Price + Koef * SL, 0, 0, 0, Comment);
    }
    
    PrevDeals++;
  }
}

void System()
{
  CheckFill(_Symbol, inMagicNumber, inStrKey, inSL, inTP);
  CheckSLTP(_Symbol, inMagicNumber, inStrKey);
}

void OnTrade()
{
  System();
}

void OnInit()
{
  OnTrade();
}
 

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2019.01.13 17:23 PM.

Kims Funktionen unter MT4 sind recht beliebt, also habe ich alle Quellen von seiner Seite heruntergeladen und einen einfachen "Konverter" für sie unter MT5 geschrieben.
#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

#include "e-Trailing.mq4" // http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=14

void OnTick() { start(); }

Es stellte sich heraus, dass Kims Konverter einige andere MT4-Berater auch unter MT5 zum Laufen bringt

#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

#include "Reaction.mq4"   // https://www.mql5.com/de/code/24609

void OnTick() { start(); }
 
// Liste ändern:
// 20.02.2019
// Fix: Wenn es keine MT5-Order aus einem bestehenden MT5-Geschäft gibt, wartet die Bibliothek auf die Synchronisierung der Historie. Im Falle eines Fehlers wird sie darüber berichten.


Umgehen Sie diesen Fallstrick auf MT5

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Neue Version von MetaTrader 5 build 2005: Wirtschaftskalender, MQL5 Programme als Dienste und API für die Sprache R

fxsaber, 2019.02.20 21:06

Hallo Dienste
// Das Skript fängt Situationen ab, in denen ein Transaktionsauftrag nicht in der Historie vorhanden ist.

#define _CS(A) ((!::IsStopped()) && (A))
#define  TOSTRING(A) #A + " = " + (string)(A) + " "
#define  OFFSET 100

void OnStart()
{
  datetime PrevTime = OFFSET;
  
  while (_CS(true))
  {
    if (HistorySelect(PrevTime - OFFSET, INT_MAX))
    {
      const int Total = HistoryDealsTotal();
      
      for (int i = 0; _CS(i < Total); i++)
      {
        const ulong DealTicket = HistoryDealGetTicket(i);
        const ulong OrderTicket = HistoryDealGetInteger(DealTicket, DEAL_ORDER);        
        
        int Count = 0;
        const ulong StartTime = GetMicrosecondCount();
        
        while ((HistoryOrderGetInteger(OrderTicket, ORDER_TICKET) != OrderTicket) && !HistoryOrderSelect(OrderTicket)) // Wenn es keinen Transaktionsauftrag gibt
          Count++;
        
        if (Count)
          Alert(TOSTRING(DealTicket) + TOSTRING(OrderTicket) + TOSTRING(Count) + TOSTRING(GetMicrosecondCount() - StartTime)); // Drucken Sie die Situation aus
        
        PrevTime = (datetime)HistoryDealGetInteger(DealTicket, DEAL_TIME);
      }
    }
    
    Sleep(0); // Ohne dies hängt sich das Terminal sofort auf.
  }
}


Wenn du Sleep auskommentierst, wird das Terminal sofort beendet, wenn du es ausführst. Aber es wird um etwas anderes gehen.

Es hat sich herausgestellt, dass es einfach ist, eine Situation zu erkennen, in der ein Geschäftsauftrag in der Historie fehlt: Es gibt ein Geschäft, aber sein Auftrag ist nicht vorhanden.

Das Ergebnis des Skripts auf MQ-Demo

Alert: DealTicket = 336236873 OrderTicket = 356249474 Count = 1614408 GetMicrosecondCount()-StartTime = 229880 
Alert: DealTicket = 336236882 OrderTicket = 356249486 Count = 1565921 GetMicrosecondCount()-StartTime = 229998 
Alert: DealTicket = 336236887 OrderTicket = 356249492 Count = 1559345 GetMicrosecondCount()-StartTime = 229788 
Alert: DealTicket = 336236898 OrderTicket = 356249505 Count = 157107 GetMicrosecondCount()-StartTime = 22878 
Alert: DealTicket = 336236901 OrderTicket = 356249508 Count = 1544271 GetMicrosecondCount()-StartTime = 220879 

Es dauert mehr als 200 ms, bis ein Geschäftsauftrag in der Historie auftaucht! Während dieser ganzen Zeit ist es nicht möglich, z.B. den Schlupf und die Ausführungsdauer zu bestimmen.

Stellen Sie sich eine Situation vor, in der Sie einen Dienst benötigen, der Daten über gerade geschlossene Positionen in eine Datei schreibt. Aufgrund dieser "Funktion" ist es einfach unmöglich, dies zu tun.


Liege ich richtig, dass dieses architektonische Merkmal von MT5 in keiner Weise korrigiert werden kann?


Es ist schwer zu zählen, wie viele solcher Dinge in der Bibliothek berücksichtigt werden.

 
Andrey Khatimlianskii:

Ja, aber man kann nicht sehen, wo sie drin sind. Ich zeige es dir, wenn ich es tue.


Ja, genau. Die Zips werden nicht aktualisiert.

Wenn man eine Datei nach der anderen herunterlädt, gehen die Änderungsdaten verloren. Ich muss nach Größe navigieren, aber nicht alle Korrekturen ändern die Größe.

Hier ist ein Vorschlag:

Fügen Sie in die Kopfzeile JEDER Datei das Änderungsdatum, optional die Versionsnummer und optional den Änderungsverlauf ein.

Zusätzlich zu den Dateien sollten Sie Ihr zip/rar posten, wie es einige Leute tun.

 
bool IsTradeAllowed(void)
  {
   return(::MQLInfoInteger(::MQL_TRADE_ALLOWED));       // Ausdruck nicht boolesch
  }
 
Edgar:

Die Bibliothek ist in nur einer Datei enthalten. Der ganze Rest ist Flitterkram, der schon lange nicht mehr aktualisiert wurde.

Allerdings gibt es auch OrderSend_Test2.mq5 - es ist ein Stresstest für MT5 und die Bibliothek. Er belastet den Handelsserver so, dass er den Autotrading-Modus ausschaltet.

 

Ich weiß. In diesem Fall, ja. Aber 3 Dateien haben sich seit dem letzten Mal geändert.

Ich meine die allgemeine Methodik, die die Versionierung vereinfacht. Ich selbst füge immer das Datum in die mqh-Kopfzeile und das Datum und die Version in mq5 ein.

Und wenn ich mein komplettes Archiv einbeziehe (um die Änderungsdaten zu speichern), kann ich alles ohne Nachdenken aktualisieren.
 
Edgar:

Ich weiß. In diesem Fall, ja. Aber 3 Dateien haben sich seit dem letzten Mal geändert.

Ich meine die allgemeine Methodik, die die Versionierung vereinfacht. Ich selbst füge immer das Datum in den mqh-Header ein, Datum und Version in mq5.

Mir wurde ein öffentliches bereits-fertig-für-QB-Arbeit analog zu github angeboten, wo all dies im automatischen Modus ist. Aber das Alter ist keine Freude: es ist kompliziert.

Vielleicht ist eine solche Option für Sie geeignet.

Ich kündige die Änderungen an und behalte sogar einen Hut nur für MT4Orders, da ich nicht der einzige bin, der es benutzt.

Was einige andere Arbeiten angeht, so mache ich das im Stillen.