Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 7

 
Um mit RAM-Dateien zu arbeiten, kann folgende Konstruktion verwendet werden
const int handleRAM = FileOpen("\\\\.\\pipe\\RAM", FILE_READ | FILE_WRITE | FILE_BIN);

Legen Sie vorher eine entsprechende Datei an.

Mit dieser Implementierung ist es bequem/schnell, z.B. Arrays beliebiger Dimension (und unterschiedlicher) ineinander zu kopieren - ohne HDD/SDD zu vergewaltigen.

// Копирование массивов любых размерностей (и разных) друг в друга
#define ARRAYCOPY(Dest, Source) \
  if (ArraySize(Source) > 0)                                                                  \
  {                                                                                           \
    const int handleRAM = FileOpen("\\\\REN\\pipe\\RAM", FILE_READ | FILE_WRITE | FILE_BIN);  \
                                                                                              \
    if (handleRAM != INVALID_HANDLE)                                                          \
    {                                                                                         \
      if (FileWriteArray(handleRAM, Source) > 0)                                              \
        FileReadArray(handleRAM, Dest);                                                       \
                                                                                              \
      FileClose(handleRAM);                                                                   \
    }                                                                                         \
  }
Es ist eine universelle Lösung. Die Klassiker des Kopierens sehen wie folgt aus
// Копирует двумерный массив в одномерный
#define MATRIX_TO_VECTOR(Matrix, Vector)      \
  if (ArraySize(Matrix) > 0)                  \
  {                                           \
    const int Range1 = ArrayRange(Matrix, 0); \
    const int Range2 = ArrayRange(Matrix, 1); \
                                              \
    ArrayResize(Vector, Range1 * Range2);     \
                                              \
    int k = 0;                                \
                                              \
    for (int i = 0; i < Range1; i++)          \
      for (int j = 0; j < Range2; j++)        \
      {                                       \
        Vector[k] = Matrix[i][j];             \
                                              \
        k++;                                  \
      }                                       \
  }

// Копирует одномерный массив в двумерный
#define VECTOR_TO_MATRIX(Vector, Matrix)                               \
  if (ArraySize(Vector) > 0)                                           \
  {                                                                    \
    const int Size = ArraySize(Vector);                                \
    const int Range = ArrayRange(Matrix, 1);                           \
                                                                       \
    ArrayResize(Matrix, Size / Range + ((Size % Range == 0) ? 0 : 1)); \
                                                                       \
    for (int i = 0; i < Size; i++)                                     \
      Matrix[i / Range][i % Range] = Vector[i];                        \
  }
Anstelle von Funktionen werden Makros verwendet, da es unmöglich ist, ein Array mit universeller Größe an Funktionen zu übergeben.
 
Dmitry Fedoseev:

Der Punkt ist, dass OnTradeTransaction() nicht unmittelbar nach OrderSend ausgelöst wird.

Kurz gesagt, es gibt hier nur eine Ansammlung von Streitern, ohne auf das Thema des Streits einzugehen.

Es gibt zwei Varianten des Algorithmus, wenn unmittelbar nach OrderSend() etwas getan werden muss:

1. Wir können eine Schleife starten, in der wir auf die Aktualisierung der Listen der Bestellungen und Angebote warten.

2. Beenden Sie OnTick() und warten Sie auf die Auslösung von OnTradeTransaction().

3. Prüfen Sie durch Ankreuzen, ob ein neuer Auftrag oder ein neues Geschäft in der Liste erscheint.

Auswahl von 2 und 3 ))
 
Was kann das Vierfache MODE_MARGINREQUIRED in mql5 ersetzen?
 
Artyom Trishkin:
Was kann ich anstelle von MODE_MARGINREQUIRED in mql5 tun?

Das ist etwas, das Sie die Entwickler fragen müssen, denn keiner der Forumsmitglieder weiß das. Ich habe diese Frage 4 Mal in verschiedenen Threads gestellt, einmal bekam ich sogar die Antwort: "Verwenden Sie die Suche", aber es gibt mehr als 100 Fragen in der Suche und keine einzige Antwort. Der Entwickler beantwortet die Frage nicht, wahrscheinlich aufgrund der Tatsache, dass es in Five keine Möglichkeit gibt, die Marge für andere Paare als die Einzahlungswährung zu erhalten.

Alles ist noch roh in Five und es sieht so aus, als ob das auch so bleiben wird, aber es gibt ein OpenGL für alle =)

 
Artyom Trishkin:
Was kann das Vierfache von MODE_MARGINREQUIRED in mql5 ersetzen?
OrderCalcMargin() try https://www.mql5.com/ru/docs/trading/ordercalcmargin
 
Andrej Barinow:
OrderCalcMargin() try

Das ist verständlich, aber es funktioniert nicht mit dem Indikator

  double One_Lot=0.0;
  OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),One_Lot);
  Comment(One_Lot); // залог на 1 лот
 
Vitaly Muzichenko:

Dies ist verständlich, funktioniert aber nicht mit dem Indikator

  double One_Lot=0.0;
  OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),One_Lot);
  Comment(One_Lot);
In der Hilfe steht, dass es nicht über den Indikator https://www.mql5.com/ru/docs/runtime/running funktioniert.
 
Andrej Barinow:
Dies wird explizit in der Hilfe geschrieben, die nicht über den Indikator https://www.mql5.com/ru/docs/runtime/running funktioniert.
Ich möchte eine Berechnung, die unabhängig vom Programmtyp ist.
 
Artyom Trishkin:
Ich möchte eine Berechnung, die unabhängig von der Art des Programms ist.
Oooh, ich hätte auch gerne eine Menge Sachen :)
 
Andrej Barinow:
Oooh, ich hätte auch gerne eine Menge :)
Nun... das ist keine Antwort...
Und diese Frage bezieht sich nur auf das Thema der Branche.