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

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

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


int nLotsDigits    = MathCeil(MathAbs(MathLog( MarketInfo(Symbol(), MODE_MINLOT) )/MathLog(10)));
Успехов.


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

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

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


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

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


Все дело в том, что выражение

MathCeil(MathAbs(MathLog( 0.25 )/MathLog(10))) = 1

Следовательно и значение лота округлится до одного знака после запятой.

С уважением,

Дмитрий

 

На мой взгляд правильнее будет вместо значения минимального лота брать шаг приращения лота, то есть:

MathCeil(MathAbs(MathLog(MarketInfo(Symbol(), MODE_LOTSTEP))/MathLog(10)))

А уже после получения расчетного значения сравнивать его с минимальным и максимальным, корректируя при необходимости:

double MinLot = MarketInfo(Symbol(), MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);
 
if(Lots < MinLot)
  Lots = MinLot;
if(Lots > MaxLot)
  Lots = MaxLot;

Сомневаюсь, что какому-нибудь брокеру придет в голову ставить шаг приращения лота не степень 10, а вот такую экзотику как 0.25 лота.

И наоборот, встречаются брокеры с MinLot = 0.1 и LotStep = 0.01.

 
Scriptong:

Сомневаюсь, что какому-нибудь брокеру придет в голову ставить шаг приращения лота не степень 10, а вот такую экзотику как 0.25 лота.

Есть, правда 0.2

и минилот и шаг всё по 0.2

Это было указано в спецификациях или ФАК, найду скажу точно кто это был... ;)

 
4xTrim:
VladislavVG:

Все дело в том, что выражение


MathCeil(MathAbs(MathLog( 0.25 )/MathLog(10))) = 1

Следовательно и значение лота округлится до одного знака после запятой.

С уважением,

Дмитрий

Действительно, Вы правы про  0,25 - это я тормознул....

Поскольку мин лот мне такой не попадался - вот и не смотрел.

Бывает :).

Успехов.

 

kombat писал (а):

Есть, правда 0.2

и минилот и шаг всё по 0.2

Это было указано в спецификациях или ФАК, найду скажу точно кто это был... ;)

Ух ты! Не встречал.

Ну тогда все-таки нужно применять функцию от KimIV. Хотя там тоже при больших значениях LotStep (например 10) пойдет округление в сторону увеличения количества лотов. Скажем, 40.3 будет преобразовываться в 50 лотов. Надеюсь, таких брокеров уже не найдется...

 

Я хочу обьяснить почему у нас лот 0.20 а остальною уже вашего ума дело.
Так как наша компания оперирует без дилеров –людей у нас условия будут немного разными чем в сравнении с компаниями которые имеют дилеров людей, которые видят ваши сделки и ордера и заранее готовы к вашим сделкам,(к примеру стопы . лимит ордера и тд.) Здесь же ваш ордер принимает автоматическая машина . Мы ее настроили на 0.20 лота так как нам так удобнее. 0.10 лота программа не может выводить на мост в интербанк. Если бы мы имели 0.10 лота мы вынуждены были бы не вуводить их исполнение в интербанк, а оставлять внутри компании. Исходя из того что мы не хотим этого делать мы отключили 0.10 лота так как автоматическая машина настроена так, что принимает только 0.20 лота для обработки и вывода в интербанк .

Вот, практически "из первых рук" ;)))

А банчок уж сами найдёте...

 

Я тут поразмылил немного и придумал такое решение:

int precision=MathMax(0,StringLen(StringConcatenate(lotstep-MathFloor(lotstep),""))-2);

Правильность 100%.

Кто придумает проще? :)

 

Я тут всех выслушал (вычитал), учёл все замечания и оформил надлежащим образом:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления (False - в меньшую, True - в большую сторону)    |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False) {
  double l, 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;
  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);
}
Есть вопрос. Кто-нибудь встречал разные значения степа лота, минимального и максимального лотов для разных символов?
 
Есть вопрос. Кто-нибудь встречал разные значения степа лота, минимального и максимального лотов для разных символов?

Не знаю это ли...

У некоторых ДЦ на разных инструментах следующее:

- форексные 0.01, а фучерсные и руакции по 1 лоту

(и минилот и шаг)

 
kombat:
Есть вопрос. Кто-нибудь встречал разные значения степа лота, минимального и максимального лотов для разных символов?

Не знаю это ли...

У некоторых ДЦ на разных инструментах следующее:

- форексные 0.01, а фучерсные и руакции по 1 лоту

(и минилот и шаг)

да... оно самое... тоды усовершенствуем функцию нормализации:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
Причина обращения: