'Кол-во значащих после запятой'
пользуюсь этим:
int DigLot=0; if (MarketInfo(Symbol(), MODE_MINLOT) ==0.1) DigLot=1; if (MarketInfo(Symbol(), MODE_MINLOT) ==0.01) DigLot=2; // NormalizeDouble(чтото, DigLot );
'Кол-во значащих после запятой'
пользуюсь этим:
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 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);
Сто раз уже писал. Аж надоело :). Ну почему поиском народ не пользуется ? Держите - это в последний раз :).
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); }
С уважением,
Дмитрий
ЗЫ: кхе-кхе... ну вот... пиписьками померялись :)
не смог пройти мимо
Игорь в своей ветке тоже продублируй, ведь потом снова нород будет мучаться искать.
Всем спасибо. Вообще-то, я по простоте душевной, надеялся, что есть какая-то встроенная константа вроде Digits, которая и указывает количество знаков после запятой для количества лотов.
Может разработчики MQL4 добавят такую константу?
Да надо бы...
как видим обьект мерения оказался таки восстребованым ;)))
Сто раз уже писал. Аж надоело :). Ну почему поиском народ не пользуется ? Держите - это в последний раз :).
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 и так и так. Потому использую как привел выше.
Успехов.
Всем спасибо. Вообще-то, я по простоте душевной, надеялся, что есть какая-то встроенная константа вроде Digits, которая и указывает количество знаков после запятой для количества лотов.
Может разработчики MQL4 добавят такую константу?
Да я же Вам написал как ее расчитать. Что Вас не устраивает то ? Сделайте константу nLotsDigits глобальной и добавьте строку в функцию инит и забудьте - то есть пользуйтесь как и встроенной Digits.
Успехов.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как правильно нормализовать количество лотов возвращаемых функциями OrderLots() и MarketInfo() ?
Т.е. что поставить вместо XXX в выражениях вида
NormalizeDouble( OrderLots(), XXX )
и
NormalizeDouble( MarketInfo(Symbol(), MODE_MINLOT), XXX );