Вопрос разработчикам OrderClosePrice

 
Работает ли функция OrderClosePrice() на ордерах которые открыты в данный момент? Насколько я тестирую - работает, но хотелось бы уточнить корректно ли ее использовать или нет например для таких целей:

//------------------------------------------------------------------------
// int get order profit in pips
//------------------------------------------------------------------------
int OrderProfitPips(int OrderHandle)
  {
    if (!OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)) return(0);
    
    if (OrderType() == OP_SELL)
      return((OrderOpenPrice() - OrderClosePrice())/Point);
     
    if (OrderType() == OP_BUY) 
      return((OrderClosePrice() - OrderOpenPrice())/Point);
    
    return(0);
  }



или таких:

OrderClose(OrderHandle, OrderLots(), OrderClosePrice(), 5, clr)
 
А почему бы здесь
return((OrderOpenPrice() - OrderClosePrice())/Point);


не использовать текущие цены?

 
int OrderProfitPips(int OrderHandle)

Функция вообще-то правильная, но лучше использовать Bid, Ask вместо Сlose Price.

OrderClose(OrderHandle, OrderLots(), OrderClosePrice(), 5, clr)

Я бы так не рекомендовал. В торговых транзакциях используйте только Bid или Ask явно.

Часть кода может выглядеть довольно безопасно, но если этот код включен в другой, где не поддерживается условие корректности и обновленности цен, ордеров (и всего рыночного окружения), то код превращается в опасный.
 
Дело в том что я нарвался на ошибку в скрипте когда тестировал одну функцию

//------------------------------------------------------------------------
// close order
//------------------------------------------------------------------------
bool CloseOrder(int OrderHandle)
  {
    color clr;
   
    Print("Trying to close order ", OrderHandle); 
    
    // wait for trade context
    if (!WaitForTradeContext()) return(false);
    
    if (!OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)) 
      {
        Print("Can not locate order info");
        return(false);
      }
      
    if (OrderType() == OP_BUY) clr = Yellow; else clr = Red;    
    if (OrderClose(OrderHandle, OrderLots(), OrderClosePrice(), 5, clr))
      {
        Print("Successful");
        return(true);
      }
    else
      {
        Print("Failed: ", ErrorDescription(GetLastError()));
        return(false);
      }
  }



скрипт содержал одну строчку CloseOrder(тикет), оказалось что ask и bid в скрипте были некорректными! Функция OrderClose(OrderHandle, OrderLots(), Ask(Bid), 5, clr) например постоянно выдавала ошибку invalid price или что-то типа этого, после замены на OrderClosePrice() все стало работать как часы. Или при входе в любой скрипт надо сначала вызывать RefreshRates?

 
скрипт содержал одну строчку CloseOrder(тикет), оказалось что ask и bid в скрипте были некорректными! Функция OrderClose(OrderHandle, OrderLots(), Ask(Bid), 5, clr) например постоянно выдавала ошибку invalid price или что-то типа этого, после замены на OrderClosePrice() все стало работать как часы. Или при входе в любой скрипт надо сначала вызывать RefreshRates?

Самое главное, скрипт содержал ЯВНО понятный код с комментарием:
// wait for trade context
    if (!WaitForTradeContext()) return(false);


Как Вы думаете, может ли бесконечный цикл ожидания освобождения торгового потока как-либо повлиять на устаревание закешированных Bid/Ask ?

 
Дело в том что данный цикл срабатывает только в случае одновременного старта нескольких экспертов, иначе он отрабатывает без ожидания, кроме того он не бесконечный а ждет только максимум 30 секунд, практика показала значения от 3 до 5 секунд в случеа старта одновременно 3х экспертов по новому бару. Но в данной ситуации единичного скрипта никакой задержки нет вообще, можно вообще убрать эту строку и тем не менее...
 
Но в данной ситуации единичного скрипта никакой задержки нет вообще, можно вообще убрать эту строку и тем не менее...

Меня удивляют Ваши вопросы и ответы, но все выглядит так, что Вы совершенно не воспринимаете серьезность устаревания цен из-за WaitForTradeContext().

Видимо, "ждет максимум 30 сек" недостаточно, чтобы считать, что за это время цена устарела?

оказалось что ask и bid в скрипте были некорректными

Цены и все рыночное окружение кешируется в момент запуска эксперта. Это означает, что это окружение будет постоянным и однозначным до конца вызова эксперта. То есть, цена Ask не изменится и не покажет разные значения в двух разных строках кода. Чтобы обновить рыночное окружение, необходимо вызвать RefreshRates(). Соответственно, когда эксперт тратит более секунды времени, то это означает, что закешированные значения рыночных цен могут устареть.

У меня есть предложение:
- если я говорю, что писать надо так и не иначе, то именно это и нужно делать
- если я говорю, что код написан неверно, то значит именно так этот код и нужно воспринимать

Иначе Вы будете упорствовать в своем подходе, а разработчики будут раз за разом мягко, тактично (не желая Вас обидеть) и бесполезно пытаться Вам указать на ошибки и показать более правильный подход.
 
Я упорствую только в одном - надо победить ошибку и я ее победил, дело оказалось вовсе не в ожидании контекста. В чем было дело я правда уже не скажу, где-то была ошибка с типами или перепутаны бид и аск. Ваши предложения без внимания не остаются ;).

Теперь меня интересуют нюансы работы RefreshRates(), она очень часто возвращает false, скажем если я влетаю в цикл ожидания и по выходу из цикла (3-5 секунд время ожидания пишется в лог) вызываю RefreshRates() получаю false и как это понимать?
 
Теперь меня интересуют нюансы работы RefreshRates(), она очень часто возвращает false, скажем если я влетаю в цикл ожидания и по выходу из цикла (3-5 секунд время ожидания пишется в лог) вызываю RefreshRates() получаю false и как это понимать?

как написано в словаре метаэдитора, так и понимать
===
Обновление данных во встроенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт производит вычисления в течение долгого времени и нуждается в обновленных данных. Возвращается ИСТИНА, если данные обновлены, иначе ЛОЖЬ.
===
то есть, false означает, что данные не обновлены.
 

как написано в словаре метаэдитора, так и понимать
===
Обновление данных во встроенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт производит вычисления в течение долгого времени и нуждается в обновленных данных. Возвращается ИСТИНА, если данные обновлены, иначе ЛОЖЬ.
===
то есть, false означает, что данные не обновлены.

В словаре не написано, устарели при этом предыдущие данные или нет. Может данные не обновлены потому, что в этом просто нет необходимости?
Информация в доке не полная. Приходиться гадать, что да как. :(
 
RefreshRates гарантирует использование нипоследних данных, которые есть у терминала. мы неоднократно говорили, что каждый эксперт и скрипт работает с копией исторических данных