Características del lenguaje mql5, sutilezas y técnicas - página 7

 
Para trabajar con archivos RAM se puede utilizar la siguiente construcción
const int handleRAM = FileOpen("\\\\.\\pipe\\RAM", FILE_READ | FILE_WRITE | FILE_BIN);

Cree de antemano un archivo apropiado.

Con esta implementación es conveniente/rápido, por ejemplo, copiar matrices de cualquier dimensión (y diferentes) entre sí - sin violar el 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);                                                                   \
    }                                                                                         \
  }
Es una solución universal. Los clásicos de este tipo de copias tienen este aspecto
// Копирует двумерный массив в одномерный
#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];                        \
  }
Se utilizan macros en lugar de funciones, porque es imposible pasar un array de tamaño universal a las funciones.
 
Dmitry Fedoseev:

La cuestión es que OnTradeTransaction() no se activará inmediatamente después de OrderSend.

En definitiva, aquí sólo hay una multitud de discutidores sin entrar en el tema de la discusión.

Hay dos variantes del algoritmo si hay que hacer algo inmediatamente después de OrderSend():

1. Podemos iniciar un bucle a la espera de las actualizaciones de las listas de pedidos y ofertas.

2. Finaliza OnTick() y espera a que se active OnTradeTransaction().

3. Compruebe por medio de una marca si aparece un nuevo pedido o acuerdo en la lista.

Elegir 2 y 3 ))
 
¿Qué puede sustituir al cuádruple MODE_MARGINREQUIRED en mql5?
 
Artyom Trishkin:
¿Qué puedo hacer en lugar de MODE_MARGINREQUIRED en mql5?

Esto es algo que tienes que preguntar a los desarrolladores, porque ninguno de los miembros del foro lo sabe. He hecho esta pregunta 4 veces en diferentes hilos, una vez incluso obtuve la respuesta: "usa la búsqueda", pero hay más de 100 preguntas en la búsqueda y ni una sola respuesta. El desarrollador no responde a la pregunta, probablemente debido al hecho de que en Five no existe la posibilidad de obtener el margen para pares distintos de la moneda de depósito.

Todo está todavía en bruto en Five y parece que seguirá así, pero hay un OpenGL para todos =)

 
Artyom Trishkin:
¿Qué puede sustituir al cuádruple MODE_MARGINREQUIRED en mql5?
OrderCalcMargin() try https://www.mql5.com/ru/docs/trading/ordercalcmargin
 
Andrey Barinov:
OrderCalcMargin() try

Esto es comprensible, pero no funciona desde el indicador

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

Esto es comprensible, pero no funciona con el indicador

  double One_Lot=0.0;
  OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),One_Lot);
  Comment(One_Lot);
En la ayuda dice que no funciona desde el indicador https://www.mql5.com/ru/docs/runtime/running
 
Andrey Barinov:
Esto está escrito explícitamente en la ayuda, que no funciona desde el indicador https://www.mql5.com/ru/docs/runtime/running
Me gustaría que el cálculo fuera independiente del tipo de programa.
 
Artyom Trishkin:
Me gustaría que el cálculo fuera independiente del tipo de programa.
Oooh, a mí también me gustaría un montón de cosas :)
 
Andrey Barinov:
Oooh, a mí también me gustaría mucho :)
Bueno... eso no es una respuesta...
Y esta pregunta es sólo sobre el tema de la rama.

Razón de la queja: