Может вместо:
Написать:
if(OrderStopLoss()!=SLoS)
Написать:
if(OrderStopLoss()> SLoS || OrderStopLoss()< SLoS)
строку
if(OrderStopLoss()!=SLoS){
заменил на
if(NormalizeDouble(OrderStopLoss(),digits)!=SLoB){
и всё заработало. Я в шоке
if(OrderStopLoss()!=SLoS){
заменил на
if(NormalizeDouble(OrderStopLoss(),digits)!=SLoB){
и всё заработало. Я в шоке
Ни когда ранее не приходилось так изголяться.
Roger:
SLoS=NormalizeDouble(SLoS,digits);//вот тут ты пронормализовал
RefreshRates();//а это здесь вообще не нужно т.к. не сработает
if(OrderStopLoss()!=SLoS){//а вот тут забыл пронормализовать OrderStopLoss()
SLoS=NormalizeDouble(SLoS,digits);//вот тут ты пронормализовал
RefreshRates();//а это здесь вообще не нужно т.к. не сработает
if(OrderStopLoss()!=SLoS){//а вот тут забыл пронормализовать OrderStopLoss()
Да, можно попробывать и так, но у меня в стопах так (ненормализованно):
if(OrderStopLoss()<NormalizeDouble(Bid-Point*TrailingStop, Digits))И ошибки нет.
drknn:
строку
if(OrderStopLoss()!=SLoS){
заменил на
if(NormalizeDouble(OrderStopLoss(),digits)!=SLoB){
и всё заработало. Я в шоке
строку
if(OrderStopLoss()!=SLoS){
заменил на
if(NormalizeDouble(OrderStopLoss(),digits)!=SLoB){
и всё заработало. Я в шоке
Ни когда ранее не приходилось так изголяться.
Ну и хорошо что работает. Я вот только перед началом Чемпионата узнал что нужно всё это дело нормализовывать. Сам офигевал, а щас привык. :)
И ошибки нет.
До поры, пока значения сильно различаются. А при ловле блох даст
о себе знать.
Roger:
SLoS=NormalizeDouble(SLoS,digits);//вот тут ты пронормализовал
RefreshRates();//а это здесь вообще не нужно т.к. не сработает
if(OrderStopLoss()!=SLoS){//а вот тут забыл пронормализовать OrderStopLoss()
SLoS=NormalizeDouble(SLoS,digits);//вот тут ты пронормализовал
RefreshRates();//а это здесь вообще не нужно т.к. не сработает
if(OrderStopLoss()!=SLoS){//а вот тут забыл пронормализовать OrderStopLoss()
Спасибо всем, что откликнулись. Я пишу не для чемпионата, но работа
ответственная, поэтому приходится каждую буквочку учитывать.
Roger, по поводу RefreshRates() - эта команда тут на своём месте - я не показал в коде, что там цикл пробегает по массиву тикетов и выбирает для модификации ордер за ордером. Если цикл не успеет закончиться, а новый тик уже пришёл, то без команды RefreshRates() тут не обойтись.
Вот ещё что хотел сказать. Новости в терминале отколючил в настройках, а они всёравно приходят. :) Мне-то фиолетово - у меня безлимит, а кому-то это не нужно и у него траф съедает.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот участок кода, иллюстрация работы которого представлена ниже.
Вот иллюстрация того, как сработал код в тестереКак видно из кода, сначала мы выбираем ордер с заданным тикетом. Если ордер нормально выбран и при этом если стоп-лосс ордера не равен тому значению, которое мы рассчитали и нормализовали, то происходит модификация - перемещаем стоп-лосс в рассчитанную точку.
Снятие дампа данных показало, что OrderStopLoss() и рассчётная величина SLoS равны между собой. Однако терминал их не распознаёт как равные и пытается модифицировать стоп-лосс заново, хотя это уже и не нужно.
В силу того, что рассчётная величина нормализована, может нужно после вызова функции OrderStopLoss() проводить нормализацию и возвращаемого ею значения?
На счёт переменной digits можно не волноваться - там выше по коду я написал следующее:
// ------- Вспомогательные переменные ---------
string SMB;
int digits;
// ---- Инициализация советника -----------
int init(){
SMB=Symbol();
digits=MarketInfo(SMB,MODE_DIGITS);
........
Поясните пожалуйста сей глюк работы терминала (билд 211).