Как правильно нормализовать количество лотов?

 

Как правильно нормализовать количество лотов возвращаемых функциями OrderLots() и MarketInfo() ?

Т.е. что поставить вместо XXX в выражениях вида

NormalizeDouble( OrderLots(), XXX )

и

NormalizeDouble( MarketInfo(Symbol(), MODE_MINLOT), XXX );

 

'Кол-во значащих после запятой'

пользуюсь этим:

int DigLot=0;
if (MarketInfo(Symbol(), MODE_MINLOT) ==0.1)  DigLot=1;
if (MarketInfo(Symbol(), MODE_MINLOT) ==0.01) DigLot=2;

//
NormalizeDouble(чтото, DigLot );
 
kombat:

'Кол-во значащих после запятой'

пользуюсь этим:

int DigLot=0;
if (MarketInfo(Symbol(), MODE_MINLOT) ==0.1)  DigLot=1;
if (MarketInfo(Symbol(), MODE_MINLOT) ==0.01) DigLot=2;

//
NormalizeDouble(чтото, DigLot );

А если мин. лот равен, допустим, 0.05?

Хотя я такого пока не встречал, но на мой взгляд все же лучше так:

   double minlot = MarketInfo(Symbol(), MODE_MINLOT);
 
   if (1/minlot <= 1)
     lotdigits = 0;
   else if (1/minlot <= 10)
          lotdigits = 1;
        else
          lotdigits = 2;

Но, опять же, если мин. лот будет равен, скажем, 0.25, то количество знаков после запятой будет определено неправильно.

С уважением,

Дмитрий

 
4xTrim:
kombat:

'Кол-во значащих после запятой'

пользуюсь этим:

int DigLot=0;
if (MarketInfo(Symbol(), MODE_MINLOT) ==0.1)  DigLot=1;
if (MarketInfo(Symbol(), MODE_MINLOT) ==0.01) DigLot=2;

//
NormalizeDouble(чтото, DigLot );

А если мин. лот равен, допустим, 0.05?

Хотя я такого пока не встречал, но на мой взгляд все же лучше так:



   double minlot = MarketInfo(Symbol(), MODE_MINLOT);
 
   if (1/minlot <= 1)
     lotdigits = 0;
   else if (1/minlot <= 10)
          lotdigits = 1;
        else
          lotdigits = 2;

Но, опять же, если мин. лот будет равен, скажем, 0.25, то количество знаков после запятой будет определено неправильно.



С уважением,



Дмитрий





Сто раз уже писал. Аж надоело :). Ну почему поиском народ не пользуется ? Держите - это в последний раз :).



int nLotsDigits    = MathCeil(MathAbs(MathLog( MarketInfo(Symbol(), MODE_MINLOT) )/MathLog(10)));

Успехов.

 

не смог пройти мимо

double dLot, k;
double ls=MarketInfo(Symbol(), MODE_LOTSTEP);
double ml=MarketInfo(Symbol(), MODE_MINLOT);
double mx=MarketInfo(Symbol(), MODE_MAXLOT);

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

if (ls>0) k=1/ls; else k=1/ml;
dLot=MathCeil(нечто * k)/k;

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

return(dLot);
 
VladislavVG писал (а):

Сто раз уже писал. Аж надоело :). Ну почему поиском народ не пользуется ? Держите - это в последний раз :).


int nLotsDigits    = MathCeil(MathAbs(MathLog( MarketInfo(Symbol(), MODE_MINLOT) )/MathLog(10)));

Успехов.



Ух тыыыыыыыы! Жаль, что я не матиматег :)

Но проблему чисел с двумя знаками после запятой и большими 0.1 данный метод тоже не решает. Попробуйте, например, 0.25.

На Си я делаю так:

int
GetDigits(double x)
{
  int res = 0;
  double z = 0.0, intpart;
 
  z = fabs(modf(x, &intpart));
  if (z > 0.0)
    while (z < 1.0)
    {
      res++;
      z *= 10.0;
      z = modf(z, &intpart);
      if (z == 0 || res > 5)
        break;
    }
  return(res);
}


С уважением,

Дмитрий

ЗЫ: кхе-кхе... ну вот... пиписьками померялись :)

 
KimIV:

не смог пройти мимо

Игорь в своей ветке тоже продублируй, ведь потом снова нород будет мучаться искать.

 

Всем спасибо. Вообще-то, я по простоте душевной, надеялся, что есть какая-то встроенная константа вроде Digits, которая и указывает количество знаков после запятой для количества лотов.

Может разработчики MQL4 добавят такую константу?

 

Да надо бы...

как видим обьект мерения оказался таки восстребованым ;)))

 
4xTrim:
VladislavVG писал (а):

Сто раз уже писал. Аж надоело :). Ну почему поиском народ не пользуется ? Держите - это в последний раз :).


int nLotsDigits    = MathCeil(MathAbs(MathLog( MarketInfo(Symbol(), MODE_MINLOT) )/MathLog(10)));

Успехов.


Ух тыыыыыыыы! Жаль, что я не матиматег :)



Но проблему чисел с двумя знаками после запятой и большими 0.1 данный метод тоже не решает. Попробуйте, например, 0.25.


Действительно, жаль, что Вы не матиматег :).


Да все он решает. Вопрос как ставился ? Получить количество значащих после запятой в величине лота. Это я перефразирую фразу "Как правильно нормализовать количество лотов".


В случае целых лотов получите 0. В случае 0,25 получите 2 - то есть две значащих после запятой. Округляете величину лота

Lots = NormalizeDouble( OrderLots(),nLotsDigits);

Получите то, что просил топикстартер.


Если у Вас минимальный лот 0,25 нужно сравнить то, что получилось с размером минимального лота. Но значащая и там и там будет вторая после запятой. То есть, варировать размер лота можно минимально вторым знаком после запятой. Кстати, кратно уже другой величине.

В одном из  ДЦов, где торгую, мин 0,02, а мин приращение 0,01 и все работает Ок !. То есть размер лота расчитывается в такой форме, например, 12.27 или 8.34 или 0.21 (обычно для агрессивной доливки ;) ).


Успехов.


ЗЫ. Сдается мне я понял о чем Вы пыталисть сказать - если минимальный размер 10 лотов, то этот расчет выдаст 1, как и для 0,1 лота. Если нужно различать порядки до и после запятой  - нужно просто убрать модуль отношения логарифмов, а оставить так.

int nLotsDigits    = MathCeil( MathLog( MarketInfo(Symbol(), MODE_MINLOT)/MathLog(10)) );

Тогда для целых лотов числа будут положительные (для 10  будет 1), а для дробных отрицательные (как и положено для 0,1 будет -1), но тока пользоваться будет не так удобно. Да и пока я не встречал ДЦ с МТ4 и минимальным сайзом в 10 лотов, а для 1 лота минимума будет 0 и так и так. Потому использую как привел выше.

Успехов.

 
Zebra:

Всем спасибо. Вообще-то, я по простоте душевной, надеялся, что есть какая-то встроенная константа вроде Digits, которая и указывает количество знаков после запятой для количества лотов.

Может разработчики MQL4 добавят такую константу?

Да я же Вам написал как ее расчитать. Что Вас не устраивает то ? Сделайте константу nLotsDigits глобальной и добавьте строку в функцию инит и забудьте - то есть пользуйтесь как и встроенной Digits.

Успехов.