Ошибки, баги, вопросы - страница 8

 
FEDOR_MQL:

А можно увидеть код если вам не трудно? А то пробую всяко разно не чего не получается.

Или есть какой то другой вариант по проще добовление в советник риск в прцентах от депо. Спасибо!

 я же вам выложил код который работает без ошибок
 
sergey1294:

Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.
 
Valmars:
Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.
 С этим уже разобрались.
 
sergey1294:
 я же вам выложил код который работает без ошибок
Ну и правильно, тока там нужно было код остальной не заремить, а выкинуть за ненадобностью...
 

меня интересует, почему не работает конструкция в таком виде, выдает ошибку - '}' - not all control paths return a value

 //+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters

input double   Lots=0.1;
input bool     MM = true;
input double   Risk = 10.0;

double lots;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(MM) lots = LotSon();      //вызов функции LotSon 
   else lots = Lots;
  }
//+------------------------------------------------------------------+
double LotSon()
{
  double LotMin     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
  double LotMax     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
  double LotStep    = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
  double Lot        = AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000.0 * Risk;
  Lot               = MathMin(LotMax,MathMax(LotMin,Lot));
  
  if (Lot < LotMin) Lot = LotMin;
  if (Lot > LotMax) Lot = LotMax;

  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
}
 
sergey1294:
 я же вам выложил код который работает без ошибок
Извините Сергей что то я его как то пропустил. Сейчас нашел. Всем БОЛЬШОЕ СПАСИБО не думал что этот вопрос так растянится
 
sergey1294:

меня интересует, почему не работает конструкция в таком виде, выдает ошибку - '}' - not all control paths return a value


А что по вашему должна возвращать эта функция. По моим соображениям -
return(Lot);
 
Interesting:
А что по вашему должна возвращать эта функция. По моим соображениям -

 Вот так не работает 


  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));

А вот так работает

  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);

  return(Lot); 

	          
 
sergey1294:

 Вот так не работает

Правильно и не работает. Кому как конечно, но я лично всегда считал, что return() нужно объявлять в конце любой функции, и компилятор меня в этом поддерживает.


PS

Лично я еще на MQL4 начал пользоваться переменной Result для расчета возвращаемого значения. При этом следует отметить, что вызов return() в конце кода функции обязателен, а наличие его в начале/в середине кода иногда будет воспринята как некий аналог break (с той лишь разницей, что сам по себе break не воспринимается компилятором как команда вернуть значение результата функции).

 

Для переменных типа double не корректно использовать условие ==. Рекомендуется сравнивать примерно вот так:

double LotSon()
{
  double LotMin     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
  double LotMax     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
  double LotStep    = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
  double Lot        = AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000.0 * Risk;
  Lot               = MathMin(LotMax,MathMax(LotMin,Lot));
  
  if (Lot < LotMin) Lot = LotMin;
  if (Lot > LotMax) Lot = LotMax;

  if (MathAbs(LotStep-0.01)<0.001)return(NormalizeDouble(Lot,2));
  if (MathAbs(LotStep-0.1)<0.001) return(NormalizeDouble(Lot,1));
  if (MathAbs(LotStep-1.0)<0.001) return(NormalizeDouble(Lot,0));
  return(-1);
}
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
Причина обращения: