Ошибка Invalid ticket for OrderClose function - страница 2

 
elmucon:

ну посмотрите внимательно - у Вас - перед MarketInfo открывается скобка - а закрывается она где? длжно быть так -

if(TakeProfit > 0) TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
if(StopLoss > 0)   SL = NormalizeDouble(Bid - StopLoss*Point, Digits);
Как-то так
 
Vinin:

Как-то так

ну или так ... Гы...
 
elmucon:

ну или так ... Гы...

Хамим?
 
Vinin:

Хамим?

да с чего вдруг?
 
Vinin:

Как-то так


Да. Вы правы. Эту ошибку я исправил еще в начале недели. Сейчас меня мучает другой вопрос: при работе новой версии программы все еще периодически возникает ошибка 4108. Пример из истории тестирования с предустановленными настройками в период с 1 августа по 1 сентября. На сороковом тикете произошла ошибка 4108.

2011.09.04 23:34:20 2011.08.22 03:30 Black MACD v 1 3a EURUSD,M30: open #41 buy 1.00 EURUSD at 1.4384 sl: 1.4331 tp: 1.4440 ok

2011.09.04 23:34:20 2011.08.22 00:00 Black MACD v 1 3a EURUSD,M30: ticket=40Lot=1PR=1.4375slip=3

2011.09.04 23:34:20 2011.08.22 00:00 Black MACD v 1 3a EURUSD,M30: Ошибка закрытия ордера: 4108

2011.09.04 23:34:20 2011.08.22 00:00 Black MACD v 1 3a EURUSD,M30: OrderClose error 4108

2011.09.04 23:34:20 2011.08.22 00:00 Black MACD v 1 3a EURUSD,M30: unknown ticket 40 for OrderClose function

2011.09.04 23:34:19 2011.08.19 14:29 Tester: take profit #40 at 1.4404 (1.4404 / 1.4407)

2011.09.04 23:34:19 2011.08.19 13:49 Black MACD v 1 3a EURUSD,M30: open #40 buy 1.00 EURUSD at 1.4348 sl: 1.4295 tp: 1.4404 ok

2011.09.04 23:34:19 2011.08.19 12:55 Black MACD v 1 3a EURUSD,M30: close #39 sell 1.00 EURUSD at 1.4305 sl: 1.4358 tp: 1.4249 at price 1.4317

2011.09.04 23:34:19 2011.08.19 12:22 Black MACD v 1 3a EURUSD,M30: open #39 sell 1.00 EURUSD at 1.4305 sl: 1.4358 tp: 1.4249 ok

После того как 40й ордер закрылся по тейк пофиту OrderClose его не видит. Как от этого избавится? И правильно ли я понимаю что это особо не влияет на результат?

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

Добрый день, нужна помощь. Периодически возникает ошибка unknown ticket 28465181(или любой другой номер) for OrderClose function, причём возникает она крайне редко, сова может нормально работать и неделю и 2 а потом бац и весь журнал забивается таким сообщением, происходит это в основном на сильных движениях когда требуется закрыть сразу несколько открытых ордеров, один из ордеров закрывается а остальные нет и сова зацикливается на этой ошибке. Как такое можно вылечить? Пробовал делать закрытие по разному, реже всего ошибка возникает при пользовании такой функции:

// Закрывает все ордера на данном инструменте                        |
//+------------------------------------------------------------------+
void ClosePositions(){
for(int n=OrdersTotal()+1;n>=0;n--){
  if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){ 
    if(OrderType()<2&&OrderComment()==comment){ 
      del(OrderTicket());
    }  
  }    
}  
return;    
}
//+------------------------------------------------------------------+
//Удаляет рыночный ордер с указанным ей тикетом                      |
//+------------------------------------------------------------------+
void del(int ticket){int err;
 for(int i=0;i<1;i++){
   GetLastError();//обнуляем ошику
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
   string symbol = OrderSymbol();
   if(OrderType()==OP_BUY){RefreshRates();
     double prise = MarketInfo(symbol,MODE_BID);
     if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}}
   if(OrderType()==OP_SELL){RefreshRates();
     prise = MarketInfo(symbol,MODE_ASK);
     if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}}
 if(err == 0){PlaySound("expert.wav");break;} 
 if(err != 0){PlaySound("timeout.wav");Print("Error for Close Funtion =",err);} 
 while(!IsTradeAllowed()){Sleep(5000);}// если рынок занят то подождем 5 сек 
 if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
 } 
}
 

уж и не знаю что и делать(((

 

Ого, какие древности :) вот вам посвежее :

//+------------------------------------------------------------------+
//|  Удаляет рыночные и отложенные ордера.                           |
//|  Как отдельные по тикету, так и по фильтру в цикле поиска        |
//|  Фильтры по магику,типу,символу. Если вызвать с символом "All" - |
//|  То удалит все, подобно функции DeleteAll()                      |
//+------------------------------------------------------------------+
bool OrdClose(int magik  = -1,
              int type   = -1,//=10 удаление всех рыночных; =11 удаление всех отложенных 
              int ticket = -1,
           string symb   = "",
           double cLot   = -1,
              int profit = 0       
              ){int   digit = MarketInfo(Symbol(),MODE_DIGITS);double lot;
//+------------------------------------------------------------------+
        if(cLot==0){return;}
   if(symb==""){symb=Symbol();}
   int slip = MarketInfo(symb,MODE_SPREAD)*mno();
   double ltstp = MarketInfo(Symbol(),MODE_LOTSTEP);
   if(ltstp == 0.1){int ltdg = 1;}
   if(ltstp == 0.01){   ltdg = 2;} 
   if(ticket>0){
      GetLastError();
      RefreshRates();
      if(OrderSelect(ticket,SELECT_BY_TICKET)){
         if(OrderCloseTime()!=0){return;}
         if(OrderType()<2){
                if(profit<0){if(OrderProfit()>=0){return(false);}}
                if(profit>0){if(OrderProfit()< 0){return(false);}}         
                lot = OrderLots();
                if(cLot>0){
                        lot = NormalizeDouble(cLot,ltdg);
                        if(lot>OrderLots()){lot=OrderLots();}
                        if(lot<MarketInfo(Symbol(),MODE_MINLOT)){lot=MarketInfo(Symbol(),MODE_MINLOT);}
                }
            if(!OrderClose(OrderTicket(),
                                                 lot,
       NormalizeDouble(OrderClosePrice(),MarketInfo(symb,MODE_DIGITS)),
                                    slip,
                          GetOrdCl(type)
                          )
            ){
               Print(GetLastError());
               return(false);              
            }else{
               //Print("Order "+GetNameOP(OrderType())+" closed");
               return(true);
            }                          
         }else{
            if(!OrderDelete(OrderTicket(),GetOrdCl(type))){
               Print(GetLastError());
               return(false);              
            }else{
               //Print("Order "+GetNameOP(OrderType())+" closed");
               return(true);
            }
         }
      }
   }else{
//+------------------------------------------------------------------+
   for(int i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderCloseTime()!=0){continue;}
         if(symb!="All"){
            if(OrderSymbol()!=symb){continue;}
            if(type>=0&&type<6){if(OrderType()!=type){continue;}}
            if(type==10){if(OrderType()>1){continue;}}
            if(type==11){if(OrderType()<2){continue;}}
            if(magik>0){if(OrderMagicNumber()!=magik){continue;}}
         }
         if(OrderType()<2){
                if(profit<0){if(OrderProfit()>=0){continue;}}
                if(profit>0){if(OrderProfit()< 0){continue;}}         
                lot = OrderLots();
                if(cLot>0){
                        lot = NormalizeDouble(cLot,ltdg);
                        if(lot>OrderLots()){lot=OrderLots();}
                        if(lot<MarketInfo(Symbol(),MODE_MINLOT)){lot=MarketInfo(Symbol(),MODE_MINLOT);}
                }
            if(!OrderClose(OrderTicket(),
                                                 lot,
       NormalizeDouble(OrderClosePrice(),MarketInfo(symb,MODE_DIGITS)),
                                    slip,
                          GetOrdCl(type)
                          )
            ){
               Print(GetLastError());
               return(false);              
            }else{
               //Print("Order "+GetNameOP(OrderType())+" closed");
            }                          
         }else{
            if(!OrderDelete(OrderTicket(),GetOrdCl(type))){
               Print(GetLastError());
               return(false);              
            }else{
               //Print("Order "+GetNameOP(OrderType())+" closed");
            }
         }
      }
   }          
//-----+
        }   
return(true);}