Здесь три цикла, выясните какой конкретно зацикливается.
Здесь три цикла, выясните какой конкретно зацикливается.
А как это сделать?
Кусок кода работает и заносит сделки в массив MassLockSellTrade[], но происходит это бесконечно, голову уже сломал, что делать не знаю, подскажите или направьте советом))
добрый день.
ArrayFill(MassLockSellTrade,new_size-1,1,OrderTicket()); //можно написать так, //зачем мудрить с автозаполнением массива, если есть решение проще и в плане экономии времени исполнения и написания??? MassLockSellTrade[new_size-1]=OrderTicket();чтоб найти ошибку нужно посмотреть при каких условиях ордер будет занесен в массив, первое наличие его в первом массиве, второе это отсутствие его во втором массиве.
так как вы не удаляете его из первого массива у вас первое условие всегда будет TRUE, если ордер там был(я бы удалял после занесения в другой массив).
второе условие интереснее, так как у вас не верно организована проверка наличия ордера
for(int k=0; k<Size; k++) { if(MassLockSellTrade[k]!=OrderTicket()) { InArraySell2=true; break; } } //данный цикл всегда будет выдавать TRUE при условии что ордер который ищем не первый //правильнее организовать цикл так InArraySell2=true; for(int k=0; k<Size && InArraySell2; k++) { if(MassLockSellTrade[k]==OrderTicket())InArraySell2=false;//если ордер есть не вносить его в массив }
с уважением.
P.S. старайтесь писать проще и у вас не будет лишних проблем, пользуйтесь стилизатором (Ctrl+<).
для того чтоб найти эту ошибку не нужно заморачиватся на все премудрости что вы тут писали.
- www.metatrader5.com
//на мой взгляд данный код может выглядеть так, как приведено ниже, оптимальный вариант во всех отношениях if(CountMassSell()>=2) { if(FindMassSell()) { Sum=0; int count=0; int SizeLock=ArraySize(MassSellLock); for(int i=0; i<OrdersTotal() && !_StopFlag; i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue; if(OrderSymbol()!=Symbol())continue; if(OrderMagicNumber()!=Magic)continue; if(OrderType()!=OP_SELL)continue; bool InArraySell=false; for(int m=0; m<SizeLock && !_StopFlag && !InArraySell; m++) if(MassSellLock[m]==OrderTicket())InArraySell=true; if(!InArraySell)continue; int Size=ArraySize(MassLockSellTrade); for(int k=0; k<Size && !_StopFlag && InArraySell; k++) if(MassLockSellTrade[k]==OrderTicket())InArraySell=false; if(!InArraySell)continue; Sum+=OrderOpenPrice(); count++; int new_size=ArraySize(MassLockSellTrade); ArrayResize(MassLockSellTrade,new_size+1); MassLockSellTrade[new_size]=OrderTicket(); } SredStopSellLock=NormalizeDouble(Sum/count-SLLock*Point,Digits); } }
с уважением.
Всем привет! Проблема в том, что цикл бесконечно зацикливается, в чем причина не могу понять. Суть этого цикла, проверить сделки селл рыночные, в каких массивах содержаться, если все условия true то занести массив MassLockSellTrade[]. Условия проверки: Если сделка есть в массиве MassSellLock[], то это значит, что сделка являлась SellStop, который стал рыночным в этом случае переменная InArraySell=true; Далее следующая проверка, если Size==0 (int Size = ArraySize(MassLockSellTrade); это массив сработавших SellStop), значит что в массиве MassLockSellTrade[] ещё нет сделок и переменная InArraySell2=true; и этот тикет этого ордера заноситься в массив MassLockSellTrade[]. Если Size!=0 то тикет ордера проверяется на наличие в массиве MassLockSellTrade[k]!=OrderTicket() если его там нет, то переменная InArraySell2=true; и тикет ордера заноситься в массив MassLockSellTrade[].
Кусок кода работает и заносит сделки в массив MassLockSellTrade[], но происходит это бесконечно, голову уже сломал, что делать не знаю, подскажите или направьте советом))
if (CountMassSell()>=2) // Если >= 2х SellStop сработало и они стали рыночными сделками { if (FindMassSell()==true) //Если появился рыночный селл ордер, который не входит в массив MassLockSellTrade[] {
Где-то есть присваивание этой переменной значения false?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бесконечное зацикливания цикла, как исправить?
Andrey Kisselyov, 2017.07.22 22:47
for(int i=0; i<OrdersTotal() && !_StopFlag; i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue; if(OrderSymbol()!=Symbol())continue; if(OrderMagicNumber()!=Magic)continue; if(OrderType()!=OP_SELL)continue;
///
Обратите внимание, там ест пара таких строчек:
InArraySell=false; InArraySell2=false;
В самом начале цикла.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет! Проблема в том, что цикл бесконечно зацикливается, в чем причина не могу понять. Суть этого цикла, проверить сделки селл рыночные, в каких массивах содержаться, если все условия true то занести массив MassLockSellTrade[]. Условия проверки: Если сделка есть в массиве MassSellLock[], то это значит, что сделка являлась SellStop, который стал рыночным в этом случае переменная InArraySell=true; Далее следующая проверка, если Size==0 (int Size = ArraySize(MassLockSellTrade); это массив сработавших SellStop), значит что в массиве MassLockSellTrade[] ещё нет сделок и переменная InArraySell2=true; и этот тикет этого ордера заноситься в массив MassLockSellTrade[]. Если Size!=0 то тикет ордера проверяется на наличие в массиве MassLockSellTrade[k]!=OrderTicket() если его там нет, то переменная InArraySell2=true; и тикет ордера заноситься в массив MassLockSellTrade[].
Кусок кода работает и заносит сделки в массив MassLockSellTrade[], но происходит это бесконечно, голову уже сломал, что делать не знаю, подскажите или направьте советом))