Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 705

 
multiplicator:
почему-то не показывает ошибок терминал)

А самому-никак? 

 
multiplicator:
почему-то не показывает ошибок терминал)

Причём здесь терминал? Вы должны в своей программе учитывать градацию объёмов.

Попробуйте программно отослать приказ на открытие позиции лотом 0.000001, или 0.12345678, или 100000.1, etc.

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

А самому-никак? 

что никак? не показывает.
 
Artyom Trishkin:


Попробуйте программно отослать приказ на открытие позиции лотом  0.12345678

открывает с лотом 0.12.

вопрос ведь в том нормализовывать или не нормализовывать.

 
Артем, может - ну их? 
 
Alekseu Fedotov:

Попробуйте вот эту.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}


вот здесь непонятно:
  if (ls>0) k=1/ls; else k=1/ml;
какая разница шаг лота больше  нуля или меньше.
 
Алексей Тарабанов:
Артем, может - ну их? 
ну тебя.
спать ложись.
 
multiplicator:

открывает с лотом 0.12.

вопрос ведь в том нормализовывать или не нормализовывать.

Достали уже. При чем тут лот, по какой цене открыл, терпила? 

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

Достали уже. При чем тут лот, по какой цене открыл, терпила? 

старый пень, тебя никто ничего не спрашивал. иди спать.

я когда твои посты на форуме читаю, то думаю "у этого человека слабый мозг".
 
Alekseu Fedotov:

Попробуйте вот эту.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

Он здесь делит на размер шага лота, отбрасывает остаток, потом берет сколько этих шагов лотов получилось.

здесь может быть ошибка.

например мы подставляем в функцию значение: 7 лотов.
у брокера минимальный объем лота 5, и шаг лота 2.


Он 7 разделит на шаг лота. возьмет количество целых частей. И опять умножит на шаг лота. Результат у него получится 6 лотов.  И он будет пытаться с этим объемом ордер открыть.
Но ордер можно открыть только с таким объемом как 5,  7, 9, и т. д.


Лучше было бы отбросить от нашего лота (7) минимальный размер лота (5). И уже с остатком работать.

с остатком выполнять все действия , что у него в функции.

считать, сколько там целых шагов, размером с шаг лота. Потом количество шагов умножать на размер шага лота. У нас получается 2.

потом эту двойку опять прибавляем к размеру минимального лота(5). получается 5+2=7.


Но это я фантастический пример даю.
сейчас у брокеров мин лот и шаг лота по 0.01
или мин лот и шаг лота по 0.1

Причина обращения: