OrderClose не закрывает позицию

 
Господа, кто-нибудь может помочь в написании куска кода, который бы гарантированно закрывал позицию?
Просто OrderClose иногда не срабатывает по разным причинам с печальными последствиями...
Может как-то анализировать причины?
 
гарантии только бог даёт =)
я, например, написал себе ф-цию - пользуюсь ею:

/////////////////////////////////////////////////////////////////////////////////
/**/ int _OrderClose ( int _OrderTicket, int _Slippage )
/////////////////////////////////////////////////////////////////////////////////
// Стандартная ф-ция OrderClose + вывод информации.
// При успешном выполнении возвращает "1", при ошибке возвращает "-1", при ошибке № ордера возвращает "-2"
/////////////////////////////////////////////////////////////////////////////////
{
	Print( "_OrderClose ( ", _OrderTicket, ", ", _Slippage, " ) - loaded..." );
	if ( OrderSelect( _OrderTicket, SELECT_BY_TICKET ) == false )
	{
		Print( "_OrderClose ( ", _OrderTicket, ", ", _Slippage, " ) - return(-2);" );
		return(-2);
	}
	int ordertype = OrderType();
	string ordersymbol = OrderSymbol();
	double orderlots = NormalizeDouble( OrderLots(), 1 );
	string _OrderType_str = _OrderType_str ( ordertype );
	int digits = MarketInfo( ordersymbol, MODE_DIGITS );

	if ( ordertype > OP_SELL )  { return(-1); }
	if ( _Slippage < 0 ) { _Slippage = 0; }
	double _ClosePrice = NormalizeDouble( MarketInfo ( ordersymbol, MODE_ASK ), digits );
	if ( ordertype == OP_BUY )
	{ _ClosePrice = NormalizeDouble( MarketInfo ( ordersymbol, MODE_BID ), digits ); }
	color _Color = Red;
	for ( int x = 0; x < 3; x ++ )
	{
		if ( OrderSelect( _OrderTicket, SELECT_BY_TICKET ) == false )
		{
			Print( "_OrderClose ( ", _OrderTicket, ", ", _Slippage, " ) - return(-2);" );
			return(-2);
		}
		int orderclose = OrderClose( _OrderTicket, orderlots, _ClosePrice, _Slippage, _Color );
		if ( orderclose > 0 )
		{
			Print( "_OrderClose ( ", _OrderTicket, ", ", _Slippage, " ) - return(1);" );
			return(1);
		}
		int error_code = GetLastError();
		Print ( "Ошибка при закрытии позиции - ", error_code );
		Sleep(10000);
	}
Print( "_OrderClose ( ", _OrderTicket, ", ", _Slippage, " ) - return(-1);" );
return(-1);
}


и всё это - вместо одной строчки ордерклоус... =)))

 
Может как-то анализировать причины?

да, это у меня делает другая ф-ция =0)
только пока нет развёрнутого описания ошибок и рекомендаций - что с ними делать, она у меня просто отправляет уведомление на мыло и, в крайнем случае (серьёзная ошибка), прекращает работу эксперта.
 
Спасибо.
 
Опять не сработал OrderClose - второй раз за две недели.
OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow);


К сожалению, вышепреведенный код тоже не гарантирует закрытие позиции - он просто пытается сделать это три раза...
Я специально смоделировал закрытие ордера в эксперте по каждому тику. Не закрывает. (Конечно, я мог закрыть вручную, но это не решит проблему в целом). Более глубокий анализ показал следующее:
1. OrderClose возвращает 0. То есть ордер не закрыт.
2. GetLastError выдает 129 (Invalid Price) и 138 (Requote).

Что делать? Как обработать ошибки и закрыть ордер программно?