Чудный ордер - страница 2

 

Эта функция хорошо закрывает "пачками". ))

 void CloseAllPos(){
   for(int i=0;i<OrdersTotal();i++){
     if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
     if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue; 
     if(OrderType()==OP_BUY)  { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,White); i--; }
     if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,White); i--; }
 } }
 
странная функция
 
Vladon:
странная функция

Не столько странная, сколько методологически неправильная: для тестера слишком много, для реала слишком мало. И в любом случае не оптимальная.

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

 
VladislavVG:

Не столько странная, сколько методологически неправильная: для тестера слишком много, для реала слишком мало. И в любом случае не оптимальная.

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

Вы проявили невнимательность.

if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,White); i--; }

if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,White); i--; }

 

насчет контроля - согласен, я не про то, странная реализация if(OrderType()==OP_BUY) {i--; }

 

Вот только не пойму, что будет при i=0. После i-- получится -1.

Затем начинается новая итерация, т.е. i=0. И т.п.

Т.е. закрывается все время ордер с текущим номером 0. Так, DhP?

 
Да. Причем функция только для тестера, онлайн чревато зависаниями.
 
Mathemat:

Вот только не пойму, что будет при i=0. После i-- получится -1.

Затем начинается новая итерация, т.е. i=0. И т.п.

Т.е. закрывается все время ордер с текущим номером 0. Так, DhP?

Включите в свой код и пользуйтесь без ограничений. )))
 
DhP:

Вы проявили невнимательность.

if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,White); i--; }

if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,White); i--; }

Это я видел - я же сказал методологически неправильно.

Поясняю:

for(int i=0;i<OrdersTotal();i++){

1. в цикле проверка условия цикла идет на КАЖДОЙ итерации - Вы туда суете вызов функции - самая дорогостоящая операция.

Правильная реализация:

for(i=OrdersTotal()-1; i>=0;i--)

Совершает те же действия за значительно более короткое время. Здесь вызов той же самой функции идет всего один раз - и больше не нужно !!!!!!!!

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

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

О реале говорил выше.

ЗЫ Иногда смотрю коды и сомневаюсь, что люди систематически изучали программирование.

 
TheXpert:
Да. Причем функция только для тестера, онлайн чревато зависаниями.

Код можно заменить таким:

void CloseAllPos(){
   while( OrdersTotal() > 0 ){
     if (!OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) continue;
     if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue; 
     if(OrderType()==OP_BUY)  { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,White); }
     if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,White); }
 } }
А где тут зависание в онлайне?