Особенности языка mql5, тонкости и приёмы работы - страница 7

 
Для работы с RAM-файлами можно использовать следующую конструкцию
const int handleRAM = FileOpen("\\\\.\\pipe\\RAM", FILE_READ | FILE_WRITE | FILE_BIN);

Предварительно создав соответствующий файл.

При такой реализации удобно/быстро, например, копировать массивы любых размерностей (и разных) друг в друга - без насилования 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);                                                                   \
    }                                                                                         \
  }
Это универсальное решение. Классика же подобного копирования выглядит так
// Копирует двумерный массив в одномерный
#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];                        \
  }
Макросы используются вместо функций, поскольку в функции нельзя передать универсальной размерности массив.
 
Dmitry Fedoseev:

Смысл том, что в OnTradeTransaction() сработает не сразу после OrderSend.

Короче, здесь просто толпа любителей поспорить не вникнув в предмет спора.

Есть два варианта алгоритма, если после OrderSend() надо сразу что-то делать:

1. Врубить цикл ожидания обновления списков ордеров и сделок. 

2. Завершить работу OnTick() и ждать срабатывания OnTradeTransaction().

3. По тикам проверять, появился ли новый ордер или сделка в списке. 

 

 

Выбираю 2 и 3 ))
 
Чем можно заменить четвёрошную MODE_MARGINREQUIRED в mql5 ?
 
Artyom Trishkin:
Чем можно заменить четвёрошную MODE_MARGINREQUIRED в mql5 ?

Вот это нужно спрашивать у разработчиков, потому что ни один из форумчан этого не знает. Я задавал этот вопрос 4 раза в разных ветках, один раз даже получил ответ: "пользуйся поиском", но в поиске есть более 100 вопросов, и нет ни одного ответа. Разработчик на вопрос не отвечает, наверное по причине того, что в пятёрке нет возможности получить размер маржи по парам, отличным от валюты депозита. 

Как-то всё сыро ещё в пятёрке, и похоже так оно и останется, зато есть всем нужный OpenGL =)

 
Artyom Trishkin:
Чем можно заменить четвёрошную MODE_MARGINREQUIRED в mql5 ?
OrderCalcMargin() попробуйте https://www.mql5.com/ru/docs/trading/ordercalcmargin&nbsp;
 
Andrey Barinov:
OrderCalcMargin() попробуйте

Это понятно, но оно не работает с индикатора

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

Это понятно, но оно не работает с индикатора

  double One_Lot=0.0;
  OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),One_Lot);
  Comment(One_Lot);
Об этом прямо в справке написано, что не работает из индикатора https://www.mql5.com/ru/docs/runtime/running&nbsp;
 
Andrey Barinov:
Об этом прямо в справке написано, что не работает из индикатора https://www.mql5.com/ru/docs/runtime/running&nbsp;
Хотелось бы расчёт, не зависимый от типа программы.
 
Artyom Trishkin:
Хотелось бы расчёт, не зависимый от типа программы.
Ооо, мне тоже много чего хотелось бы :)
 
Andrey Barinov:
Ооо, мне тоже много чего хотелось бы :)
Ну..., это не ответ...
А вопрос этот как раз по теме ветки.