
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
"Вы" - это множественное число. "Ты" - это единственное число. Во смотри, ты переделал мой пример кода в более правильную форму или возможно ты уже им пользовался. НО почему ты изначально не мог выложить сюда эту умную информацию, которая помогла бы людям. Тема была создана в 2007 году, накопилось три страницы полного бреда вплоть до того, что у кого-то виндонс не тот стоит (поэтому ошибка) или МТ не обновлён.
Молодец что нашёл ошибку! Давай тогда поменяем строчки местами
double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP); // это шаг лота
lot = (int)(lot/lotstep) * lotstep; /// вот такая вот формула (лот делим на шаг, округляем до целых, и умножаем на шаг)
if (lot < MarketInfo(Symbol(),MODE_MINLOT)) lot = MarketInfo(Symbol(),MODE_MINLOT); // проверяем чтобы наш лот НЕ был меньше минимального
if (lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot = MarketInfo(Symbol(),MODE_MAXLOT); // проверяем чтобы наш лот НЕ был больше максимального
lot = NormalizeDouble(lot,2);
У меня как-то давно были проблемы со значениями 0,1500000000, тоже появлялась ошибка 131 из-за этого. Возможно в новых обновлениях это уже и неважно!
"Вы" - это множественное число. "Ты" - это единственное число.
ОК, давай на ты.
Во смотри, ты переделал мой пример кода в более правильную форму или возможно ты уже им пользовался. НО почему ты изначально не мог выложить сюда эту умную информацию, которая помогла бы людям. Тема была создана в 2007 году, накопилось три страницы полного бреда вплоть до того, что у кого-то виндонс не тот стоит (поэтому ошибка) или МТ не обновлён.
Просто подобных тем было множество. И приведенный мною код был выложен также. Изначальная идея кода принадлежит не мне. Сейчас уже не помню, кому: то ли Дмитрию Федосееву, то ли Андрею Хатимлянскому, то ли Игорю Киму. Ну а эту тему до сегодняшнего дня я попросту не видел.
Молодец что нашёл ошибку! Давай тогда поменяем строчки местами
double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP); // это шаг лота
lot = (int)(lot/lotstep) * lotstep; /// вот такая вот формула (лот делим на шаг, округляем до целых, и умножаем на шаг)
if (lot < MarketInfo(Symbol(),MODE_MINLOT)) lot = MarketInfo(Symbol(),MODE_MINLOT); // проверяем чтобы наш лот НЕ был меньше минимального
if (lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot = MarketInfo(Symbol(),MODE_MAXLOT); // проверяем чтобы наш лот НЕ был больше максимального
lot = NormalizeDouble(lot,2);
У меня как-то давно были проблемы со значениями 0,1500000000, тоже появлялась ошибка 131 из-за этого. Возможно в новых обновлениях это уже и неважно!
Дело в том, что строка:
lot = (int)(lot/lotstep) * lotstep
является эквивалентом функции NormalizeDouble. Поэтому последняя строка попросту лишняя в коде. К тому же в ней идет упор на то, что объемы всегда имеют 2 значащих цифры после запятой. Но ведь нам неизвестно, что будет в будущем. Может введут нанолоты (0.001). Тогда NormalizeDouble все испортит.
P. S. При вставке кода пользуйся кнопкой SRC. Так код будет лучше выглядеть.
P.P.S. При озвученных мною значениях минлота и лотстепа оба варианта (и мой, и твой) будут работать некорректно ))). Ведь не учтен как раз вариант, когда lotStep > minLot или не кратен ему. В таких случаях нужно к результату minLot добавлять.
Ладно. Ты прав. Молодец! Главное ты нашёл как исправить проблему и это важно. А раз так эту тему можно закрыть! ))) И удалить ))) А завтра появится новая похожая тема, где будут опять мусолить ошибку 131 с предложениями обновить виндовс. И опять же кто-то напишет правильное решение, ты это решение переделаешь ещё правильнее, вспомнишь своих корешей которые являются гуру в это вопросе, вспомнишь что эта тема уже была ну и тд.
Кстати при наборе в яндексе "mql4 ошибка 131", яндекс выдаёт этот форум и эту ветку в форуме.
Кстати при наборе в яндексе "mql4 ошибка 131", яндекс выдаёт этот форум и эту ветку в форуме.
Все проще. Есть специальная статья от разработчиков терминала. И там имеется функция для проверки корректности объема.
Здарова! )
Вот ещё тему придумал! При частичном закрытии ордера, тоже нужно учитывать шаг лота и минималку?!?!?!?!
Пример: Висит открытый ордер объёмом 1 лот. Параметры брокера: минималка 0.10 , шаг лота 0.05.
Получается тут тоже нужно учитывать шаги. То есть я не смогу закрыть от ордера 0.01, минимум 0.05. А так же не смогу закрыть 0.06, только или 0.05 или 0.10 и тд до минималки. Дошли до минималки и опять препятствие - кусок в 0.95 от ордера в 1 лот тоже не закроется.
Подскажите что надо исправить советник выдает ошибку OrderSend error 131
Вот код
//+----------------------------------------------------------------------------+
//| Возвращает размер лота, в зависимости от настроек |
//+----------------------------------------------------------------------------+
double GetLot()
{
double tmpLots;
int iDigitsForLot = 3;
double _Risk = Risk;
string Symb = Symbol();
double OneLot = NormalizeDouble(MarketInfo(Symbol(),MODE_MARGINREQUIRED), Digits);
double MinLot = NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT), Digits);
double StepLot = NormalizeDouble(MarketInfo(Symbol(),MODE_LOTSTEP), Digits);
double Free =AccountFreeMargin();
double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
double MaxLotCurBalans = AccountBalance()/MarketInfo(Symbol(),MODE_MARGINREQUIRED); // макисмально допустимый лот при текущем балансе
if(StepLot == 0.001)
iDigitsForLot = 3;
if(StepLot == 0.01)
iDigitsForLot = 2;
if(StepLot == 0.1)
iDigitsForLot = 1;
if(Lots>0)
{
double Money=Lots*OneLot;
if(Money<=AccountFreeMargin())
tmpLots=Lots;
else
tmpLots=MathFloor(Free/OneLot/StepLot)*StepLot;
}
else
{
if(_Risk>100)
_Risk=100;
if(_Risk <- 0.0)
tmpLots=MinLot;
else
tmpLots=MathFloor(Free*_Risk/100/OneLot/StepLot)*StepLot;
}
if(tmpLots<MinLot)
tmpLots=MinLot;
if(tmpLots>Max_Lot)
tmpLots=Max_Lot;
if(tmpLots > MaxLotCurBalans)
tmpLots = MaxLotCurBalans;
return (NormalizeDouble(tmpLots, iDigitsForLot));
}
Подскажите что надо исправить советник выдает ошибку OrderSend error 131
Такой подход:
не годится. Шаг изменения объема далеко не всегда кратен 10.
Для приведения объема к разрешенному используйте:
Такой подход:
не годится. Шаг изменения объема далеко не всегда кратен 10.
Для приведения объема к разрешенному используйте:
спасибо но не получается все равно выдает ошибку
спасибо но не получается все равно выдает ошибку
Так функцию нужно не только вставить в код, но и применить ))
Так функцию нужно не только вставить в код, но и применить ))
Извиняюсь можете помочь