Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 783

 
evillive:
перед КАЖДЫМ закрытием надо.
Писал. Проподает рабочее состояние закрытия селлов. т.е. вообще не работает...
 
в таком виде работает в одном варианте
 
как поменять на обратный?
 
-- зависает MT4
 
Leonid123456:
как поменять на обратный?
for(int h=OrdersTotal()-1; h>=0; h--)
 

Вот это

 for(int b=0; b<OrdersTotal(); b++)
if(OrderSelect(b,SELECT_BY_POS)){
         
         lastlot = OrderLots();
              
         }

нифига не лот последней сделки, это лот последнего попавшегося ордера, даже отложенного и вообще с другого символа и от другого советника или руками открытого. Так и задумано?

 
evillive:
for(int h=OrdersTotal()-1; h>=0; h--)

Все заработало) Спасибо. Голову ломал что не так. перепробовал уже ...

Спасибо огромное. 

 
evillive:

Вот это

нифига не лот последней сделки, это лот в лучшем случае первого попавшегося ордера, даже отложенного и вообще с другого символа и от другого советника или руками открытого. Так и задумано?

для этого советника последняя)) Вообще работал. получался последний)). Советник для тестов... Так что работа под несколько валют и ручную торговлю (вместе) не предусматривается пока что.. 

Можете подсказать на будущее, будет полезно как правильнее...

Еще раз спасибо. 

 
Leonid123456:

для этого советника последняя)) Вообще работал. получался последний)). Советник для тестов... Так что работа под несколько валют и ручную торговлю (вместе) не предусматривается пока что.. 

Можете подсказать на будущее, будет полезно как правильнее...

Еще раз спасибо. 

Опять же перебором в обратном порядке ищем именно свой ордер, если надо, то отличаем рыночный от отложенного, первый попавшийся по всем критериям (символ, магик, тип) обычно и есть самый свежий.  Но правильнее ещё и на время открытия смотреть, чтобы уж наверняка моложе не было.

В тестере вообще можно сразу выбрать

OrderSelect(OrdersTotal()-1,SELECT_BY_POS))

чтобы работать с последним открытым ордером, если система без отложек, то другого и не надо, всё работать будет нормально. Но если одновременно есть и отложки, и рыночные, то уже так не пойдёт, не говорю уже про реальную работу.

 
Leonid123456:

для этого советника последняя)) Вообще работал. получался последний)). Советник для тестов... Так что работа под несколько валют и ручную торговлю (вместе) не предусматривается пока что.. 

Можете подсказать на будущее, будет полезно как правильнее...

Еще раз спасибо. 

Правильнее не писать лишнего. Зачем натыкал вложенных циклов? Ведь всё что тебе нужно, можно сделать в одном цикле при одном выборе ордера.

if(New_Bar)
{
OrderSend(Symbol(),OP_BUYSTOP,Lotpers,Ask+step,100,0,0,NULL,MagicNumber,0,DarkTurquoise);
OrderSend(Symbol(),OP_SELLSTOP,Lotpers,Bid-step,100,0,0,NULL,MagicNumber,0,Yellow);
}

 for(int b=0; b<OrdersTotal(); b++)
  {
   if(OrderSelect(b, SELECT_BY_POS) && OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber)
    {
     lastlot = OrderLots();
   // Здесь надо в переменную засунуть тикет выбранного ордера
     if(OrderType() == OP_BUYSTOP||OrderType() == OP_BUY)
      orderprisebuy = OrderOpenPrice();
   
      if(OrderType() == OP_SELLSTOP||OrderType() == OP_SELL)
       orderprisecell = OrderOpenPrice(); 
         
        SL_VirtualCell = orderprisecell+step1*Point;
        SL_VirtualBuy = orderprisebuy-step1*Point;

                          /*  if(Mas_Tip[0] >0|| Mas_Tip[1] >0)
                                               {
if (New_Bar&&/*valsar1<Ask &&  osma0>0&&osma1<0    /*&& Volume[1]>VolumeFiltr)

OrderSend(Symbol(),OP_BUY,NormalizeDouble( lastlot*Marti,2),Ask,100,0,0,NULL,MagicNumber,0,DarkTurquoise);

if (New_Bar&& /*valsar1>Bid && osma0<0&&osma1>0    /* && Volume[1]>VolumeFiltr)

OrderSend(Symbol(),OP_SELL,NormalizeDouble( lastlot*Marti,2),Bid,100,0,0,NULL,MagicNumber,0,Yellow);       
         
}*/

CheckEvents(MagicNumber); // Вот здесь теряется выбранный ордер при переборе ордеров в вызванной функции

/*if ( eventSellClosed_SL >0|| eventBuyClosed_SL >0)
{        as();
                

 }
  /* ///   if ( eventBuyClosed_TP > 0 )
   //     Alert( Symbol(), ": Buy-позиция закрыта по ТейкПрофиту!" );

   */
    if(eventBuyStopOpened > 0)
     {
      OrderSend(Symbol(),OP_SELLSTOP,NormalizeDouble( Lotpers,5),orderprisecell,0,0,0,NULL,MagicNumber,0,clrKhaki); 
 
      if (OrderType() == OP_SELL)
       OrderClose(OrderTicket(),OrderLots(), Ask, 3,clrIvory );  // Здесь может быть чужой OrderTicket() Возможны и другие аналогичные потери
     }//завершение блока if(eventBuyStopOpened > 0)
 ///

  if(eventSellStopOpened > 0)
  {
  OrderSend(Symbol(),OP_BUYSTOP,NormalizeDouble( Lotpers,5),orderprisebuy,0,0,0,NULL,MagicNumber,0,clrPlum);
 
   if (OrderType() == OP_BUY)
    OrderClose(OrderTicket(),OrderLots(), Bid, 3,clrIvory );  
  }//завершение блока if(eventSellStopOpened > 0)
 }//завершение блока if(OrderSelect(b
}//завершение блока for(int b=0


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