Вместо 5% используеться 50%. В чем дело?

 

Вместо 5% используеться 50%. В чем дело?

Если ставить значене RiskMax равным 0.5, то максимальный риск составляет 50%, при значении 0.05, риск должен быть 5%, но он все равно остаеться 50%.

extern double RiskMax=0.05; double Lots=NormalizeDouble(AccountFreeMargin()*RiskMax/1000.0,1);
 
Если посчитать, что свободная маржа $2000, то 5% будет равно 0.1 лота. Что и выдает формула.
Если посчитать, что свободная маржа $20000, то 5% будет равно 1 лот. Что и выдает формула.

Ошибок нет. Может что-то другое имели в виду?
 

100*0.5/1000 = 0.05 лота. Нормализация даёт 1 лот.

100*0.05/1000 = 0.005 лота. Нормализация должна вернуть 0 лотов.... Не знаю, почему получается 50%, может проверь в остальном коде, откуда он берёт лоты для торговли.

Предлагаю такое решение для торговли мини-лотами:

double Lots = MathCeil(AccountFreeMargin()*Risk/100*AccountLeverage()/10000)*0.1

или вся функция, возвращающая количество торгуемых лотов:

double setLots()
   {
   if(staticLots==0)
      {
      double Lots = MathCeil(AccountFreeMargin()*Risk/100*AccountLeverage()/10000)*0.1;
      if(Lots<=0.1)
         {
         Print("Баланса хватает только на минимальное количество лотов.");
         Lots=0.1;
         }
      message=StringConcatenate("Количество торгуемых лотов: ", Lots);
      }
     if(staticLots!=0)
         {
         Lots=staticLots;
         message=StringConcatenate("Количество торгуемых лотов установленно вручную: ", Lots);
         }
      Print(message);
      return(Lots);
   }



 

У нас разные представления о свободной марже :о)

 
CTPAYC:

У нас разные представления о свободной марже :о)

Да, если уходить в маленькие суммы, то нормализация до 1 знака после запятой все испортит.
Нужен более тонкий инструмент расчета.
 
Спасибо ребята за внимание. Я уже решил проблему. Теперь в настройках указываю не 0.05, а 5, т.е. 5%.
extern int       RiskMax=5;

   double Lots=NormalizeDouble(AccountFreeMargin()*RiskMax/100000.0,1);