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

 
x572intraday #:

 Могу ответить только за &= сразу:

Справочник MQL5 / Основы языка / Операции и выражения / Операции присваивания:

по аналогии с накопительной переменной y:


Но это мой первый опыт использования &=, так что могу ошибаться.

 Нет. Сперва (по задумке) в накопительную h_plus суммируются внутри for все логические условия, а получившаяся bool-сумма подставляется в if, который к внутреннему for отношения не имеет.
Но всё же, корректнее было бы не
h_plus&=high[i]>high[i+increment];
а
h_plus = h_plus && high[i]>high[i+increment];
 
Alexey Viktorov #:

В вашем случае это не так поскольку должны быть выполнены оба условия. А вот если поставить такое

то, да. При выполненном условии «а» второе условие проверяться не будет. За это боролись много лет, а вы теперь предлагаете вернуться в прошлый век…

Хотя… в этом своём утверждении я не прав. Видимо я не совсем понял что написано тут

x572intraday #:

 Багом называть не рискну. Поэтому просто скажу, что заметил одну особенность оператора if. Прозреваю, это может относиться и к другим ЯПам.

Если a окажется true, то проверка перейдёт к Array[over_index] и тут-то терминал начнёт дико бомбить по части 'array out of range', что совершенно справедливо. Если же a окажется false, до проверки условия истинности Array[over_index], а значит, и избыточности индекса дело не дойдёт, if проскочит дальше, а кодер так и не узнает, что у него в программе гуляет массив с несуществующим индексом... точнее существующим, но избыточным.

 Может, это надо пофиксить, чтобы проверка на предмет  'array out of range' происходила в if до самого конца и выдавалось бы такое же сообщение? Или это сильно уронит скорость работы оператора?

Даже если в условии && и первое условие не выполнено, то второе проверяться не будет. Так-что кого ввёл в заблуждение, извиняйте…

 
x572intraday #:

 Уже пробовал и break, и даже return сгоряча, но было только хуже. Попробую ещё упростить код и переосмыслить с break...

for(int i=start; i<rates_total-n && !IsStopped(); i++)
{
   for(int increment=1, bool h_plus=true ; h_plus && increment<=n ; increment++)
     h_plus = high[i]>high[i+increment]; // можно не накапливать, вылетим из цикла на первом false

   if(h_plus) {...}
   ...
}

Вот типа того.

 

При масштабировании чарта движением мышей по шкале времени чарт убегает влево или вправо, в зависимости от направления движения мыши, таким образом всё нужное, что находиться в фокусе взгляда пользователя, часто просто исчезает за границами чарта. Это ужасно неудобно, так как потом приходиться искать нужное место, и это наблюдается с тех пор, как я знаком с MT.

Логично было предположить, что возможно нажатие на значок лупы отмасштабирует чарт по центру, но нет, поведение такое же, как и в случае с масштабированием мышей - чарт сдвигается влево (сжатие) или вправо (расширение). 

Уважаемые разработчики! Убедительная просьба поменять поведение чарта при масштабировании, нужно оставлять центр чарта в центре.

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

Пытался привыкнуть в течении 14 лет - не смог.

 
JRandomTrader #:
for(int i=start; i<rates_total-n && !IsStopped(); i++)
{
   for(int increment=1, bool h_plus=true ; h_plus && increment<=n ; increment++)
     h_plus = high[i]>high[i+increment]; // можно не накапливать, вылетим из цикла на первом false

   if(h_plus) {...}
   ...
}

Вот типа того.

 Свежая идея, попробую.

 А вот касательно предыдущего варианта:

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
     {
      h_plus&=high[i]>high[i+increment];
      if(!h_plus)break;
     }
   if(h_plus) {...}
   ...
}

даже не пробуя уже ясно, что 

if(!h_plus)break;

идёт после суммирования, а это означает, что терминал увидит сперва предыдущую строку и уже поймёт, что есть массив с избыточным индексом и выдаст всё тот же месседж 'array out of range'. Это второе. А первое — делать вообще надобно проверку не на !h_plus, а на ArraySize(high)<=i+increment и выбегать из цикла в случае превышения индекса. Всё это я уже пытался вчера, но обломался в каких-то нюансах. Да, месседжа уже не было, но и индикатор начал городить огород.

 
x572intraday #:

 А вот касательно предыдущего варианта:

даже не пробуя уже ясно, что 

идёт после суммирования, а это означает, что терминал увидит сперва предыдущую строку и уже поймёт, что есть массив с избыточным индексом и выдаст всё тот же месседж 'array out of range'. Это второе. А первое — делать вообще надобно проверку не на !h_plus, а на ArraySize(high)<=i+increment и выбегать из цикла в случае превышения индекса. Всё это я уже пытался вчера, но обломался в каких-то нюансах. Да, месседжа уже не было, но и индикатор начал городить огород.

Так тут беда в

i<rates_total-3
Я ж там не зря написал
i<rates_total-n
А раннее вышибание из цикла - именно для имитации вычисления if()
 
x572intraday #:

 Багом называть не рискну. Поэтому просто скажу, что заметил одну особенность оператора if. Прозреваю, это может относиться и к другим ЯПам.

Если a окажется true, то проверка перейдёт к Array[over_index] и тут-то терминал начнёт дико бомбить по части 'array out of range', что совершенно справедливо. Если же a окажется false, до проверки условия истинности Array[over_index], а значит, и избыточности индекса дело не дойдёт, if проскочит дальше, а кодер так и не узнает, что у него в программе гуляет массив с несуществующим индексом... точнее существующим, но избыточным.

 Может, это надо пофиксить, чтобы проверка на предмет  'array out of range' происходила в if до самого конца и выдавалось бы такое же сообщение? Или это сильно уронит скорость работы оператора?


если переменная a у вас false то управление передается дальше и не затрагивает массив и код в скобках после if, потому как у вас

if(a && Array[over_index]>val) {...}

управление передастся в правую часть условия, только если левая (a) будет true

если, например, вы сделаете

if(check(over_index) && Array[over_index]>val) {...}

где функция check проверяет индекс на вхождение в пределы массива Array, то никакого "array out of range" у вас никогда не будет. так можно сделать проверку индекса массива и обращение к нему в одном if. но чтобы управление передавалось во вторую часть if с оператором &&, если первая false, вряд ли подобное возможно в любом из существующих языков программирования...

 

Есть одна проблема, появляется хаотично и изредка.

Появляется при работе в тестере с несколькими валютами.

В каждом цикле запрашиваю актуальные цены по символам. И как будто по если по каким то причинам не получает тестер котировки по определенному символу, то используются котировки ранее полученные с другого символа.

У меня должна открыться позиция если цена станет больше определенной. Но используя не верные данные с другого символа происходит открытие.

Символ EURCAD если цена будет больше 1.45117 то открываем. 1.74425>1.45117? да больше, но это цена другого символа.

Из 500 ордеров обнаружено 7 ошибочных. 

 
Yury Lemeshev #:

Есть одна проблема, появляется хаотично и изредка.

Появляется при работе в тестере с несколькими валютами.

В каждом цикле запрашиваю актуальные цены по символам. И как будто по если по каким то причинам не получает тестер котировки по определенному символу, то используются котировки ранее полученные с другого символа.

У меня должен открыться позиция если цена станет больше определенной. Но использую не верные данные с другого символа происходит открытие.

Символ EURCAD если цена будет больше 1.45117 то открываем. 1.74425>1.45117? да больше, но это цена другого символа.

Из 500 ордеров обнаружено 7 ошибочных. 

Проблемы в коде, но телепаты уже празднуют, а когда выйдут из запоя, тогда и скажут что ошибка в строке 123652

 
Alexey Viktorov #:

Проблемы в коде, но телепаты уже празднуют, а когда выйдут из запоя, тогда и скажут что ошибка в строке 123652

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

Причина обращения: