Как проверить, выбран ли ордер - страница 10

 
artmedia70:
Чё-то я не вижу проблемы. А сыр-бор разведён... Вам нужно в одной главной функции А() выбирать ордер, а в другой функции В(), вызываемой из главной функции А(), обрабатывать выбранный в ф-ции А() ордер. И в функции В() нужно точно знать - выбран ли всё ещё ордер... Ну так передавайте в функцию В() тикет ордера, выбранного в функции А(). В функции В() можно проверить из какого списка выбран ордер и уже дальше решать куда ехать и что возвращать обратно в функцию А()...

Вы меня не правильно поняли. Как и половина народа почему-то. Мне не нужно в функции B() обрабатывать тот ордер, который выбран в функции A(). Функция B() работает с другими ордерами, не важно с какими, это никак не связано с функцией A(), у функции B() своя логика. Она может считать кол-во ордеров, их суммарную прибыль, смотреть их комменты маджики, ТП СЛ и т.п. Задача в том, чтобы по возврату из функции B() обратно в функцию A(), не зависимо от того, что функция B() делала с ордерами, логика работы функции A() в точке вызова из неё функции B() не нарушалась из-за того, что ордер, выбранный функцией A() до вызова функции B(), более не является выбранным, а выбранным является другой случайный произвольный ордер, с которым работала функция B(), скорее всего тоже перебирающая ордера в цикле.

artmedia70:
Давайте теперь представим что произойдёт с переменной last_select после перезапуска терминала (свет противные дядьки вырубили)

После перезапуска переменная last_select будет инициализирована в 0, как и требуется.

 

Затеяли бла-бла-бла на 10 страниц. Вот код, который предусматривает работу функции с другим (не выделенным) ордером:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Получаем актуальную информацию об ордере                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fGet_OrderDetails (int fi_Ticket)              // OrderTicket()
{
    int lia_cmd[] = {1,-1,-1,1,1,-1};
//----
    //---- На текущий момент может быть выделенным другой ордер
    int li_LastTicket = OrderTicket();
    if (li_LastTicket != fi_Ticket)
    {   
        if (!OrderSelect (fi_Ticket, SELECT_BY_TICKET))
        {fSet_Comment (fi_Ticket, fi_Ticket, 100, "fGet_OrderDetails()", True, GetLastError()); return (false);}
    }
    if (bi_curTicket != fi_Ticket)
    {
        bi_Type = OrderType();
        bd_OpenPrice = NDD (OrderOpenPrice());
        bd_Lots = OrderLots();
        bi_cmd = lia_cmd[bi_Type];
        bi_curTicket = fi_Ticket;
    }
    bd_curSL = NDD (OrderStopLoss());
    bd_curTP = NDD (OrderTakeProfit());
    //---- Выделяем первоначальный ордер
    if (li_LastTicket != fi_Ticket) {if (li_LastTicket > 0) OrderSelect (li_LastTicket, SELECT_BY_TICKET);}
//----
    return (true);
}
это просто для примера. Понимающий суть уловит.
 
TarasBY:

Затеяли бла-бла-бла на 10 страниц. Вот код, который предусматривает работу функции с другим (не выделенным) ордером:

это просто для примера. Понимающий суть уловит.

Не в этом дело. Есть переменные, локальные или глобальные, в советнике и есть переменные терминала. С точки зрения программы, эти переменные интерактивны, поскольку их значение может совершенно необъяснимым для советника образом измениться в любой момент. Признак выбора ордера - именно такая переменная. Если бы Метаквоты разрешили доступ к признаку "выбора" графического объекта, то и с ним была бы такая же байда. Отсюда - неизбежное следствие: надо выбирать ордер всякий раз, когда необходимо узнать номер выбранного ордера, либо надо запоминать выбранный ордер тогда и только тогда, когда этого требует логика советника. Как-то так...
 
tara:
Не в этом дело. Есть переменные, локальные или глобальные, в советнике и есть переменные терминала. С точки зрения программы, эти переменные интерактивны, поскольку их значение может совершенно необъяснимым для советника образом измениться в любой момент. Признак выбора ордера - именно такая переменная. Если бы Метаквоты разрешили доступ к признаку "выбора" графического объекта, то и с ним была бы такая же байда. Отсюда - неизбежное следствие: надо выбирать ордер всякий раз, когда необходимо узнать номер выбранного ордера, либо надо запоминать выбранный ордер тогда и только тогда, когда этого требует логика советника. Как-то так...

Я с Вами полностью согласен:

  • во-превых, нужно исходить из того. что имеем (возможности MQL4); 
  • во-вторых, я сам использую структуру обработки ВСЕХ торговых приказов с открытыми ордерами в одном месте: делаю перебор списка ордеров и произвожу с каждым ордером все необходимые действия (по-порядку).

P.S. А упомянутую проверку в коде произвожу "на всякий случай"... :) 

 

:)

С Праздником! Для меня - 20 лет, не худших в жизни.

 
TarasBY:

Затеяли бла-бла-бла на 10 страниц. Вот код, который предусматривает работу функции с другим (не выделенным) ордером:

это просто для примера. Понимающий суть уловит.

Ага. Вот на этом месте:

     int li_LastTicket = OrderTicket();

Ваш код сгенерирует ошибку выполнения 4105, если до совершения его вызова не было ни одного вызова OrderSelect. Просто поставьте проверку GetLastError на окончании каждого тика и обнаружите эту ошибку.

 
tara:

:)

С Праздником! Для меня - 20 лет, не худших в жизни.

Поздравляю! А что, 20 лет служили "Верой и Правдой"?
 
borilunad:
Поздравляю! А что, 20 лет служили "Верой и Правдой"?
Ею, родимою.
 
tara:
Ею, родимою.
Значит, сверхсрочником, как в мою бытность называли, а может и сейчас, куском!? :)
 
borilunad:
Значит, сверхсрочником, как в мою бытность называли, а может и сейчас, куском!? :)
Станет легче, если скажу, что так?:)