OrderSelect не корректно работает

 
Ситуация следующая:
OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES);
ticket
отсутствует, а функция продолжает возвращать true.

////Модуль поиска активных ордеров<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
bool B = false;
bool S = false; 
    Print ("ticketDcontrolBuy = ", ticketDcontrolBuy, ", ticketDcontrolSell = ", ticketDcontrolSell);
    B = OrderSelect (ticketDcontrolBuy, SELECT_BY_TICKET , MODE_TRADES);
    S = OrderSelect (ticketDcontrolSell, SELECT_BY_TICKET , MODE_TRADES);
    Print (B);
    Print (S);
if (B == false && S == false)

Весь эксперт в прикреплённом файле.
Файлы:
kir_002.mq4  7 kb
 
У себя воспроизвести не смог.

Открыл 2 позиции - №4790253 и №4790255, запустил такой код:
Print( "OrderSelect( 4790253, SELECT_BY_TICKET )  =   ", OrderSelect( 4790253, SELECT_BY_TICKET ) );
Print( "OrderSelect( 4790253, SELECT_BY_TICKET, MODE_TRADES )  =   ", OrderSelect( 4790253, SELECT_BY_TICKET, MODE_TRADES ) );
Print( "OrderSelect( 4790254, SELECT_BY_TICKET )  =   ", OrderSelect( 4790254, SELECT_BY_TICKET ) );
Print( "OrderSelect( 4790254, SELECT_BY_TICKET, MODE_TRADES )  =   ", OrderSelect( 4790254, SELECT_BY_TICKET, MODE_TRADES ) );
Print( "OrderSelect( 4790255, SELECT_BY_TICKET )  =   ", OrderSelect( 4790255, SELECT_BY_TICKET ) );
Print( "OrderSelect( 4790255, SELECT_BY_TICKET, MODE_TRADES )  =   ", OrderSelect( 4790255, SELECT_BY_TICKET, MODE_TRADES ) );
Получил в журнале:
00:48:38 __________ EURUSD,H1: loaded successfully
00:48:38 __________ EURUSD,H1: OrderSelect( 4790253, SELECT_BY_TICKET ) = 1
00:48:38 __________ EURUSD,H1: OrderSelect( 4790253, SELECT_BY_TICKET, MODE_TRADES ) = 1
00:48:38 __________ EURUSD,H1: OrderSelect( 4790254, SELECT_BY_TICKET ) = 0
00:48:38 __________ EURUSD,H1: OrderSelect( 4790254, SELECT_BY_TICKET, MODE_TRADES ) = 0
00:48:38 __________ EURUSD,H1: OrderSelect( 4790255, SELECT_BY_TICKET ) = 1
00:48:38 __________ EURUSD,H1: OrderSelect( 4790255, SELECT_BY_TICKET, MODE_TRADES ) = 1
00:48:38 __________ EURUSD,H1: removed
После закрытия позиций ситуация не поменялась, т.е. результат такой же.
 
nigilist:
Ситуация следующая:
OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES);
ticket
отсутствует, а функция продолжает возвращать true.

Тикет присутствует. В истории сделок.

В документации, кстати, все есть.

bool OrderSelect( int index, int select, int pool=MODE_TRADES)
Параметры:
index - Позиция ордера или номер ордера в зависимости от второго параметра.
select - Флаг способа выбора. Mожет быть одним из следующих величин:
SELECT_BY_POS - в параметре index передается порядковый номер позиции в списке,
SELECT_BY_TICKET - в параметре index передается номер тикета.
pool - Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:
MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.
 
Irtron:
Тикет присутствует. В истории сделок.
Не в этом дело. Если использовать SELECT_BY_TICKET, третий параметр просто игнорируется.
Кстати, мой предыдущий пост это иллюстрирует ;)
 
nigilist писал(а) >>
Ситуация следующая:
OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES);
ticket
отсутствует, а функция продолжает возвращать true.


Весь эксперт в прикреплённом файле.

Имею похожую проблему. Пытаюсь закрыть несколько ордеров. В цикле для первого ордера с номером позиции "0" все нормально, а второй ордер с номером позиции "1" не закрывает. По тексту кода. OrderSelect дает false, но ошибки нет. Если убрать return в анализе ошибки, то выясняется, что Ticket = Lot = 0 и Close не работает. Прошу помочь.

for(i = 0; i < Total; i++)
{
RefreshRates();
if(Errors() == false)
return(-1);
Print("Close: OrderSelect_b");

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
{
err = GetLastError();
Print("Error-oшибка=", err, "-", ErrorDescription(err));
return(-1);
}
Print("Close: OrderSelect-f");
Tip = OrderType();
Ticket = OrderTicket();
Lot = OrderLots();
if (Tip == OP_BUY)
Price_Cls = Bid; // Для ордеров Buy
if (Tip == OP_SELL)
Price_Cls = Ask; // Для ордеров Sell
if(ExtDebug)
Print("Close: Закрываем ордер c Ticket=", Ticket,
", Lot=", Lot,
", Price=", Price_Cls,
", Slip=", slip,
", freez=", freez,
", Total=", Total,
", i=", i);

OrderClose(Ticket, Lot, Price_Cls, slip, Red);//Закрыть ордер !:)
Errors();

18:00:58 2008.10.27 04:47 1F_MA_ZZ EURUSD,M1: Close: OrderSelect-f
18:00:58 2008.10.27 04:47 1F_MA_ZZ EURUSD,M1: Close: Закрываем ордер c Ticket=6, Lot=0.7, Price=1.259, Slip=0, freez=0, Total=2, i=0
18:00:58 2008.10.27 04:47 1F_MA_ZZ EURUSD,M1: close #6 sell 0.70 EURUSD at 1.2626 sl: 1.2626 at price 1.2590
18:00:58 2008.10.27 04:47 1F_MA_ZZ EURUSD,M1: Close: Закрыли ордер c Ticket=6, Lot=0.7, Price=1.259, Slip=0, freez=0, Total=2, i=0
18:00:58 2008.10.27 04:47 1F_MA_ZZ EURUSD,M1: Close: OrderSelect_b
18:00:58 2008.10.27 04:47 1F_MA_ZZ EURUSD,M1: Error-oшибка=0-no error

 
faa1947 писал(а) >>

Имею похожую проблему. Пытаюсь закрыть несколько ордеров. В цикле для первого ордера с номером позиции "0" все нормально, а второй ордер с номером позиции "1" не закрывает.

Потому как после закрытия позиции с номером "0", позиция с номером "1" становится позицией с номером "0")

Исправьте for(i = 0; i < Total; i++) на for(i = Total-1; i >= 0; i--)

Причина обращения: