Características da linguagem mql5, subtilezas e técnicas - página 7

 
Para trabalhar com arquivos RAM, a seguinte construção pode ser usada
const int handleRAM = FileOpen("\\\\.\\pipe\\RAM", FILE_READ | FILE_WRITE | FILE_BIN);

Crie previamente um ficheiro apropriado.

Com esta implementação é conveniente/rápido, por exemplo, copiar matrizes de qualquer dimensão (e diferentes) umas para as outras - sem violar o 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);                                                                   \
    }                                                                                         \
  }
É uma solução universal. Os clássicos de tal cópia parecem-se com isto
// Копирует двумерный массив в одномерный
#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];                        \
  }
São usadas macros em vez de funções, porque é impossível passar um array de tamanho universal para funções.
 
Dmitry Fedoseev:

A questão é que a OnTradeTransaction() não irá acionar imediatamente após o OrderSend.

Em resumo, há apenas uma multidão de argumentistas aqui sem entrar no assunto da discussão.

Existem duas variantes do algoritmo se algo tiver de ser feito imediatamente após OrderSend():

1. Podemos iniciar um loop à espera de actualizações das listas de encomendas e ofertas.

2. Termine OnTick() e espere a OnTradeTransaction() acionar.

3. Marque com um visto para ver se uma nova ordem ou negócio aparece na lista.

Escolhendo 2 e 3 ))
 
O que pode substituir o quádruplo MODE_MARGINREQUIRED em mql5 ?
 
Artyom Trishkin:
O que posso fazer em vez do MODE_MARGINREQUIRED em mql5 ?

Isso é algo que você precisa perguntar aos desenvolvedores, porque nenhum dos membros do fórum sabe disso. Fiz esta pergunta 4 vezes em diferentes tópicos, uma vez até obtive a resposta: "use search", mas há mais de 100 perguntas em busca e não há uma única resposta. O desenvolvedor não está respondendo à pergunta, provavelmente devido ao fato de que em Cinco não há possibilidade de obter a margem para pares diferentes da moeda de depósito.

Tudo ainda está cru em Cinco e parece que vai ficar assim, mas há um OpenGL para todos =)

 
Artyom Trishkin:
O que pode substituir o quádruplo MODE_MARGINREQUIRED em mql5 ?
OrderCalcMargin() tente https://www.mql5.com/ru/docs/trading/ordercalcmargin
 
Andrey Barinov:
OrderCalcMargin() tente

Isto é compreensível, mas não funciona a partir do 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:

Isto é compreensível, mas não funciona com o indicador

  double One_Lot=0.0;
  OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),One_Lot);
  Comment(One_Lot);
Diz logo na ajuda que não funciona a partir do indicador https://www.mql5.com/ru/docs/runtime/running
 
Andrey Barinov:
Isto está escrito explicitamente na ajuda, que não funciona a partir do indicador https://www.mql5.com/ru/docs/runtime/running
Gostaria de um cálculo que fosse independente do tipo de programa.
 
Artyom Trishkin:
Eu gostaria de um cálculo que fosse independente do tipo de programa.
Oooh, eu também gostaria de muitas coisas :)
 
Andrey Barinov:
Oooh, eu também gostaria muito :)
Bem... isso não é uma resposta...
E esta pergunta é apenas sobre o tema do ramo.

Razão: