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

 
Urain:

И так и так.

if(a==0){выражение} значит если а равно 0 то  истино, значит исполняем {выражение}.

if(a=0){выражение} равносильно такой записи if(a){a=0;выражение} , те если а истино то { а присвоить 0, выражение}.

второе не верно правильнее написать так

if(a=x) { выражение  }  присвоить переменной а значение x, и если a после этого не 0, то выполнить выражение

при if(a=0) {  }  после оптимизации останется только a=0

 
mql5:

второе не верно правильнее написать так

if(a=x) { выражение  }  присвоить переменной а значение x, и если a после этого не 0, то выполнить выражение

при if(a=0) {  }  после оптимизации останется только a=0

Сори, точно так, выражения то выполняются слево на право.

Поэтому сначало идёт присвоение а потом проверка на истинность.

 
Renat:

Примерно так:

Этот код не только вычисляет максимальный объем, но и точно вписывает его в ограничения настроек символа.

Вычислять-то - вычисляет, но, затем, вписывая, - забывает, для чего вычислял:

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

Значение lot к этому моменту рассчитано так, чтобы потребить всю доступную маржу с минимальным запасом.

Если это значение увеличить хотя бы на volume step, то денег на открытие позиции не хватит.

А ведь вторая строчка процитированного кода УВЕЛИЧИВАЕТ значение lot в случае выполнения условия под if, и может увеличить его на значительно большую величину, чем величина volume step, потому что реально встречаются volume min = 0.1, а volume step = 0.01.

А в этом коде, ниже, может случиться деление на ноль, от которого защиты нет:

   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

Если SymbolInfoDouble() вернёт 0, то - всё. По делению на 0 программы MQL5 ведь завершаются на корню? Не может вернуть 0? Люди тут жалуются, что информационные функции достаточно часто возвращают 0. Закладываться на "не вернёт 0" нельзя, поскольку, во-первых, может вернуть, а, во-вторых, деление на 0 фатально.

Есть и менее значимые замечания по "точности вписывания", но они - действительно не слишком существенны, то есть, не имеют таких серьёзных последствий, можно не заострять.

Предваряя возможные аргументы по поводу того, что код - "примерный", замечу: а многие ли пользователи продукта в состоянии найти и грамотно исправить подобные "нехорошие места"?

Для них это - "код от разработчиков". Пример, на который надо равняться.

 

Почему при заполнении всех обязательных полей не активна кнопка "Далее"?

 

 
EvgeTrofi:

Почему при заполнении всех обязательных полей не активна кнопка "Далее"?

Нужно дать добро на получение новостей по почте.
 
simpleton:

Вычислять-то - вычисляет, но, затем, вписывая, - забывает, для чего вычислял:

Предваряя возможные аргументы по поводу того, что код - "примерный", замечу: а многие ли пользователи продукта в состоянии найти и грамотно исправить подобные "нехорошие места"?

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

Вот исправленный вариант:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
     {
      double newlot=stepvol*NormalizeDouble(lot/stepvol,0);
      if(newlot>lot) lot=NormalizeDouble(newlot-stepvol,2);
      else           lot=newlot;
     }

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=0.0;   // 

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
 
gumgum:

И зачем session_index++; если при session_index=1 уже false:

 

Мы не можем знать заранее какое количество сессий по инструменту. Поэтому запрашиваем каждую сессию по номеру. ЕСли получили true

session_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish);

то интересуемся временем ее начала и конца. Получили false - всё, сессии с  таким номером не существует.

 
Rosh:

Мы не можем знать заранее какое количество сессий по инструменту. Поэтому запрашиваем каждую сессию по номеру. ЕСли получили true

то интересуемся временем ее начала и конца. Получили false - всё, сессии с  таким номером не существует.

А...... а почему тогда в пятницу всему в 24:00 конец, а в реальности в 23:00?
 
gumgum:
А...... а почему тогда в пятницу всему в 24:00 конец, а в реальности в 23:00?
Потому что так высталено на сервере. Проверим, спасибо.
 
Я так понял, что теперь можно поменять свой email в профиле? В поле E-mail теперь можно внести изменения, но они не сохраняются!
Причина обращения: