Подскажите, как правильно округлять лот для открытия позиции, например лот 0.016 , пытался округлять так: OrderSend(Symbol(),OP_SELL,MathRound(martinS),Bid,30,0,0,"",MAGIC,0,Red); , но видимо что то делаю не так, (в MartinS сейчас значение 0.016, нужно чтоб сделка открылась с лотом 0.02)
- Открытие и закрытие позиций - Торговля - MetaTrader 5 для iPhone
- Групповые операции - Торговля - MetaTrader 5 для iPhone
- Спреды - Для продвинутых пользователей - Торговые операции
xjasond:
Подскажите, как правильно округлять лот для открытия позиции, например лот 0.016 , пытался округлять так: OrderSend(Symbol(),OP_SELL,MathRound(martinS),Bid,30,0,0,"",MAGIC,0,Red); , но видимо что то делаю не так, (в MartinS сейчас значение 0.016, нужно чтоб сделка открылась с лотом 0.02)
NormalizeDouble(Lot,2);
Подскажите, как правильно округлять лот для открытия позиции, например лот 0.016 , пытался округлять так: OrderSend(Symbol(),OP_SELL,MathRound(martinS),Bid,30,0,0,"",MAGIC,0,Red); , но видимо что то делаю не так, (в MartinS сейчас значение 0.016, нужно чтоб сделка открылась с лотом 0.02)
double RoundLots(const string sSymbol, const double fLot) { double fMinLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); double fMaxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); double fLotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP); // error check if(fMinLot <= 0 || fMaxLot <= 0 || fLotStep <= 0) return 0; int nLotDigits = 0; if(fLotStep < 1.0) nLotDigits = (int) MathCeil(-MathLog10(fLotStep)); double fRoundedLot = MathRound(fLot/fLotStep) * fLotStep; if(fRoundedLot < fMinLot) fRoundedLot = fMinLot; if(fRoundedLot > fMaxLot) fRoundedLot = fMaxLot; fRoundedLot = NormalizeDouble(fRoundedLot, nLotDigits); return(fRoundedLot); }
double Lots = NormalizeDouble(lot*koef_lot,LotPoint()); int LotPoint() { double steplot = MarketInfo(Symbol(),MODE_LOTSTEP); int LotsDigits = (int)MathCeil(MathAbs(MathLog(steplot)/MathLog(10))); return(LotsDigits); }
xjasond:
Подскажите, как правильно округлять лот для открытия позиции, например лот 0.016 , пытался округлять так: OrderSend(Symbol(),OP_SELL,MathRound(martinS),Bid,30,0,0,"",MAGIC,0,Red); , но видимо что то делаю не так, (в MartinS сейчас значение 0.016, нужно чтоб сделка открылась с лотом 0.02)
Отнять минимальный лот, поделить на шаг лота, округлить, умножить на шаг лота, прибавить минимальный лот, нормализовать, подравнять по минимальному и по максимальному лоту. Нормализовать можно до восьми знаков, не заморачиваться определением числа знаков после запятой, к тому же, методу определение через логарифм очень далеко до совершенства.
Подскажите, как правильно округлять лот для открытия позиции, например лот 0.016 , пытался округлять так: OrderSend(Symbol(),OP_SELL,MathRound(martinS),Bid,30,0,0,"",MAGIC,0,Red); , но видимо что то делаю не так, (в MartinS сейчас значение 0.016, нужно чтоб сделка открылась с лотом 0.02)
Dmitry Fedoseev:
Отнять минимальный лот, поделить на шаг лота, округлить, умножить на шаг лота, прибавить минимальный лот, нормализовать, подравнять по минимальному и по максимальному лоту. Нормализовать можно до восьми знаков, не заморачиваться определением числа знаков после запятой, к тому же, методу определение через логарифм очень далеко до совершенства.
Отнять минимальный лот, поделить на шаг лота, округлить, умножить на шаг лота, прибавить минимальный лот, нормализовать, подравнять по минимальному и по максимальному лоту. Нормализовать можно до восьми знаков, не заморачиваться определением числа знаков после запятой, к тому же, методу определение через логарифм очень далеко до совершенства.
Я так делаю
// открывает ордер с проверкой и нормализацией данных int OpenOrderWithCheck2(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration, color arrow_color) { int dig = (int)MarketInfo(symbol, MODE_DIGITS); double minlot = MarketInfo(symbol, MODE_MINLOT); // Минимальный размер лота double lotstep = MarketInfo(symbol, MODE_LOTSTEP); // Шаг изменения размера лота double maxlot = MarketInfo(symbol, MODE_MAXLOT); //Максимальный размер лота int lot = (int)(volume/lotstep); // округлили до целого числа шагов изменения лота volume = lot * lotstep; if(volume < minlot) { volume = minlot; Alert("OpenOrder()", "Объем меньше минимального, задаю минимальное значение = ", volume, " лот(а)"); } if(volume > maxlot) { volume = maxlot; Alert("OpenOrder()", "Объем больше максимального, задаю максимальное значение = ", volume, " лот(а)"); }
***
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь