А почему бы здесь
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 и как это понимать?
Теперь меня интересуют нюансы работы RefreshRates(), она очень часто возвращает false, скажем если я влетаю в цикл ожидания и по выходу из цикла (3-5 секунд время ожидания пишется в лог) вызываю RefreshRates() получаю false и как это понимать?
как написано в словаре метаэдитора, так и понимать
===
Обновление данных во встроенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт производит вычисления в течение долгого времени и нуждается в обновленных данных. Возвращается ИСТИНА, если данные обновлены, иначе ЛОЖЬ.
===
то есть, false означает, что данные не обновлены.
как написано в словаре метаэдитора, так и понимать
===
Обновление данных во встроенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт производит вычисления в течение долгого времени и нуждается в обновленных данных. Возвращается ИСТИНА, если данные обновлены, иначе ЛОЖЬ.
===
то есть, false означает, что данные не обновлены.
В словаре не написано, устарели при этом предыдущие данные или нет. Может данные не обновлены потому, что в этом просто нет необходимости?
Информация в доке не полная. Приходиться гадать, что да как. :(
RefreshRates гарантирует использование нипоследних данных, которые есть у терминала. мы неоднократно говорили, что каждый эксперт и скрипт работает с копией исторических данных
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//------------------------------------------------------------------------ // 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); }или таких: