Может сделать какую т о универсальную функцию обновления списка ордеров
?
позиция открыта - но не может быть модифицирована так как советник ее не видит.
Запомнили тикет ордера, который должен был открыть позицию, и с небольшим слипом перебираем все сделки.
Если находим, ту, у которой 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 )
{
caseORDER_STATE_STARTED: // Ордер проверен на корректность, но еще не принят брокеромcaseORDER_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 и OnTradeTransaction (а это рано или поздно придется сделать)
Ну или топикстартеру юзать события OnTrade и OnTradeTransaction (а это рано или поздно придется сделать)
опять та же самая беда уже и 5 сек не помогает.
Может сделать какую т о универсальную функцию обновления списка ордеров
?
позиция открыта - но не может быть модифицирована так как советник ее не видит.
опять та же самая беда уже и 5 сек не помогает.
Может сделать какую т о универсальную функцию обновления списка ордеров
?
позиция открыта - но не может быть модифицирована так как советник ее не видит.
Запомнили тикет ордера, который должен был открыть позицию, и с небольшим слипом перебираем все сделки.
Если находим, ту, у которой DEAL_ORDER соответствует нашему ордеру, значит позиция открыта.
Примерно так (это часть кода):
pLastOrder - тикет ордера, pLastTime - время, начиная с которого выбирается история (должно быть гарантированно меньше времени установки ордера, можно использовать 0).
Функцию можно вызывать в цикле с небольшим слипом, пока она не вернет true. Это будет знаком того, что сделка есть (позиция открыта).