Математическое округление. - страница 5

 
      int HL[bar]=28;
      double bar_d=HL[bar]/10;//bar_d получает значение 2 а не 2.8

Можете разъяснить плиз?

 
Nikolay Gaylis:

Можете разъяснить плиз?


int HL[bar]=28;
      double bar_d=HL[bar]/10.0; // должно получить значение 2.8 а не 2
 
Alexey Viktorov:


Да я понимаю....

      Print("HL[bar]:",HL[bar]);
      bar_d=HL[bar]/10;
      Print("bar_d:",bar_d);


 
Пришлось выкручиваться так
      bar_d=HL[bar];
      bar_d=bar_d/10;
 
Nikolay Gaylis:

Можете разъяснить плиз?

Результат деления на целое число - целое, результат деления на дробное - дробное. Независимо от типа делимого (числителя)

Тока есть вероятность что однажды разработчики могут тихо почикать эту фичу в сторону даблов или интов, на их выбор и без объявления, чисто "в рамках инвентаризации инструментария приведения типов". Лучше округлять явно

 
Alexander Puzanov:

Результат деления на целое число - целое, результат деления на дробное - дробное. Независимо от типа делимого (числителя)

Тока есть вероятность что однажды разработчики могут тихо почикать эту фичу в сторону даблов или интов, на их выбор и без объявления, чисто "в рамках инвентаризации инструментария приведения типов". Лучше округлять явно


Просто  полтергейст..-делаю тоже самое отдельно-всё норм

void OnTick()
  {
   int HL[50];
   int bar=0;
   HL[bar]=28;
   double bar_d=HL[bar]/10.0;
   Print(bar_d);
  }
 

Люди добрые, подскажите пожалуйста как вставить функцию округления? MQL5

  {
            if(!position.SelectByIndex(i))continue;

            if(position.Symbol()!=_Symbol)continue;

            double lot=NormalizeVolume(_Symbol,position.Volume()/2.0);     ///   КАК ВСТАВИТЬ ФУНКЦИЮ ОКРУГЛЕНИЯ?


            if(position.PositionType()==POSITION_TYPE_BUY)trade.Sell(lot);
            if(position.PositionType()==POSITION_TYPE_SELL)  trade.Buy(lot);
            break;
           }

Если при закрытии половины открытая поза не делиться на 2 (например 0.75 , 1.25, 5.25 ) советник ругается  (шаг объема 0.25)

Пример при попытки закрытия  половины от  0.75 lot    CTrade::OrderSend: market buy 0.38 Ger30 [invalid volume]

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Oleg:

Люди добрые, подскажите пожалуйста как вставить функцию округления? MQL5

  {
            if(!position.SelectByIndex(i))continue;

            if(position.Symbol()!=_Symbol)continue;

            double lot=NormalizeVolume(_Symbol,position.Volume()/2.0);     ///   КАК ВСТАВИТЬ ФУНКЦИЮ ОКРУГЛЕНИЯ?


            if(position.PositionType()==POSITION_TYPE_BUY)trade.Sell(lot);
            if(position.PositionType()==POSITION_TYPE_SELL)  trade.Buy(lot);
            break;
           }

Если при закрытии половины открытая поза не делиться на 2 (например 0.75 , 1.25, 5.25 ) советник ругается  (шаг объема 0.25)

Пример при попытки закрытия  половины от  0.75 lot    CTrade::OrderSend: market buy 0.38 Ger30 [invalid volume]

Найдите статью "Какие проверки должен пройти советник..." Там есть пример функции.
 
Alexey Viktorov:
Найдите статью "Какие проверки должен пройти советник..." Там есть пример функции.

Я совсем не программист. Максимум могу цифры в коде подправить. Посмотрел статью, ничего похожего не увидел.

Если не сложно подскажите что куда надо вписать. Я так понимаю надо всего одну строчку подправить.

 
Oleg:

Я совсем не программист. Максимум могу цифры в коде подправить. Посмотрел статью, ничего похожего не увидел.

Если не сложно подскажите что куда надо вписать. Я так понимаю надо всего одну строчку подправить.

Вот более точная ссылка. Там есть пример функции. Конкретно с этой функцией я не разбирался, не знаю как из неё получить нужное значение. Там по ссылке можно получить сообщение о корректности объёма и сообщение true или false. Моя функция возвращает размер лота, но с шагом, типа 0.25 я её не проверял, в связи с отсутствием необходимости.

#define volume_max(symbolName)              SymbolInfoDouble(symbolName, SYMBOL_VOLUME_MAX)
#define volume_min(symbolName)              SymbolInfoDouble(symbolName, SYMBOL_VOLUME_MIN)
#define volume_step(symbolName)             SymbolInfoDouble(symbolName, SYMBOL_VOLUME_STEP)


double ContractSize(double volume, string symbol = NULL)
{
   symbol = symbol == NULL ? _Symbol : symbol;
   double v = volume;
   int ratio = (int)floor(volume/volume_step(symbol));
   if(fabs(ratio*volume_step(symbol)-volume) > _Point)
   v = ratio*volume_step(symbol);
   return(v < volume_min(symbol) ? volume_min(symbol) : v > volume_max(symbol) ? volume_max(symbol) : v);
}/*******************************************************************/
По идее в функцию надо передать значение лота, а функция вернёт значение кратное шагу или минимальное значение лота. Или максимальное если переданное значение будет больше максимально допустимого.
Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
Причина обращения: