Округление лота

 
Подскажите, как правильно округлять лот для открытия позиции, например лот 0.016 , пытался округлять так: OrderSend(Symbol(),OP_SELL,MathRound(martinS),Bid,30,0,0,"",MAGIC,0,Red); , но видимо что то делаю не так, (в MartinS сейчас значение 0.016, нужно чтоб сделка открылась с лотом 0.02)
 
xjasond:
Подскажите, как правильно округлять лот для открытия позиции, например лот 0.016 , пытался округлять так: OrderSend(Symbol(),OP_SELL,MathRound(martinS),Bid,30,0,0,"",MAGIC,0,Red); , но видимо что то делаю не так, (в MartinS сейчас значение 0.016, нужно чтоб сделка открылась с лотом 0.02)
NormalizeDouble(Lot,2);
 
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)
Отнять минимальный лот, поделить на шаг лота, округлить, умножить на шаг лота, прибавить минимальный лот, нормализовать, подравнять по минимальному и по максимальному лоту. Нормализовать можно до восьми знаков, не заморачиваться определением числа знаков после запятой, к тому же, методу определение через логарифм очень далеко до совершенства. 
 
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, " лот(а)");
   }

 ***