Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 7

 
Per lavorare con i file RAM si può usare la seguente costruzione
const int handleRAM = FileOpen("\\\\.\\pipe\\RAM", FILE_READ | FILE_WRITE | FILE_BIN);

Pre-creare un file appropriato in anticipo.

Con questa implementazione è conveniente/veloce, ad esempio per copiare array di qualsiasi dimensione (e diversi) l'uno dall'altro - senza violentare HDD/SDD.

// Копирование массивов любых размерностей (и разных) друг в друга
#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);                                                                   \
    }                                                                                         \
  }
È una soluzione universale. I classici di tale copiatura assomigliano a questo
// Копирует двумерный массив в одномерный
#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];                        \
  }
Le macro sono usate al posto delle funzioni, perché è impossibile passare un array di dimensioni universali alle funzioni.
 
Dmitry Fedoseev:

Il punto è che OnTradeTransaction() non si attiverà immediatamente dopo OrderSend.

In breve, qui c'è solo una folla di argomentatori senza entrare nell'argomento della discussione.

Ci sono due varianti dell'algoritmo se qualcosa deve essere fatto immediatamente dopo OrderSend():

1. Possiamo avviare un ciclo in attesa degli aggiornamenti delle liste di ordini e offerte.

2. Termina OnTick() e aspetta che OnTradeTransaction() si attivi.

3. Controlla con un segno di spunta se un nuovo ordine o affare appare nella lista.

Scegliendo 2 e 3 ))
 
Cosa può sostituire il quadruplo MODE_MARGINREQUIRED in mql5?
 
Artyom Trishkin:
Cosa posso fare al posto di MODE_MARGINREQUIRED in mql5?

Questo è qualcosa che devi chiedere agli sviluppatori, perché nessuno dei membri del forum lo sa. Ho fatto questa domanda 4 volte in diversi thread, una volta ho anche ottenuto la risposta: "usa la ricerca", ma ci sono più di 100 domande nella ricerca e non una sola risposta. Lo sviluppatore non risponde alla domanda, probabilmente a causa del fatto che in Five non c'è la possibilità di ottenere il margine per coppie diverse dalla valuta di deposito.

Tutto è ancora grezzo in Five e sembra che rimarrà così, ma c'è un OpenGL per tutti =)

 
Artyom Trishkin:
Cosa può sostituire MODE_MARGINREQUIRED quadruplo in mql5?
OrderCalcMargin() try https://www.mql5.com/ru/docs/trading/ordercalcmargin
 
Andrey Barinov:
OrderCalcMargin() prova

Questo è comprensibile, ma non funziona dall'indicatore

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

Questo è comprensibile, ma non funziona con l'indicatore

  double One_Lot=0.0;
  OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),One_Lot);
  Comment(One_Lot);
Dice proprio nell'aiuto che non funziona dall'indicatore https://www.mql5.com/ru/docs/runtime/running
 
Andrey Barinov:
Questo è scritto esplicitamente nell'aiuto, che non funziona dall'indicatore https://www.mql5.com/ru/docs/runtime/running
Vorrei un calcolo che sia indipendente dal tipo di programma.
 
Artyom Trishkin:
Vorrei un calcolo indipendente dal tipo di programma.
Oooh, anche io vorrei un sacco di cose :)
 
Andrey Barinov:
Oooh, anche a me piacerebbe molto :)
Beh... questa non è una risposta...
E questa domanda è solo sul tema del ramo.