Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
еще есть очень небольшой пустячок но почти всегда помогает бороться с подобными ошибками, необходимо цену перед запросом нормализовать, я обычно это делаю так
Насколь мне известно, но Ask и Bid - нормализованные цены. Вот если, например, Ask+Delta*Point(), то да, нужно нормализовать. Т.е., если цена торгового запроса является расчётной, то нужна нормализация.
Не факт, если не ошибаюсь то сами разрабы писали что могут проскочить не нормализованные цены, да и в документации написано
Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке, либо запрашиваемая цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). Если же запрашиваемая цена устарела, но еще присутствует в ценовом потоке, то ордер открывается по текущей цене и только в том случае, если текущая цена попадает в диапазон price+-slippage.
Не факт, если не ошибаюсь то сами разраьы писали что могут проскачить не нормализованные цены, да и в документации написано
Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке, либо запрашиваемая цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). Если же запрашиваемая цена устарела, но еще присутствует в ценовом потоке, то ордер открывается по текущей цене и только в том случае, если текущая цена попадает в диапазон price+-slippage.
Не факт, если не ошибаюсь то сами разрабы писали что могут проскочить не нормализованные цены, да и в документации написано
...
В МТ4 - вроде как нельзя взять другой символ. Но, суть в том, что в тестере-то все проходит.
Цены берутся непосредственно перед приказом:
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 значения (цена может измениться к моменту приказа на закрытие ордера по многим причинам, соответственно будем иметь неправильную цену), т.е. лучше так:
В Сервисдеске предложили также проскальзывание увеличить.
Поставлю 50 пунктов (5-разрядных), и, действительно, NormalizeDouble() вставлю в запросе цены... Хотя, казалось бы - прямой запрос должен возвращать нормализованную цену...
Не ломайте голову, у меня то же самое в Альпари на счетах Standard, Demo (и Nano тоже, только реже, число знаков в котировках в 10 раз меньше). Весь свой код перерыл и документацию, всё OK. Проскальзывание никак не влияет. И хоть занормализуй на 100 раз все биды и аски - то же самое. А в тестере всё хорошо, никаких 129.
Поэтому закрываю ордера в цикле с RefreshRates() до успешного закрытия.
Глобальные эксперименты не ставил, но вроде как чем интернет-соединение тормознее (пинг до брокера дольше и нестабильнее), тем чаще эта ошибка. Или когда котировки начинают скакать на новостях очень часто, а нужно несколько ордеров сразу закрыть (в цикле).
Это я про MT4 в Альпари, MT5 у них я не дождался.
до закрытия что-то наверное долго считаете - цена уходит. Дёрните RefreshRates()
Не ломайте голову, у меня то же самое в Альпари на счетах Standard, Demo (и Nano тоже, только реже, число знаков в котировках в 10 раз меньше). Весь свой код перерыл и документацию, всё OK. Проскальзывание никак не влияет. И хоть занормализуй на 100 раз все биды и аски - то же самое. А в тестере всё хорошо, никаких 129.
Поэтому закрываю ордера в цикле с RefreshRates() до успешного закрытия.
Глобальные эксперименты не ставил, но вроде как чем интернет-соединение тормознее (пинг до брокера дольше и нестабильнее), тем чаще эта ошибка. Или когда котировки начинают скакать на новостях очень часто, а нужно несколько ордеров сразу закрыть (в цикле).
Это я про MT4 в Альпари, MT5 у них я не дождался.
Цены запрашиваются перед закрытием каждого ордера.
И, закрытие, повторю, происходит ночью, при спокойном рынке - новостей никаких нет.
Эх....
Не хочется повторять приказы при ошибке... С закрытием - еще полбеды, здесь можно "долбить" пока не закроется. А открытие если ? Отослали приказ - ошибка. Отослали еще - ошибка... Через десять приказов - открылись сразу десять ордеров...
Цены запрашиваются перед закрытием каждого ордера.
И, закрытие, повторю, происходит ночью, при спокойном рынке - новостей никаких нет.
Эх....
Не хочется повторять приказы при ошибке... С закрытием - еще полбеды, здесь можно "долбить" пока не закроется. А открытие если ? Отослали приказ - ошибка. Отослали еще - ошибка... Через десять приказов - открылись сразу десять ордеров...