Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 705

 
multiplicator:
por alguma razão o terminal não apresenta erros)

Você não pode fazer isso você mesmo?

 
multiplicator:
Por algum motivo, o terminal não apresenta erros)

O que o terminal tem a ver com ele? Você tem que levar em conta a classificação por volume em seu programa.

Tente programar o envio de um pedido para abrir uma posição com lote 0,000001, ou 0,12345678, ou 100000.1, etc.

 
Алексей Тарабанов:

Você não pode fazer isso você mesmo?

O quê? Não aparece.
 
Artyom Trishkin:


Tente enviar uma ordem programada para abrir uma posição com o lote 0,12345678

abre com o lote 0,12.

A questão é se normalizar ou não normalizar.

 
Artem, por que você não os esquece?
 
Alekseu Fedotov:

Experimente este aqui.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}


aqui é onde não está claro:
  if (ls>0) k=1/ls; else k=1/ml;
que diferença faz o lote fazer mais do que zero ou menos.
 
Алексей Тарабанов:
Artem, por que você não os esquece?
Vá se foder.
ir dormir.
 
multiplicator:

abre com um lote de 0,12.

A questão é normalizar ou não normalizar.

Estou farto disso. O que o lote tem a ver com o preço pelo qual ele abriu, seu paciente?

 
Алексей Тарабанов:

Estou farto disso. O que o lote tem a ver com o preço a que você o abriu, seu paciente?

Velho, ninguém lhe perguntou nada. Vá dormir.

Quando leio suas mensagens no fórum, penso que "este homem tem um cérebro fraco".
 
Alekseu Fedotov:

Experimente este aqui.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}

Aqui ele divide por tamanho de lote, descarta o restante, e depois leva quantas dessas etapas de lote recebeu.

Pode haver aqui um erro.

Por exemplo, colocamos o valor na função: 7 lotes.
O corretor tem um volume de lote mínimo de 5 e um passo de lote de 2.


Ele dividirá 7 pelo incremento do lote. Ele levará o número de partes inteiras. E multiplicar novamente pelo incremento do lote. O resultado serão 6 lotes. E ele tentará abrir um pedido com este volume.
Mas o pedido só pode ser aberto com volumes como 5, 7, 9, etc.


Seria melhor subtrair o tamanho mínimo do lote (5) de nosso lote (7). E com o restante para trabalhar.

realizar todas as ações com o restante, que tem uma função.

Conte quantas etapas inteiras existem, o tamanho da etapa do lote. Em seguida, multiplique o número de degraus pelo tamanho do degrau do lote. Isto nos dá 2.

Então este 2 é novamente adicionado ao tamanho do lote mínimo (5). o resultado é 5+2=7.


Mas este é um exemplo fantástico.
Os corretores agora têm um lote mínimo e incrementos de lote de 0,01
ou lote mínimo e incrementos de lote de 0,1

Razão: