Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересуют возможности MetaTrader 5? Загляни и узнай!
Alexei Kharchenko
1367
Alexei Kharchenko 2008.04.14 10:14 

При модификации ордера


OrderModify(OrderTicket(),MinBig-Point,SL,TP,OrderComment(),CLR_NONE);

тестер выдает следующее сообщение:

2008.04.14 11:04:14 2007.01.02 08:24 Proboi Channels1 GBPJPY,M1: OrderModify error 1
2008.04.14 11:04:14 2007.01.02 08:24 Proboi Channels1 GBPJPY,M1: invalid integer number as parameter 5 for OrderModify function

Почему ругается на 5 параметр в функции OrderModify? Ведь комментарии я не меняю...

Комментарий это число преобразованное в строку OrderComment()=DoubleToStr(i,0)...

Что не так?... Подскажите...

Левитин Сергей В.
5155
Левитин Сергей В. 2008.04.14 10:21  
kharko:

Что не так?... Подскажите...

bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)

Где Вы тут вообще коммент углядели?

Alexei Kharchenko
1367
Alexei Kharchenko 2008.04.14 10:28  
Figar0:
kharko:

Что не так?... Подскажите...

bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)

Где Вы тут вообще коммент углядели?

Сенкс... Тормознул....

тему можно удалить

Владимир Иванов
498
Владимир Иванов 2014.01.06 16:09  

Здравствуйте. Столкнулся с неприятной ситуацией. Помогите разобраться.

Есть советник. В тестере работает отлично, не каких претензий. А вот запускаешь на демке и к некоторым ордерам советник не может выставить стопы. Есть некая ошибка, которая проявляется не всегда, временами. Найти ее самостоятельно отчаялся, надеюсь на Вашу помощь. При этом замечу во всем остальном советник работает безупречно, как и в тестере не каких претензий, только вот беда, что не всегда устанавливаются стопы. Ошибка проявляется у разных брокеров на разных счетах. Привожу часть кода, отвечающую за торговые операции

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {
  //---- обновление инфы
  OrderSelect(ord_ticket,SELECT_BY_TICKET);
  ord_openpr=OrderOpenPrice();
  ZigZagInfo[0][ZZ_TimeP]=t_cur;
  ZigZagInfo[k][ZZ_TryCount]++;
  //---- проверка стопов
  if(ND(a*(ord_tp-ord_openpr)-stops,Digits)<0) ord_tp=ND(ord_openpr+a*stops,Digits); 
  if(ND(a*(ord_openpr-ord_sl)-stops,Digits)<0) ord_sl=ND(ord_openpr-a*stops,Digits);
  //---- время удаления
  if(TimeDelete>0) td=TimeCurrent()+60*TimeDelete;
  else td=0;
  //----
  if(!OrderModify(ord_ticket,ord_openpr,ord_sl,ord_tp,td)) {
    Alert(Error(GetLastError()),"/nSL=",DoubleToStr(ord_sl,5)," TP=",DoubleToStr(ord_tp,5),"/nTimeDel=",TimeToStr(td),
          "OP=",DoubleToStr(ord_openpr,5));
  }
}

Вот код функции Error(int er)

string Error(int er) {
  switch(er) {
    case 0:   return("Нет ошибки");
    case 1:   return("Нет ошибки, но результат неизвестен");
    case 2:   return("Общая ошибка(сбой системы, глюк, и т.п.)");
    case 3:   return("Неправильные параметры");
    case 4:   return("Торговый сервер занят");
    case 6:   return("Нет связи с торговым сервером");
    case 7:   return("Недостаточно прав");
    case 8:   return("Слишком частые запросы");
    case 9:   return("Недопустимая операция нарушающая функционирование сервера");
    case 128: return("Истек срок ожидания совершения сделки");
    case 129: return("Неправильная цена");
    case 130: return("Неправильные стопы");
    case 131: return("Неправильный объем");
    case 133: return("Торговля запрещена");
    case 134: return("Недостаточно денег для совершения операции");
    case 135: return("Цена изменилась");
    case 137: return("Брокер занят");
    case 138: return("Новые цены");
    case 139: return("Ордер заблокирован и уже обрабатывается");
    case 140: return("Разрешена только покупка");
    case 141: return("Слишком много запросов");
    case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
    case 146: return("Подсистема торговли занята");
    case 147: return("Использование даты истечения ордера запрещено брокером");
    case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
    case 149: return("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");
    default:  return("Неизвестная ошибка "+DoubleToStr(er,0));
  }
}

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

Загадкаеще одна

khorosh
8044
khorosh 2014.01.06 17:14  
_Vladimir_:

Здравствуйте. Столкнулся с неприятной ситуацией. Помогите разобраться.

Есть советник. В тестере работает отлично, не каких претензий. А вот запускаешь на демке и к некоторым ордерам советник не может выставить стопы. Есть некая ошибка, которая проявляется не всегда, временами. Найти ее самостоятельно отчаялся, надеюсь на Вашу помощь. При этом замечу во всем остальном советник работает безупречно, как и в тестере не каких претензий, только вот беда, что не всегда устанавливаются стопы. Ошибка проявляется у разных брокеров на разных счетах. Привожу часть кода, отвечающую за торговые операции

Вот код функции Error(int er)

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

Почему не проверяете прошла ли селекция ордера перед модификацией успешно? Обычно делается так:

if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp);//здесь использована функция модификации KimIV

Пользуйтесь функциями KimIV и у вас не будет проблем. Зачем изобретать свой велосипед с квадратными колёсами?

У него кстати есть и функция открытия ордера, которая открывает ордер без стопов и тейков, а потом этот ордер модифицирует устанавливая стоп и тейк.

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий