Только в тестере работает

 
void CloseCore(string symb,int op1=-1,int op2=-1,int mn=-1)  {

  double Lot1,Lot2,Lot3,Pr1=0,Pr2=0,Pr3=0; 
  int Ticket1,Ticket2,Ticket3;
  
  if (symb=="0") symb=Symbol();

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==symb || Symbol()=="") {
        if ( mn<0 || OrderMagicNumber()==mn ) {
          if ( OrderType()==op1) {
          if ( Pr1<OrderProfit()&& Lot1<OrderLots() ) {
               Pr1=OrderProfit()+OrderSwap();
               Lot1=OrderLots();
               Ticket1=OrderTicket();
            }
          if ( Pr2>OrderProfit()&& Lot2<OrderLots() ) {
               Pr2=OrderProfit()+OrderSwap();
               Lot2=OrderLots();
               Ticket2=OrderTicket();
            }
         }
          if ( OrderType()==op2) {
          if ( Pr3>OrderProfit() ) {
               Pr3=OrderProfit()+OrderSwap();
               Lot3=OrderLots();
               Ticket3=OrderTicket();
            }
         } 
       }
     }
   }}
   if ( Закрытый_хвост == false ) { 
   if ((Pr1+Pr2)>0 && Lot1>0 && Lot2>0) 
        {
        OrderClose(Ticket1,Lot1,OrderClosePrice(),30,Red); 
        OrderClose(Ticket2,Lot2,OrderClosePrice(),30,Red);
        }
      }
   if ( Закрытый_хвост == true ) { 
   if ((Pr1+Pr2+Pr3)>0 && Lot1>0 && Lot2>0 && Lot3==Лот_ордера ) 
        {
        OrderClose(Ticket1,Lot1,OrderClosePrice(),30,Red); 
        OrderClose(Ticket2,Lot2,OrderClosePrice(),30,Red);
        OrderClose(Ticket3,Lot3,OrderClosePrice(),30,Red);  
        }
   if ((Pr1+Pr2)>0 && Lot1>0 && Lot2>0 && (Lot3>Лот_ордера ||Lot3==0)) 
        {
        OrderClose(Ticket1,Lot1,OrderClosePrice(),30,Red); 
        OrderClose(Ticket2,Lot2,OrderClosePrice(),30,Red);
        }        
      }
   return(0);
}    

Не могу понять что в нём не так. В тестере работает правильно, а на демо вообще в отказ. Прошу помочь с кодом.

 
Понаблюдайте чему равны Ticket1, 2, 3 перед вызовом OrderClose().
 
age_nt:

Не могу понять что в нём не так. В тестере работает правильно, а на демо вообще в отказ. Прошу помочь с кодом.



А, закрытие по цене OrderClosePrice(),стало нормой?
 
Integer:
Понаблюдайте чему равны Ticket1, 2, 3 перед вызовом OrderClose().

Здравствуйте Дмитрий! Через принт проверил - всё нормально. Тикеты ловит, но по закрытию выдаёт:

2014.02.01 16:33:44 2014.01.10 16:45 A4v USDJPY,M15: OrderClose error 138
2014.02.01 16:33:44 2014.01.10 16:45 A4v USDJPY,M15: close #71 sell 0.01 USDJPY at 104.357 at price 104.473
2014.02.01 16:33:44 2014.01.10 16:45 A4v USDJPY,M15: close #72 sell 0.02 USDJPY at 104.881 at price 104.473
2014.02.01 16:33:44 2014.01.10 16:45 A4v USDJPY,M15: Ticket1 : 72 Ticket2 : 71 Ticket3 : 73

понятно,что цена могла поменяться для этого и указал OrderClosePrice().

 
r772ra:

А, закрытие по цене OrderClosePrice(),стало нормой?
непонял почему нет.
 

Ааа. Понял. 138 - реквот.

OrderClosePrice() - это цена закрытия последнего выделенного ордера, но не того, который закрываете. Надо сначала выделить ордер по тикету, если удалоссь выделить, то OrderClose() с OrderClosePrice().

 
Еще не помешала бы проверка того, что это действительно та ситуция при который хотите выполнить закрытие. Как минимум - существует три ордера.
 
Integer:

Ааа. Понял. 138 - реквот.

OrderClosePrice() - это цена закрытия последнего выделенного ордера, но не того, который закрываете. Надо сначала выделить ордер по тикету, если удалоссь выделить, то OrderClose() с OrderClosePrice().


Что-то типо этого?!
if((Pr1+Pr2+Pr3)>0 && Lot1>0 && Lot2>0) {
if (OrderSelect( Ticket 1, SELECT_BY_POS, MODE_TRADES)) { OrderClose(Ticket1,Lot1,OrderClosePrice(),30,Red); }
if (OrderSelect( Ticket 2, SELECT_BY_POS, MODE_TRADES)) { OrderClose(Ticket2,Lot2,OrderClosePrice(),30,Red); }

if (OrderSelect( Ticket 3, SELECT_BY_POS, MODE_TRADES)) { OrderClose(Ticket3,Lot3,OrderClosePrice(),30,Red); }
}

 
age_nt:

Что-то типо этого?!
if((Pr1+Pr2+Pr3)>0 && Lot1>0 && Lot2>0) {
if (OrderSelect( Ticket 1, SELECT_BY_POS, MODE_TRADES)) { OrderClose(Ticket1,Lot1,OrderClosePrice(),30,Red); }
if (OrderSelect( Ticket 2, SELECT_BY_POS, MODE_TRADES)) { OrderClose(Ticket2,Lot2,OrderClosePrice(),30,Red); }

if (OrderSelect( Ticket 3, SELECT_BY_POS, MODE_TRADES)) { OrderClose(Ticket3,Lot3,OrderClosePrice(),30,Red); }
}




Да. Но всеравно получается ненадежная функция.

В лучшем бы случае сначала собрать данные об ордерах (получить тикеты), потому первую часть (цикл) не выполнять, а пытаться выполнять закрытия. Если закрытие выполнено - обнулить переменную Ticket. После того как все ордера закрыты, снова выполняется начальный цикл.

Первая часть: получение тикетов подлежащих закрытию.

Вторая часть - закрытие. Здесь еще для надежности проверять, не является ли ордер закрытым, потому-что вдруг вручную закроете.

 

Большое спасибо! Буду делать и обязательно отпишусь что получилось.

и ещё грамм сомнения: может Select через SELECT_BY_TICKET ?

 
age_nt:

и ещё грамм сомнения: может Select через SELECT_BY_TICKET ?


Не заметил. Конечно через SELECT_BY_TICKET
Причина обращения: