А почему бы здесь
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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
или таких: