Ошибка Invalid ticket for OrderClose function

 

При работе советника регулярно возникают ошибки Invalid ticket for OrderClose function.

Функция закрывающая ордера:

void CloseOrder()
{
double PR=0;
while(!IsTradeAllowed()) Sleep(100);
if(OrderType()==OP_BUY) PR=Bid;
if(OrderType()==OP_SELL) PR=Ask;
if(!OrderClose(OrderTicket(),OrderLots(),PR,3,CLR_NONE))
Print("Ошибка закрытия ордера: ",GetLastError());
return;
}

Весь код в файле.

Господа, обьясните пожалуйста четко и ясно в чем принципиальная неверность данного кода и как лучше реализовать закрытие ордеров.

Файлы:
 

mamba5:

Господа, обьясните пожалуйста четко и ясно в чем принципиальная неверность данного кода

где OrderSelect ???
 
sergeev:
где OrderSelect ???

я изменил функцию... но видимо все еще что то не так:

void CloseOrder(int ticket)
{
double PR=0;
while(!IsTradeAllowed()) Sleep(100);
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
{
if(OrderType()==OP_BUY) PR=Bid;
if(OrderType()==OP_SELL) PR=Ask;
if(!OrderClose(ticket,OrderLots(),PR,3,CLR_NONE))
Print("Ошибка закрытия ордера: ",GetLastError());
}
else
Print("OrderSelect() вернул ошибку - ",GetLastError());
return;
}

где ticket это:

int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",0,0,CLR_NONE);

но ошибка все та же... не могли бы вы более развернуто обьяснить в чем я не прав?

 
mamba5:

int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",0,0,CLR_NONE);

но ошибка все та же... не могли бы вы более развернуто обьяснить в чем я не прав?


int tic у вас оказалась локальной и теряет значение тикета на следующем тике
 
sergeev:

int tic у вас оказалась локальной и теряет значение тикета на следующем тике


Все. Исправил. Спасибо большое. Затруднение в том что OrderSend:

int NewOrder(int Cmd,double Lot)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(Cmd==OP_BUY)
{
PR=Ask;
if(TakeProfit>0)TP=Ask+TakeProfit*Point;
if(StopLoss>0)SL=Bid-StopLoss*Point;
}
if(Cmd==OP_SELL)
{
PR=Bid;
if(TakeProfit>0)TP=Bid-TakeProfit*Point;
if(StopLoss>0)SL=Ask+StopLoss*Point;
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,5,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError());
return(tic);
}

возвращает ошибки 4107 и 4108. Исправил с применением NormalizeDouble:

int NewOrder(int Cmd,double Lot,int slip)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(Cmd==OP_BUY)
{
PR=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK), Digits);
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK)+TakeProfit*Point;
if(StopLoss>0)SL=NormalizeDouble(MarketInfo(Symbol(),MODE_BID)-StopLoss*Point;
}
if(Cmd==OP_SELL)
{
PR=NormalizeDouble(MarketInfo(Symbol(),MODE_BID), Digits);
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_BID)-TakeProfit*Point;
if(StopLoss>0)SL=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK)+StopLoss*Point;
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,slip,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError());
return(tic);
}

Но теперь при коипиляции выдается: "'\end_of_program' - unbalanced left parenthesis (197, 1)" и непонятно действует ли вообще мое нововведение

 
Roll:

Где ваша логика рассуждений:
1."...Исправил с применением NormalizeDouble..."
2."..."
3."..Но теперь при коипиляции выдается: "'\end_of_program' - unbalanced left parenthesis (197, 1)" ...
Мне логика подсказывает, что ошибка(ки) в пункте 2. может/могут быть по причине пункта 1.
И, действительно,...

Тогда поясните как решить проблему с возникающими ошибками 4107 и 4108
 
mamba5:

Тогда поясните как решить проблему с возникающими ошибками 4107 и 4108

Напишите эксперт заново с чистого листа. Компилируя каждое нововведение новой строки или команды.

 
sergeev:

Напишите эксперт заново с чистого листа. Компилируя каждое нововведение новой строки или команды.


Тем самым я избавлюсь от синтаксических ошибок- ошибок в коде, а логические ошибки- возникающие в ходе работы программы, типа 4107? Или в принципе способ с NormalizeDouble верен?

Дело в том что я не понимаю логики возникновения этих ошибок и следовательно не вижу потенциальных путей их решения.

 
mamba5:


Тем самым я избавлюсь от синтаксических ошибок- ошибок в коде, а логические ошибки- возникающие в ходе работы программы, типа 4107? Или в принципе способ с NormalizeDouble верен?

Дело в том что я не понимаю логики возникновения этих ошибок и следовательно не вижу потенциальных путей их решения.


4107 - да, NormalizeDouble

но и вы должны проверить. вдруг вы отрицательное число даете.

не ленитесь при ошибке выводить через Print все параметры в которых сомневаетесь. По другому вы не узнаете где ошибка

4108 - аналогично. проверьте через Print какой тикет вы пытаетесь передать.

 
sergeev:

4107 - да, NormalizeDouble

но и вы должны проверить. вдруг вы отрицательное число даете.

не ленитесь при ошибке выводить через Print все параметры в которых сомневаетесь. По другому вы не узнаете где ошибка

4108 - аналогично. проверьте через Print какой тикет вы пытаетесь передать.

Благодарю. Честно говоря эта очевидная мысль мне не приходила в голову
 
mamba5:


Все. Исправил. Спасибо большое. Затруднение в том что OrderSend:

int NewOrder(int Cmd,double Lot)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(Cmd==OP_BUY)
{
PR=Ask;
if(TakeProfit>0)TP=Ask+TakeProfit*Point;
if(StopLoss>0)SL=Bid-StopLoss*Point;
}
if(Cmd==OP_SELL)
{
PR=Bid;
if(TakeProfit>0)TP=Bid-TakeProfit*Point;
if(StopLoss>0)SL=Ask+StopLoss*Point;
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,5,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError());
return(tic);
}

возвращает ошибки 4107 и 4108. Исправил с применением NormalizeDouble:

int NewOrder(int Cmd,double Lot,int slip)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(Cmd==OP_BUY)
{
PR=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK), Digits);
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK)+TakeProfit*Point;
if(StopLoss>0)SL=NormalizeDouble(MarketInfo(Symbol(),MODE_BID)-StopLoss*Point;
}
if(Cmd==OP_SELL)
{
PR=NormalizeDouble(MarketInfo(Symbol(),MODE_BID), Digits);
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_BID)-TakeProfit*Point;
if(StopLoss>0)SL=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK)+StopLoss*Point;
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,slip,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError());
return(tic);
}

Но теперь при коипиляции выдается: "'\end_of_program' - unbalanced left parenthesis (197, 1)" и непонятно действует ли вообще мое нововведение


ну посмотрите внимательно - у Вас -
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK  )  +TakeProfit*Point;
if(StopLoss>0)SL  =NormalizeDouble(MarketInfo(Symbol(),MODE_BID  )  -StopLoss*Point;
перед MarketInfo открывается скобка - а закрывается она где? длжно быть так -
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK  ))  +TakeProfit*Point;
if(StopLoss>0)SL  =NormalizeDouble(MarketInfo(Symbol(),MODE_BID  ))  -StopLoss*Point;