ну так выведите принтом что показывает тикет перед вызовом функции OrderClose... и посмотрите есть ли такой тикет среди всех ордеров.
Может у вас неверно составляется массив Mas_Ord_New. Начните проверку с него.
ну так выведите принтом что показывает тикет перед... и посмотрите есть ли такой тикет среди всех ордеров.
Может у вас неверно составляется массив 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
При тестировании советника в журнале тестера выдаётся ошибка
Как можно это исправить,если функция закрытия ордеров эта
С уважением Александр
Ваш цикл не сумел изменить значение 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]; // Номер его ордера такой
}
}
Ваш цикл не сумел изменить значение 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]; // Номер его ордера такой
}
}
Нелимитные ордера,это что за ордера?
Хотел написать: нет открытых ордеров, кроме выставленных лимитных. Короче - нет открытых ордеров.
Надо выяснить, есть ли с чем работать циклу.
Поставить проверку значения 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; // Выход из пользов. функции
}
Хотел написать: нет открытых ордеров, кроме выставленных лимитных. Короче - нет открытых ордеров.
Надо выяснить, есть ли с чем работать циклу.
Поставить проверку значения 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; // Выход из цикла закр }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как можно это исправить,если функция закрытия ордеров эта
С уважением Александр