Попробуйте распечатать значения marginAllot, PercentRisk и pipsToSL, чтобы определить, откуда берется отрицательное число. Я предполагаю, что при определенных обстоятельствах pipsToSL передается как отрицательное число.
NormalizeDouble(posSize,2);
Эта строка ничего не делает.- НЕ используйте NormalizeDouble, НИКОГДА. По любой причине. Это ошибка, не используйте ее.Ее использование всегда неправильно.
- SL/TP (стопы) должны быть нормализованы к размеру тика.(На 5-значном брокере стопы разрешено ставить только на полные значения пунктов. Как узнать в mql?-MQL4 форум) и соблюдать ограничения Требования и ограничения при совершении сделок - Приложения - Самоучитель MQL4, а это требует понимания равенства с плавающей точкой Может ли цена != цена ? - MQL4 форум
- Корректировать нужно только цену открытия для отложенных ордеров. На валютах Point == TickSize, поэтому вы получите тот же ответ, но на металлах это не сработает. Так что делайте все правильно: Trailing Bar Entry EA - форум MQL4 или Bid/Ask: (Не нужно) использовать NormalizeDouble в OrderSend - форум MQL4
- Размер лота также должен быть кратен LotStep. Если это не кратно 1/10, то NormalizeDouble неверен. Сделайте это правильно.
Попробуйте распечатать значения marginAllot, PercentRisk и pipsToSL, чтобы определить, откуда берется отрицательное число. Я предполагаю, что при определенных обстоятельствах pipsToSL передается как отрицательное число.
Я действительно смог найти несколько мест в остальной части кода, где pipsToSL был неправильно рассчитан как отрицательный. Спасибо.
- Эта строка ничего не делает.
- НЕ используйте NormalizeDouble, НИКОГДА. По любой причине. Это ошибка, не используйте ее. Его использование всегда неправильно
- SL/TP (стопы) должны быть нормализованы к размеру тика.(На 5Digit Broker стопы разрешено ставить только на полные значения пунктов. Как это выяснить в mql?-MQL4 форум) и соблюдать ограничения Требования и ограничения при совершении сделок - Приложения - Самоучитель MQL4, а для этого нужно понимать равенство с плавающей точкой Может ли цена != цена ? - MQL4 форум
- Корректировать нужно только цену открытия для отложенных ордеров. На валютах Point == TickSize, поэтому вы получите тот же ответ, но на металлах это не сработает. Так что делайте все правильно: Trailing Bar Entry EA - форум MQL4 или Bid/Ask: (Не нужно) использовать NormalizeDouble в OrderSend - форум MQL4
- Размер лота также должен быть кратен LotStep. Если это не кратно 1/10, то NormalizeDouble неверен. Сделайте это правильно.
Я читал о том, что вы писали об этом раньше, но не понимал вашу мысль до последней ссылки. Спасибо.
Почему я все еще получаю ответы с несколькими знаками после запятой, если я использую MathRound()? Я пробовал использовать DoubleToString, но это не помогло. Это связано исключительно с ограничениями функции Print() или здесь что-то еще не так?
posSize = posSize * 10; MathRound(posSize); posSize = posSize / 10;
NoLimitations : Почему я все еще получаю ответы с несколькими десятичными знаками, если я использую MathRound() | MathRound возвращает двойное число; бесконечное количество десятичных знаков. |
Это не так, согласно странице документации по ней. https://docs.mql4.com/math/mathround
"Возвращаемое значение
Значение, округленное до ближайшего целого числа".
Если она должна, но не делает этого, то MQ должен быть уведомлен, или они должны поместить предупреждающий ярлык на функцию.
JD4 прав, на странице документации сказано, что он округляет до ближайшего целого числа. Я не уверен, что есть другой способ достичь того, что я пытался сделать выше, без округления или отсечения определенного количества десятичных знаков. Какой смысл в MathRound() или round(), если они не возвращают целое число?
Я также только что попробовал использовать это безрезультатно. Возможно, DTS просто изменяет точность значения для внешнего вида, а не фактическое значение? Я не вижу других вариантов.
posSize = posSize * 100; DoubleToString(posSize,0); StringToDouble(posSize); posSize = posSize / 100;
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В своей стратегии я использую функцию GetPosSize() для расчета размера позиции. На данный момент я использую стратегию только с EURUSD и не могу понять, почему posSize возвращает отрицательное значение, что приводит к ошибке OrderSend 4051. Любая помощь была бы очень признательна. Я опубликую весь соответствующий код здесь. Никаких других вычислений в отношении posSize по всему коду не производится, вызывается только функция. Все три отдельные части кода находятся внутри функции.