Вопрос разработчикам OrderClosePrice
return((OrderOpenPrice() - OrderClosePrice())/Point);
не использовать текущие цены?
Функция вообще-то правильная, но лучше использовать Bid, Ask вместо Сlose Price.
Я бы так не рекомендовал. В торговых транзакциях используйте только 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?
Самое главное, скрипт содержал ЯВНО понятный код с комментарием:
// wait for trade context
if (!WaitForTradeContext()) return(false);
Как Вы думаете, может ли бесконечный цикл ожидания освобождения торгового потока как-либо повлиять на устаревание закешированных Bid/Ask ?
Меня удивляют Ваши вопросы и ответы, но все выглядит так, что Вы совершенно не воспринимаете серьезность устаревания цен из-за WaitForTradeContext().
Видимо, "ждет максимум 30 сек" недостаточно, чтобы считать, что за это время цена устарела?
Цены и все рыночное окружение кешируется в момент запуска эксперта. Это означает, что это окружение будет постоянным и однозначным до конца вызова эксперта. То есть, цена Ask не изменится и не покажет разные значения в двух разных строках кода. Чтобы обновить рыночное окружение, необходимо вызвать RefreshRates(). Соответственно, когда эксперт тратит более секунды времени, то это означает, что закешированные значения рыночных цен могут устареть.
У меня есть предложение:
- если я говорю, что писать надо так и не иначе, то именно это и нужно делать
- если я говорю, что код написан неверно, то значит именно так этот код и нужно воспринимать
Иначе Вы будете упорствовать в своем подходе, а разработчики будут раз за разом мягко, тактично (не желая Вас обидеть) и бесполезно пытаться Вам указать на ошибки и показать более правильный подход.
Теперь меня интересуют нюансы работы RefreshRates(), она очень часто возвращает false, скажем если я влетаю в цикл ожидания и по выходу из цикла (3-5 секунд время ожидания пишется в лог) вызываю RefreshRates() получаю false и как это понимать?
как написано в словаре метаэдитора, так и понимать
===
Обновление данных во встроенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт производит вычисления в течение долгого времени и нуждается в обновленных данных. Возвращается ИСТИНА, если данные обновлены, иначе ЛОЖЬ.
===
то есть, false означает, что данные не обновлены.
как написано в словаре метаэдитора, так и понимать
===
Обновление данных во встроенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт производит вычисления в течение долгого времени и нуждается в обновленных данных. Возвращается ИСТИНА, если данные обновлены, иначе ЛОЖЬ.
===
то есть, false означает, что данные не обновлены.
В словаре не написано, устарели при этом предыдущие данные или нет. Может данные не обновлены потому, что в этом просто нет необходимости?
Информация в доке не полная. Приходиться гадать, что да как. :(
//------------------------------------------------------------------------ // 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); }или таких: