Подскажите пожалуйста, внутри цикла for выражение 3 вычисляется при инициации итерации оператором continue или итерация происходит без вычисления выражения 3?
По всей видимости, если for - это разновидность while, то выражение 3 не должно вычисляться при условии continue.
Например
int i;
for(i=0; i<OrderTotal; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)
bool result=OrderDelete(OderTicket());
if(result==false) continue;
}
Что есть "выражение 3"?
Нужно заметить, что в коде выражение:
bool result=OrderDelete(OderTicket());
относится к условию:
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)
То есть при невыполнении вышеуказанного условия переменная result не будет даже создана. Напрашивается вывод, что такой код у Вас компилируется. А это возможно только в старом компиляторе (без директивы #property strict). Поставьте в коде такую директиву и уже на этапе компиляции увидите ошибку.
По всей видимости, если for - это разновидность while, то выражение 3 не должно вычисляться при условии continue.
не разновидность, справку почитайте https://www.mql5.com/ru/docs/basis/operators/for
Оператор for эквивалентен следующей последовательности операторов:
выражение1; Хорошо, не разновидность, эквивалент. |
Что есть "выражение 3"?
Нужно заметить, что в коде выражение:
относится к условию:
То есть при невыполнении вышеуказанного условия переменная result не будет даже создана. Напрашивается вывод, что такой код у Вас компилируется. А это возможно только в старом компиляторе (без директивы #property strict). Поставьте в коде такую директиву и уже на этапе компиляции увидите ошибку.
Вопрос не про result, а про continue. Что if result not true, because error 4108? i++ или i=i? ))
Почитал переписку и не очень понял вопроса. У Вас ошибка в коде, на которую указал Игорь, возможно в этом причина Вашего вопроса.
int i; for(i=0; i<OrderTotal; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2) { bool result=OrderDelete(OderTicket()); } if(result==false) continue; }
Ваше выражение компилятор читает так: если не будет выбран ордер или его тип окажется не BUY и не SELL if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2), то объявление переменной result пропускается, и далее происходит попытка приведения необъявленной переменной (неизвестного типа) к булево: if(result==false). Это ошибка, исправьте и вопрос может решиться сам собой:
int i; bool result=false; for(i=0; i<OrderTotal; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2) { result=OrderDelete(OderTicket()); } if(result==false) continue; }
Но и после исправления, выражение if(result==false) continue; в конце цикла не имеет смысла потому, что цикл и так на следующей закрывающей скобке перейдёт на for.
И ещё одна ошибка. У вас OrderTotal число, которое уже не меняется в цикле, а ордера внутри цикла Вы удаляете, то есть уменьшаете общее количество ордеров. Наступит момент, когда цикл начнёт выбирать ордера, которых нет.
int i; for(i=0; i<OrderTotal; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2) { if(OrderDelete(OderTicket()) { i--; OrderTotal--; } } }
И ещё одна ошибка.
https://docs.mql4.com/ru/constants/tradingconstants/orderproperties
OrderType()<2 это OP_BUY и OP_SELL
их нельзя удалять через result=OrderDelete(OderTicket());
только через https://docs.mql4.com/ru/trading/orderclose
Я честно говоря не задумывался, писал на пилоте :)
Вы правы, Игорь!
Тогда следующий вариант такой:
int i; for(i=0; i<OrderTotal; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2) { if(OrderClose(OrderTicket(),OrderLots(),price,slippage,color)) { i--; OrderTotal--; } } }К слову, для краткости можете писать if(result) или if(!result). Сам оператор if проверяет истинность выражения в скобках и не требует сравнения с true и false, поскольку сам result либо истина, либо ложь.
я конечно дико извиняюсь... но может быть обратный цикл применить, а ?
for(int i=OrdersTotal()-1;i>=0;i--){ if( OrderSelect(i,SELECT_BY_POS,MODE_TRASES) ){ if( OrderType() > OP_SELL )continue; OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),(Ask-Bid)/Point*2,CLR_NONE); } }
я знал что форум деградировал, но не до такой же степени...
но может быть обратный цикл применить, а ?
Да можно и так. Хорошо, что есть варианты, и Ваш вариант выглядит лучше.
Но, Вашим заключением, Вы как бы говорите: "Сынки, я круче вас!". Не?
Да можно и так. Хорошо, что есть варианты, и Ваш вариант выглядит лучше.
Но, Вашим заключением, Вы как бы говорите: "Сынки, я круче вас!" Не?
ворчу по стариковски )))
но да, так и есть, если для вас важна именно эта часть моего послания...
имею право... "я там куда ты не смеешь даже заглянуть" (с) Дюна
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите пожалуйста, внутри цикла for выражение 3 вычисляется при инициации итерации оператором continue или итерация происходит без вычисления выражения 3?
По всей видимости, если for - это разновидность while, то выражение 3 не должно вычисляться при условии continue.
Например
int i;
for(i=0; i<OrderTotal; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)
bool result=OrderDelete(OderTicket());
if(result==false) continue;
}