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

 
FEDOR_MQL:

А при данной стади развития: параметры, вызов функции и сама функция должно показывать ошибки при компиляции или нет. Если да то почему? У меня ошибки показывает

Да, действительно, почему-то ошибки хотя их не должно быть. Прошу разработчиков обратить на это внимание, переделал вот так, ошибок нет, но при использовании переключателя switch все равно выдает ошибку.

 //+------------------------------------------------------------------+
#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;
  // Вариант первый
  /*
  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }
  */
  // Вариант второй
  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
  // Вариант третий
  // if (LotStep == 0.01)     Lot=NormalizeDouble(Lot,2);
  // else if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  // else if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
 return(Lot); 
}
 
sergey1294:

Да, действительно, почему-то ошибки хотя их не должно быть. Прошу разработчиков обратить на это внимание, переделал вот так, ошибок нет, но при использовании переключателя switch все равно выдает ошибку.

  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }

Сюда нужно посылать лоты в виде int, т.е. 0.01 = 1000, а 0.10 = 10000...

 
Interesting:

Сюда нужно посылать лоты в виде int, т.е. 0.01 = 1000, а 0.10 = 10000...

 По вашему получается что функция
SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
возвращает значение 1000 вместо 0.01
 
sergey1294:
 По вашему получается что функция
возвращает значение 1000 вместо 0.01

Нет, я говорил про, то что ошибка уйдет если код будет выглядеть вот так:

  switch(StepSize)
  {
   case 1000:   Lot=NormalizeDouble(Lot,2);break;
   case 10000:  Lot=NormalizeDouble(Lot,1);break;
   case 100000: Lot=NormalizeDouble(Lot,0);break;
  }
 
Только сейчас заметил что в
switch
нельзя использовать числа двойной точности, тогда этот вариант нельзя использовать в этом случае.
 
sergey1294:
Только сейчас заметил что в
нельзя использовать числа двойной точности, тогда этот вариант нельзя использовать в этом случае.
Можно, если предварительно преобразовать лоты в int. О чем я сказал выше...
 
остается вопрос почему нельзя использовать такую конструкцию
  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
 
Interesting:
Можно, если предварительно преобразовать лоты в int. О чем я сказал выше...

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

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

 
FEDOR_MQL:

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

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

Смотря что нужно получить в конечном итоге, вот тут я к примеру приводил ряд интересных функций на счет рисков


А чтобы этот код заработал, нужно всего-то умножить лот на 100000 и подать его для входа в switch(StepSize) как параметр (переменная типа int).


PS

И вообще, если честно я не совсем понимаю назначение всех этих вариантов? Я про то, что в контексте данной функции вполе хватит и одного из последних....

 
Interesting:

Смотря что нужно получить в конечном итоге, вот тут я к примеру приводил ряд интересных функций на счет рисков


А чтобы этот код заработал, нужно всего-то умножить лот на 100000 и подать его для входа в switch(StepSize) как параметр (переменная типа int). 

Ваша статья я думаю то что мне надо. Спасибо
Причина обращения: