Передача входных параметров в функцию

 

Продолжаю писать блок расчета мани-менеджмента. 

Компилируется без ошибок, расчет производится, но при изменении входных параметров Risk и StopLoss конечный результат (размер лота) не меняется. Прошу помочь разобраться.

input double Risk     = 3;
input  int   StopLoss = 40;
int OnInit()
{
return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
}

void OnTick()
{
 Comment(DoubleToString(LotsByRisk(Risk,StopLoss),2));
 Print("Размер лота:",DoubleToString(LotsByRisk(Risk,StopLoss),2));
} 

double LotsByRisk(double risk, int SL)
{
 double LotMin       = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);          // объем минимального лота (0,01)
 double LotMax       = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);          // объем максимального лота (100)
 double LotStep      = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);         // минимальный шаг изменения объема для заключения сделки (0.01)
 double PricePoint_EURUSD = 0.10; //стоимость 1 пункта
 double PricePoint_USDJPY = 0.09; //стоимость 1 пункта
 double lot = 0;

    if(LotMin <= 0 || LotMax <= 0 || LotStep <= 0)
    return 0;

 lot = AccountInfoDouble(ACCOUNT_BALANCE) * risk / 100 / SL; // стоимость 1 пункта относительно % риска и размера стоп-лосса
    
    if (_Symbol == "EURUSD")
    {
     lot = NormalizeDouble(lot / PricePoint_EURUSD,2);
     Alert("текущий символ EURUSD");
    }
    else
     lot = NormalizeDouble(lot / PricePoint_USDJPY,2);
     Alert("график по другой паре");
  
  lot = NormalizeDouble((lot * LotStep),2);
     if (lot < LotMin) 
     {
     lot = LotMin;
     Alert ("Объем меньше минимального, задаю минимальное значение = ", LotMin, " лот(а)");
     }
     
     if (lot > LotMax)
     {
      lot = LotMax;
      Alert ("Объем больше минимального, задаю максимальное значение = ", LotMax, " лот(а)");
     } 

  return(lot);
}
 
Sergey:

Продолжаю писать блок расчета мани-менеджмента. 

Компилируется без ошибок, но при изменении входных параметров Risk и StopLoss конечный результат (объем лота) не меняется. Как будто в буфере есть какие-то значения по умолчанию. Прошу помочь разобраться.

Совсем уже обленились).

Эта строчка не может скомпилироваться по причине разного количества открывающихся и закрывающихся скобок:

Comment(DoubleToString(LotsByRisk(Risk,StopLoss),2);
 
Aliaksandr Hryshyn:

Совсем уже обленились).

Эта строчка не может скомпилироваться по причине разного количества открывающихся и закрывающихся скобок:

Видимо скобка во время копирования кода потерялась). Исправил, но проблема осталась. Расчет производится без привязки к задаваемым "Risk" и "StopLoss"...

 
Sergey:

Видимо скобка во время копирования кода потерялась). Исправил, но проблема осталась. Расчет производится без привязки к задаваемым "Risk" и "StopLoss"...

в свойствах внешних параметров советника не нули?

попоробуйте сначала так:

double Risk     = 3;
int   StopLoss = 40;
 
lot = AccountInfoDouble(ACCOUNT_BALANCE) * risk / 100 / SL; // стоимость 1 пункта относительно % риска и размера стоп-лосса

вот тут нужно попробовать так:

lot = AccountInfoDouble(ACCOUNT_BALANCE) * risk / 100.0 / SL; // стоимость 1 пункта относительно % риска и размера стоп-лосса

или SL сделать double

или double(SL) написать

в MQL5 иногда бывает автоматическое приведение типов там где его не ожидаешь

 

Risk и risk - разные переменные. 

StopLoss и SL - тоже. 

 
Sergey:

Продолжаю писать блок расчета мани-менеджмента. 

Компилируется без ошибок, расчет производится, но при изменении входных параметров Risk и StopLoss конечный результат (размер лота) не меняется. Прошу помочь разобраться.

Слишком большой код и для каждой Валюты прописывать надо. Вот код попроще.


double LotsByRisk(int op_type,double risk,int sloss)
  {
   double  lot_min = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   double  lot_max = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double lot_step = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   double  lotcost = ((SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE)*_Point)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)));
   double lot = 0;
   double UsdPerPip = 0;
   lot = AccountInfoDouble(ACCOUNT_BALANCE)*risk/100;
   UsdPerPip = lot/sloss;
   lot = NormalizeDouble(UsdPerPip/lotcost, 2);
   lot = NormalizeDouble(lot/lot_step, 0) * lot_step;
   if(lot < lot_min)
      lot = lot_min;
   if(lot > lot_max)
      lot = lot_max;
   return(lot);
  }
Причина обращения: