Ошибка 129 при OrderClose() - кто виноват и что делать ? - страница 3

 
Sergey Gritsay:

еще есть очень небольшой пустячок но почти всегда помогает бороться с подобными ошибками, необходимо цену перед запросом нормализовать, я обычно это делаю так

 

Насколь мне известно, но Ask и Bid - нормализованные цены. Вот если, например, Ask+Delta*Point(), то да, нужно нормализовать. Т.е., если цена торгового запроса является расчётной, то нужна нормализация.
 
Artyom Trishkin:
Насколь мне известно, но Ask и Bid - нормализованные цены. Вот если, например, Ask+Delta*Point(), то да, нужно нормализовать. Т.е., если цена торгового запроса является расчётной, то нужна нормализация.

Не факт, если не ошибаюсь то сами разрабы писали что могут проскочить не нормализованные цены, да и в документации написано

 Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке, либо запрашиваемая цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). Если же запрашиваемая цена устарела, но еще присутствует в ценовом потоке, то ордер открывается по текущей цене и только в том случае, если текущая цена попадает в диапазон price+-slippage.

 
Sergey Gritsay:

Не факт, если не ошибаюсь то сами разраьы писали что могут проскачить не нормализованные цены, да и в документации написано

 Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке, либо запрашиваемая цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). Если же запрашиваемая цена устарела, но еще присутствует в ценовом потоке, то ордер открывается по текущей цене и только в том случае, если текущая цена попадает в диапазон price+-slippage.

Сергей, ну можно поверить что один раз в переменной Bid или Ask будет не нормализованная цена или лучше сказать с какой-то машинной погрешностью, но ведь в теме написано что ошибка обрабатывается после чего рефреш и повтор попытки. Или ты думаешь что у брокера чуть-ли не каждая цена с такими тараканами? И ещё, речь идёт об открытии или закрытии ордера. Соответственно никакой расчётной цены быть не может.
 
Sergey Gritsay:

Не факт, если не ошибаюсь то сами разрабы писали что могут проскочить не нормализованные цены, да и в документации написано

 ...

Дайте почитать ссылочку от разрабов, если не сложно. Нужно освежить мою память ;)
 
George Merts:
В МТ4 - вроде как нельзя взять другой символ. Но, суть в том, что в тестере-то все проходит.
Почему же - нельзя? Можно. Разве что если речь о тестере.
 
George Merts:

Цены берутся непосредственно перед приказом:

     if(OrderType() == OP_BUY)
         dClosePrice = MarketInfo(OrderSymbol(),MODE_BID); // Раньше было dClosePrice = Bid
      else     
         dClosePrice = MarketInfo(OrderSymbol(),MODE_ASK); // Раньше было dClosePrice = Ask

      ResetLastError();
     
      if(OrderClose(iCloseTicket,dOrderLots,dClosePrice,(int)ulSlippage,CLR_NONE) != true)
         {
         int iError = GetLastError();
         TRACE_INTEGER("Не удалось удалить ордер, тикет: ",iCloseTicket);
         TRACE_INTEGER("Код ошибки: ",iError);
         Print("Can't close order, ticket: ",iCloseTicket);
         Print("Error code: ",iError);
         Print("Current Bid: ",Bid);
         Print("Current Ask: ",Ask);
         Print("Close price: ",dClosePrice);
         Print("Volume: ",dOrderLots);
         return(false);
         };

Пока - разница только в запросе самих цен. Если Bid-Ask может содержать не те цены, что в MarketInfo() - безусловно, тут может быть ошибка 129

********************

Ошибка 129: "Неправильная цена bid или ask, возможно, ненормализованная цена."

Попробуйте без присвоения переменной dClosePrice значения (цена может измениться к моменту приказа на закрытие ордера по многим причинам, соответственно будем иметь неправильную цену), т.е. лучше так:

if (OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),2);//close BUY
if (OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),2);//close SELL
 
George Merts:

В Сервисдеске предложили также проскальзывание увеличить.

Поставлю 50 пунктов (5-разрядных), и, действительно, NormalizeDouble() вставлю в запросе цены... Хотя, казалось бы - прямой запрос должен возвращать нормализованную цену...

Не ломайте голову, у меня то же самое в Альпари на счетах Standard, Demo (и Nano тоже, только реже, число знаков в котировках в 10 раз меньше). Весь свой код перерыл и документацию, всё OK. Проскальзывание никак не влияет. И хоть занормализуй на 100 раз все биды и аски - то же самое. А в тестере всё хорошо, никаких 129.

Поэтому закрываю ордера в цикле с RefreshRates() до успешного закрытия.

Глобальные эксперименты не ставил, но вроде как чем интернет-соединение тормознее (пинг до брокера дольше и нестабильнее), тем чаще эта ошибка. Или когда котировки начинают скакать на новостях очень часто, а нужно несколько ордеров сразу закрыть (в цикле).

Это я про MT4 в Альпари, MT5 у них я не дождался.

 
Maxim Kuznetsov:
до закрытия что-то наверное долго считаете - цена уходит. Дёрните RefreshRates()
Даа тыы чтоо? Да неужели?
 
Sergey Basov:

Не ломайте голову, у меня то же самое в Альпари на счетах Standard, Demo (и Nano тоже, только реже, число знаков в котировках в 10 раз меньше). Весь свой код перерыл и документацию, всё OK. Проскальзывание никак не влияет. И хоть занормализуй на 100 раз все биды и аски - то же самое. А в тестере всё хорошо, никаких 129.

Поэтому закрываю ордера в цикле с RefreshRates() до успешного закрытия.

Глобальные эксперименты не ставил, но вроде как чем интернет-соединение тормознее (пинг до брокера дольше и нестабильнее), тем чаще эта ошибка. Или когда котировки начинают скакать на новостях очень часто, а нужно несколько ордеров сразу закрыть (в цикле).

Это я про MT4 в Альпари, MT5 у них я не дождался.

Цены запрашиваются перед закрытием каждого ордера.

И, закрытие, повторю, происходит ночью, при спокойном рынке - новостей никаких нет.

Эх....

Не хочется повторять приказы при ошибке... С закрытием - еще полбеды, здесь можно "долбить" пока не закроется. А открытие если ?  Отослали приказ - ошибка. Отослали еще - ошибка... Через десять приказов - открылись сразу десять ордеров...

 
George Merts:

Цены запрашиваются перед закрытием каждого ордера.

И, закрытие, повторю, происходит ночью, при спокойном рынке - новостей никаких нет.

Эх....

Не хочется повторять приказы при ошибке... С закрытием - еще полбеды, здесь можно "долбить" пока не закроется. А открытие если ?  Отослали приказ - ошибка. Отослали еще - ошибка... Через десять приказов - открылись сразу десять ордеров...

Были как-то проблемы в 129, в эксперте в норм, помогла переустановка терминала.
Причина обращения: