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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Sergey
169
Sergey  

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

Компилируется без ошибок, расчет производится, но при изменении входных параметров 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);
}
Aliaksandr Hryshyn
2732
Aliaksandr Hryshyn  
Sergey:

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

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

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

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

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

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

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

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

Renat Akhtyamov
15690
Renat Akhtyamov  
Sergey:

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

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

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

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

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

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

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

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

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

Алексей Тарабанов
9756
Алексей Тарабанов  

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

StopLoss и SL - тоже. 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий