Форум трейдеров » Торговые роботы, советники, индикаторы » Вопросы программирования
+ Подписаться
Страница 35 из 87 ПерваяПервая ... 2533343536374585 ... ПоследняяПоследняя
  1. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от keekkenen Посмотреть сообщение
    это не глюк..

    это недоработка разработчиков mql, суть в том, что при использовании SELECT_BY_TICKET третий параметр игнорируется, таким образом конструкция
    if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

    будет возвращать false, только тогда, когда ордера с номером ticket нет среди отрытых и нет среди закрытых/удаленных ордеров, т.е. такой ордер никогда не открывался (ну, это если доступна вся история сделок)..
    Похоже на то.:confused:
    Дело в том что режимы MODE_TRADES и MODE_HISTORY в конструкциях
    if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
    и
    if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) возвращают одни и те же состояния именно в режиме тестирования стратегии.
    Это глюки скорее всего не самого языка MQL4 а терминала MT4, неправильно он тестирует стратегии.

    Помогло SELECT_BY_POS, спасибо EQU!;)
    Но так как у меня в позиции не один ордер, а произвольное количество на разных инструментах, пришлось для такой элементарной проверки, написать функцию проверки с перебором всех ордеров.

    PHP код:
    if (is_Closed(T1) == true) Print("Теперь точно ордер закрыт");

    int is_Closed(int ticket) {
        for (
    int i=0i<OrdersTotal(); i++) {
            if (
    OrderSelect(iSELECT_BY_POS) == true && Symbol() == OrderSymbol() && OrderTicket() == ticket) return(0);
        }
        return(
    1);

    PS Кошмар какой то!!! С такими элементарными вещами измачиваться приходится, неужели в MQL4 закрытия ордеров по стопам вообще не предусмотренны?:thumbsup_002:
    Могли бы ради этого случая спец функции прикрутить или даже событие по закрытию ордеров.:cry:
  2. 1,279
    Комментарии
    15
    Темы
    1292
    Репутация Pro
    Аватар для Sevrer  
    Мастер форумных наук

    5 Медалей
    Не понимаю проблемы.
    Вот из хелпа:
    datetime OrderCloseTime( )
    Возвращает время закрытия для выбранного ордера. Только закрытые ордера имеют время закрытия, не равное 0. Открытые или отложенные ордера имеют время закрытия, равное 0.
    Ордер должен быть предварительно выбран с помощью функции OrderSelect().
  3. 66
    Комментарии
    0
    Темы
    66
    Репутация Pro
     
    В начале пути

    2 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    PS Кошмар какой то!!! С такими элементарными вещами измачиваться приходится, неужели в MQL4 закрытия ордеров по стопам вообще не предусмотренны?:thumbsup_002:
    Могли бы ради этого случая спец функции прикрутить или даже событие по закрытию ордеров.:cry:
    все отдано на откуп нам..

    ваша функция хороша, но стоит учитывать, что она хороша только там, где есть определенность того что ордер открывался, т.к. если ордер не открывался, то поведение функции будет таким, как-будто ордер закрыт..
    таким образом ваша функция подобна OrderSelect() с параметром отбора по тикетам :) старайтесь писать недвусмысленные функции, а то забудете про этот момент и вставите ее в другом советнике и в другой ситуации..
  4. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от Sevrer Посмотреть сообщение
    Не понимаю проблемы.
    Вот из хелпа:
    datetime OrderCloseTime( )
    Возвращает время закрытия для выбранного ордера. Только закрытые ордера имеют время закрытия, не равное 0. Открытые или отложенные ордера имеют время закрытия, равное 0.
    Ордер должен быть предварительно выбран с помощью функции OrderSelect().
    Вау!!! Sevrer, Вы гений!
    Как говорится все гениальное просто.

    Я уже измучался с этой проверкой, и так и так пробовал, даже пытался сравнивать OrderStopLoss( ) и OrderClosePrice(), а оказывается всё гораздо проще.
    Таким образом проверка закрытия ордера, будет иметь вид одной строчки кода:
    PHP код:
    if (OrderSelect(ticketSELECT_BY_TICKET) != false && OrderCloseTime() > 0) Print("Ордер закрыт"); 
  5. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Вот ещё один глюк, не пойму в чем дело...
    Во первых не работает стандартный скрипт из набора MT4 delete_pending, удаляет один ордер и все, приплыли...

    Мне нужно удалить все ордера по данному инструменту. Для тестирование написал такой пример:

    Сначала устанавливаем 10 ордеров, затем все их удаляем.

    PHP код:
    for(int i=0i<10i++) {
          
    OrderSend(Symbol(), OP_BUYSTOP0.11.3750 Point300""163840CLR_NONE);
    }

    for(
    i=0i<OrdersTotal(); i++) {
          if (
    OrderSelect(iSELECT_BY_POSMODE_TRADES) == false || Symbol() != OrderSymbol()) continue;
          
    OrderDelete(OrderTicket());

    После выполнения остаются 2-4 ордера. При том количество оставшихся ордеров не фиксировано, может 2 а может 4, а может и 1, но ордера остаются в любом случае. Не удаляются все почему то.
    Если повторить попытку удаления, то удаляются, а с первого раза никак!

    Как быть?
  6. 66
    Комментарии
    0
    Темы
    66
    Репутация Pro
     
    В начале пути

    2 Медалей
    счетчик ордеров в цикле сделай от посkеднего к первому,
    ну и по жестче с удалением, типа while( !OrderDelete( OrderTicket() ) ) {}
  7. 2,974
    Комментарии
    7
    Темы
    2995
    Репутация Pro
     
    Banned

    4 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    Вот ещё один глюк, не пойму в чем дело...
    Во первых не работает стандартный скрипт из набора MT4 delete_pending, удаляет один ордер и все, приплыли...

    Мне нужно удалить все ордера по данному инструменту. Для тестирование написал такой пример:

    Сначала устанавливаем 10 ордеров, затем все их удаляем.

    PHP код:
    for(int i=0i<10i++) {
          
    OrderSend(Symbol(), OP_BUYSTOP0.11.3750 Point300""163840CLR_NONE);
    }

    for(
    i=0i<OrdersTotal(); i++) {
          if (
    OrderSelect(iSELECT_BY_POSMODE_TRADES) == false || Symbol() != OrderSymbol()) continue;
          
    OrderDelete(OrderTicket());

    После выполнения остаются 2-4 ордера. При том количество оставшихся ордеров не фиксировано, может 2 а может 4, а может и 1, но ордера остаются в любом случае. Не удаляются все почему то.
    Если повторить попытку удаления, то удаляются, а с первого раза никак!

    Как быть?

    OrdersTotal() - надо вынести за цикл.. Например - total=OrdersTotal()
    Иначе, после удаления, будет меняцца число ордеров, что надо просмотреть..
    ;)

    for(i=0; i<total; i++) {

    И тип ордера надо указать ОБЯЗАТЕЛЬНО..
    т.е.

    if(OrderType()==OP_BUYSTOP || и т.д.)// списочек, какой надо, через ИЛИ
    OrderDelete(OrderTicket());// применима ток к пендингам(!!!)..
  8. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от EQU Посмотреть сообщение
    Тип ордера надо указать ОБЯЗАТЕЛЬНО..
    т.е.
    Ну это понятное дело, в самой программе я это все учитываю. Про то что ордера OP_BUY и OP_SELL не удаляются это я знаю.

    Выше был приведен просто пример создания пендингов и последующего их удаления. Вот именно тот пример и не работал полноценно.
    while(OrderDelete(OrderTicket()) == false) continue; не помогло, впрочем и не должно было помочь, так как ошибок при удалении эксперт не сообщает.

    А вот смена счетчика цикла сработала. Если удалять ордера начиная с последнего, тогда все работает четко.

    PHP код:
    for(int i=OrdersTotal(); i>=0i--) {
          if (
    OrderSelect(iSELECT_BY_POSMODE_TRADES) == false || Symbol() != OrderSymbol()) continue;
          if (
    OrderType() == OP_BUY || OrderType() == OP_SELL) continue;
          
    OrderDelete(OrderTicket());

  9. 2,974
    Комментарии
    7
    Темы
    2995
    Репутация Pro
     
    Banned

    4 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    Ну это понятное дело, в самой программе я это все учитываю. Про то что ордера OP_BUY и OP_SELL не удаляются это я знаю.

    Выше был приведен просто пример создания пендингов и последующего их удаления. Вот именно тот пример и не работал полноценно.
    while(OrderDelete(OrderTicket()) == false) continue; не помогло, впрочем и не должно было помочь, так как ошибок при удалении эксперт не сообщает.

    А вот смена счетчика цикла сработала. Если удалять ордера начиная с последнего, тогда все работает четко.

    PHP код:
    for(int i=OrdersTotal(); i>=0i--) {
          if (
    OrderSelect(iSELECT_BY_POSMODE_TRADES) == false || Symbol() != OrderSymbol()) continue;
          if (
    OrderType() == OP_BUY || OrderType() == OP_SELL) continue;
          
    OrderDelete(OrderTicket());

    Выше добавил причину, почему с хвоста головы работает, а наоборот - нет..:smartass:
  10. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от EQU Посмотреть сообщение
    Выше добавил причину, почему с хвоста головы работает, а наоборот - нет..
    PHP код:
    int total OrdersTotal();
       for(
    int i=0i<totali++) {
    ....................................... 
    Тоже не помогло. Результат тот же.
    Помола именно полная смена порядка удаления. Сам не понимаю почему???:confused:

Вверх
РегистрацияX

чтобы писать, читать, комментировать