Подскажите,как исправить ошибки.

 
При тестировании советника в журнале тестера выдаётся ошибка
2009.08.25 18:25:04	2008.02.07 06:48  expert EURUSD,H1: OrderClose error 4108
2009.08.25 18:25:04	2008.02.07 06:48  expert EURUSD,H1: unknown ticket 3 for OrderClose function

Как можно это исправить,если функция закрытия ордеров эта

int Close_All(int Tip)                    // Пользовательская функция
  {
   // int Tip                             // Тип ордера
   int Ticket=0;                          // Номер ордера
   double Lot=0;                          // Количество закр. лотов
   double Price_Cls;                      // Цена закрытия ордера
//--------------------------------------------------------------- 3 --
   while(Mas_Tip[Tip]>0)                 // До тех пор, пока есть ..
     {                                   //.. ордера заданного типа 
      for(int i=1; i<=Mas_Ord_New[0][0]; i++)// Цикл по живым ордерам
        {
         if(Mas_Ord_New[i][6]==Tip &&     // Среди ордеров нашего типа
            Mas_Ord_New[i][5]>Lot)        // .. выбираем самый дорогой
           {                              // Этот больше ранее найден.
            Lot=Mas_Ord_New[i][5];        // Наибольший найденный лот
            Ticket=Mas_Ord_New[i][4];     // Номер его ордера такой
           }
        }
      if (Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if (Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      Inform(12,Ticket);                  // Сообщение о попытке закр.
      bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрыть ордер !:)
      //--------------------------------------------------------- 4 --
      if (Ans==false)                     // Не получилось :( 
        {                                // Поинтересуемся ошибками:
         if(Errors(GetLastError())==false)// Если ошибка непреодолимая
            return;                       // .. то уходим.
        }
      //--------------------------------------------------------- 5 --
      Terminal();                         // Функция учёта ордеров 
      Events();                           // Отслеживание событий
     }
   return;                                // Выход из пользов. функции
  }


С уважением Александр

 

ну так выведите принтом что показывает тикет перед вызовом функции OrderClose... и посмотрите есть ли такой тикет среди всех ордеров.

Может у вас неверно составляется массив Mas_Ord_New. Начните проверку с него.

 
sergeev >>:

ну так выведите принтом что показывает тикет перед... и посмотрите есть ли такой тикет среди всех ордеров.

Может у вас неверно составляется массив Mas_Ord_New. Начните проверку с него.

Добавил строку Print("ТИКЕТ ", Ticket); перед вызовом функции OrderClose

Вот что получилось:

19:49:25 2008.02.01 00:00  usualexpert EURUSD,H1: open #1 sell 0.01 EURUSD at 1.48490 sl: 1.50002 ok
19:49:52 2008.02.04 08:06  usualexpert EURUSD,H1: ТИКЕТ 1
19:49:52 2008.02.04 08:06  usualexpert EURUSD,H1: close #1 sell 0.01 EURUSD at 1.48490 sl: 1.50002 at price 1.48300
19:49:52 2008.02.04 08:06  usualexpert EURUSD,H1: open #2 buy 0.01 EURUSD at 1.48300 sl: 1.46788 ok
19:49:52 2008.02.04 09:02  usualexpert EURUSD,H1: ТИКЕТ 2
19:49:52 2008.02.04 09:02  usualexpert EURUSD,H1: close #2 buy 0.01 EURUSD at 1.48300 sl: 1.46788 at price 1.48302
19:49:52 2008.02.04 09:02  usualexpert EURUSD,H1: open #3 sell 0.01 EURUSD at 1.48302 sl: 1.49814 ok
19:49:52 2008.02.04 09:02  usualexpert EURUSD,H1: open #4 sell stop 0.01 EURUSD at 1.47860 sl: 1.49792 ok
19:49:57 2008.02.05 09:26  Tester: order #4, sell 0.01 EURUSD is opened at 1.47860
19:50:06 2008.02.06 08:00  usualexpert EURUSD,H1: open #5 sell stop 0.01 EURUSD at 1.46210 sl: 1.47922 ok
19:50:06 2008.02.06 08:54  Tester: order #5, sell 0.01 EURUSD is opened at 1.46210
19:50:07 2008.02.07 06:48  usualexpert EURUSD,H1: ТИКЕТ 3
19:50:07 2008.02.07 06:48  usualexpert EURUSD,H1: close #3 sell 0.01 EURUSD at 1.48302 sl: 1.49814 at price 1.46202
19:50:07 2008.02.07 06:48  usualexpert EURUSD,H1: ТИКЕТ 3
19:50:07 2008.02.07 06:48  usualexpert EURUSD,H1: unknown ticket 3 for OrderClose function
19:50:07 2008.02.07 06:48  usualexpert EURUSD,H1: OrderClose error 4108
19:50:07 2008.02.07 06:48  usualexpert EURUSD,H1: open #6 buy 0.01 EURUSD at 1.46202 sl: 1.44690 ok
19:50:07 2008.02.07 06:48  usualexpert EURUSD,H1: open #7 buy stop 0.01 EURUSD at 1.46700 sl: 1.44680 ok
19:50:07 2008.02.07 07:15  usualexpert EURUSD,H1: ТИКЕТ 4
19:50:07 2008.02.07 07:15  usualexpert EURUSD,H1: close #4 sell 0.01 EURUSD at 1.47860 sl: 1.49792 at price 1.46198
19:50:07 2008.02.07 07:15  usualexpert EURUSD,H1: ТИКЕТ 4
19:50:07 2008.02.07 07:15  usualexpert EURUSD,H1: unknown ticket 4 for OrderClose function
19:50:07 2008.02.07 07:15  usualexpert EURUSD,H1: OrderClose error 4108
19:50:07 2008.02.07 07:15  usualexpert EURUSD,H1: ТИКЕТ 5
19:50:07 2008.02.07 07:15  usualexpert EURUSD,H1: close #5 sell 0.01 EURUSD at 1.46210 sl: 1.47922 at price 1.46214
19:50:08 2008.02.07 13:07  usualexpert EURUSD,H1: delete #7 buy stop 0.01 EURUSD at 1.46700 sl: 1.44680 tp: 0.00000 ok
19:50:09 2008.02.07 18:08  Tester: stop loss #6 at 1.44690 (1.44680 / 1.44692)
19:50:09 2008.02.08 07:58  usualexpert EURUSD,H1: open #8 buy 0.01 EURUSD at 1.44922 sl: 1.43410 ok
19:50:10 2008.02.11 14:21  usualexpert EURUSD,H1: ТИКЕТ 8
19:50:10 2008.02.11 14:21  usualexpert EURUSD,H1: close #8 buy 0.01 EURUSD at 1.44922 sl: 1.43410 at price 1.45210
19:50:10 2008.02.11 14:21  usualexpert EURUSD,H1: open #9 sell 0.01 EURUSD at 1.45210 sl: 1.46722 ok
19:50:10 2008.02.11 14:25  usualexpert EURUSD,H1: open #10 sell stop 0.01 EURUSD at 1.44380 sl: 1.46708 ok
19:50:13 2008.02.11 18:07  usualexpert EURUSD,H1: delete #10 sell stop 0.01 EURUSD at 1.44380 sl: 1.46708 tp: 0.00000 ok
19:50:13 2008.02.11 18:07  usualexpert EURUSD,H1: ТИКЕТ 9
19:50:13 2008.02.11 18:07  usualexpert EURUSD,H1: close #9 sell 0.01 EURUSD at 1.45210 sl: 1.46722 at price 1.45118
19:50:13 2008.02.11 18:07  usualexpert EURUSD,H1: open #11 buy 0.01 EURUSD at 1.45118 sl: 1.43606 ok
19:50:13 2008.02.11 18:08  usualexpert EURUSD,H1: open #12 buy stop 0.01 EURUSD at 1.45760 sl: 1.43620 ok
19:50:14 2008.02.12 09:49  usualexpert EURUSD,H1: delete #12 buy stop 0.01 EURUSD at 1.45760 sl: 1.43620 tp: 0.00000 ok
19:50:16 2008.02.12 13:39  usualexpert EURUSD,H1: open #13 buy stop 0.01 EURUSD at 1.45760 sl: 1.43985 ok
19:50:16 2008.02.12 15:08  Tester: order #13, buy 0.01 EURUSD is opened at 1.45760
19:50:17 2008.02.13 08:01  usualexpert EURUSD,H1: open #14 buy stop 0.01 EURUSD at 1.46140 sl: 1.44130 ok
19:50:18 2008.02.14 09:00  Tester: order #14, buy 0.01 EURUSD is opened at 1.46140
19:50:21 2008.02.15 19:16  usualexpert EURUSD,H1: ТИКЕТ 11
19:50:21 2008.02.15 19:16  usualexpert EURUSD,H1: close #11 buy 0.01 EURUSD at 1.45118 sl: 1.43606 at price 1.46608
19:50:21 2008.02.15 19:16  usualexpert EURUSD,H1: ТИКЕТ 11
19:50:21 2008.02.15 19:16  usualexpert EURUSD,H1: unknown ticket 11 for OrderClose function
19:50:21 2008.02.15 19:16  usualexpert EURUSD,H1: OrderClose error 4108


 
sasha2x писал(а) >>
При тестировании советника в журнале тестера выдаётся ошибка

Как можно это исправить,если функция закрытия ордеров эта

С уважением Александр

Ваш цикл не сумел изменить значение Ticket,

а ордер с таким Ticket закрыт

Основных причин в цикле может быть две:

1) Mas_Ord_New[0][0] < 1 - просто нет открытых нелимитных ордеров

2) условие if() внутри следующего цикла для всех i ложно

for(int i=1; i<=Mas_Ord_New[0][0]; i++)// Цикл по живым ордерам
{

if(Mas_Ord_New[i][6]==Tip && // Среди ордеров нашего типа
Mas_Ord_New[i][5]>Lot) // .. выбираем самый дорогой
{ // Этот больше ранее найден.
Lot=Mas_Ord_New[i][5]; // Наибольший найденный лот
Ticket=Mas_Ord_New[i][4]; // Номер его ордера такой
}
}

 
Mislaid >>:

Ваш цикл не сумел изменить значение Ticket,

а ордер с таким Ticket закрыт

Основных причин в цикле может быть две:

1) Mas_Ord_New[0][0] < 1 - просто нет открытых нелимитных ордеров

2) условие if() внутри следующего цикла для всех i ложно

for(int i=1; i<=Mas_Ord_New[0][0]; i++)// Цикл по живым ордерам
{

if(Mas_Ord_New[i][6]==Tip && // Среди ордеров нашего типа
Mas_Ord_New[i][5]>Lot) // .. выбираем самый дорогой
{ // Этот больше ранее найден.
Lot=Mas_Ord_New[i][5]; // Наибольший найденный лот
Ticket=Mas_Ord_New[i][4]; // Номер его ордера такой
}
}

Нелимитные ордера,это что за ордера?

 
И как это исправлять?
 
sasha2x писал(а) >>
И как это исправлять?

Хотел написать: нет открытых ордеров, кроме выставленных лимитных. Короче - нет открытых ордеров.

Надо выяснить, есть ли с чем работать циклу.

Поставить проверку значения Mas_Ord_New[0][0]. Если открытых ордеров нет, то и закрывать нечего.

А так же, что if() внутри цикла хотя бы раз сработало.

Т.е., добавить проверки. Хотя лучше вычисление Ticket вынести в отдельную фукцию типа int, которая возвращает -1,

если цикл не отработал, или Ticket, если ордер найден. Значение Lot следует возвращать через параметр функции.

Например, заголовок фукции:

int FindOrderForClose(double& Lot)

Или по-простому:

int Close_All(int Tip) // Пользовательская функция
{
// int Tip // Тип ордера
int Ticket=0; // Номер ордера
double Lot=0; // Количество закр. лотов
double Price_Cls; // Цена закрытия ордера
//--------------------------------------------------------------- 3 --
while(Mas_Tip[Tip]>0) // До тех пор, пока есть ..
{ //.. ордера заданного типа

Ticket = -1; // ***добавлено***
for(int i=1; i<=Mas_Ord_New[0][0]; i++)// Цикл по живым ордерам
{
if(Mas_Ord_New[i][6]==Tip && // Среди ордеров нашего типа
Mas_Ord_New[i][5]>Lot) // .. выбираем самый дорогой
{ // Этот больше ранее найден.
Lot=Mas_Ord_New[i][5]; // Наибольший найденный лот
Ticket=Mas_Ord_New[i][4]; // Номер его ордера такой
}
}
if (Tip==0) Price_Cls=Bid; // Для ордеров Buy
if (Tip==1) Price_Cls=Ask; // Для ордеров Sell
Inform(12,Ticket); // Сообщение о попытке закр.

if ( Ticket >= 0) // ***добавлено***

{
bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрыть ордер !:)
//--------------------------------------------------------- 4 --
if (Ans==false) // Не получилось :(
{ // Поинтересуемся ошибками:
if(Errors(GetLastError())==false)// Если ошибка непреодолимая
return; // .. то уходим.

}
}
//--------------------------------------------------------- 5 --
Terminal(); // Функция учёта ордеров
Events(); // Отслеживание событий
}
return; // Выход из пользов. функции
}

 
Mislaid >>:

Хотел написать: нет открытых ордеров, кроме выставленных лимитных. Короче - нет открытых ордеров.

Надо выяснить, есть ли с чем работать циклу.

Поставить проверку значения Mas_Ord_New[0][0]. Если открытых ордеров нет, то и закрывать нечего.

А так же, что if() внутри цикла хотя бы раз сработало.

Т.е., добавить проверки. Хотя лучше вычисление Ticket вынести в отдельную фукцию типа int, которая возвращает -1,

если цикл не отработал, или Ticket, если ордер найден. Значение Lot следует возвращать через параметр функции.

Например, заголовок фукции:

int FindOrderForClose(double& Lot)

Или по-простому:

int Close_All(int Tip) // Пользовательская функция
{
// int Tip // Тип ордера
int Ticket=0; // Номер ордера
double Lot=0; // Количество закр. лотов
double Price_Cls; // Цена закрытия ордера
//--------------------------------------------------------------- 3 --
while(Mas_Tip[Tip]>0) // До тех пор, пока есть ..
{ //.. ордера заданного типа

Ticket = -1; // ***добавлено***
for(int i=1; i<=Mas_Ord_New[0][0]; i++)// Цикл по живым ордерам
{
if(Mas_Ord_New[i][6]==Tip && // Среди ордеров нашего типа
Mas_Ord_New[i][5]>Lot) // .. выбираем самый дорогой
{ // Этот больше ранее найден.
Lot=Mas_Ord_New[i][5]; // Наибольший найденный лот
Ticket=Mas_Ord_New[i][4]; // Номер его ордера такой
}
}
if (Tip==0) Price_Cls=Bid; // Для ордеров Buy
if (Tip==1) Price_Cls=Ask; // Для ордеров Sell
Inform(12,Ticket); // Сообщение о попытке закр.

if ( Ticket >= 0) // ***добавлено***

{
bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрыть ордер !:)
//--------------------------------------------------------- 4 --
if (Ans==false) // Не получилось :(
{ // Поинтересуемся ошибками:
if(Errors(GetLastError())==false)// Если ошибка непреодолимая
return; // .. то уходим.

}
}
//--------------------------------------------------------- 5 --
Terminal(); // Функция учёта ордеров
Events(); // Отслеживание событий
}
return; // Выход из пользов. функции
}

Большое спасибо,очень помогли,только надо ещё добавить

      if (Ticket==-1)                           // Если рыночных нет 
        {
         Alert("По ",Symbol()," рыночных ордеров нет");
         break;                                 // Выход из цикла закр        
        }
Причина обращения: