проблема с выбором позиций с приставкой /m - страница 6

 
Ну или топикстартеру юзать события OnTrade и OnTradeTransaction (а это рано или поздно придется сделать)
 
i_logic:
Ну или топикстартеру юзать события OnTrade и OnTradeTransaction (а это рано или поздно придется сделать)
Absolutly
 
i_logic:
Ну или топикстартеру юзать события OnTrade и OnTradeTransaction (а это рано или поздно придется сделать)
ОнТрейд не всегда удобен. Можно просто спать, пока отправленный ордер не зафилится (искать Deal с соответствующим тикетом).
 

опять та же самая беда уже и 5 сек не помогает. 

Может сделать какую т о универсальную функцию обновления списка ордеров

?

позиция открыта - но не может быть модифицирована так как советник ее не видит.  

 
Vladon:

опять та же самая беда уже и 5 сек не помогает. 

Может сделать какую т о универсальную функцию обновления списка ордеров

?

позиция открыта - но не может быть модифицирована так как советник ее не видит.  

Запомнили тикет ордера, который должен был открыть позицию, и с небольшим слипом перебираем все сделки.

Если находим, ту, у которой  DEAL_ORDER соответствует нашему ордеру, значит позиция открыта.

Примерно так (это часть кода):

bool CheckLastOrder( ulong pLastOrder, datetime pLastTime )
{
        if ( !HistoryOrderSelect( pLastOrder ) )
        {
                // Print( __FUNCTION__, ": OrderSelect( ", pLastOrder, " ) failed with error #", GetLastError(), "!" );
                return(false);
        }

        ENUM_ORDER_STATE state = (ENUM_ORDER_STATE)OrderGetInteger( ORDER_STATE );

        switch ( state )
        {
                case ORDER_STATE_STARTED:                               // Ордер проверен на корректность, но еще не принят брокером
                case ORDER_STATE_FILLED:                                // Ордер выполнен полностью
                {
                        // Проверяем, есть ли соответствующая сделка в истории
                        ResetLastError();
                        if ( !HistorySelect( pLastTime, INT_MAX ) )
                        {
                                Print( __FUNCTION__, ": HistorySelect( ", pLastTime, ", ", INT_MAX, " ) failed with error #", GetLastError(), "!" );
                                return(false);
                        }

                        // Перебираем, начиная с самой новой
                        for ( int i = HistoryDealsTotal()-1; i >= 0; i -- )
                        {
                                ulong ticket = HistoryDealGetTicket( i );

                                if ( ticket <= 0 ) continue;

                                if ( HistoryDealGetInteger( ticket, DEAL_ORDER ) == pLastOrder )
                                {
                                        Print( __FUNCTION__, ": order #", pLastOrder, " FILLED (state = ", IntegerToString( state ), "), deal finded in history, continue work..." );
                                        return(true);
                                }
                        }

                        // Сделки в истории нет, ждем...
                        Print( __FUNCTION__, ": order #", pLastOrder, " STARTED (state = ", IntegerToString( state ), "), but deal not finded in history yet!" );
                        return(false);

 pLastOrder - тикет ордера, pLastTime - время, начиная с которого выбирается история (должно быть гарантированно меньше времени установки ордера, можно использовать 0).

Функцию можно вызывать в цикле с небольшим слипом, пока она не вернет true. Это будет знаком того, что сделка есть (позиция открыта). 

 
Ну, или как советовали раньше - через OnTrade.
Причина обращения: