Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Приветствую всех.
Во время попытки закрытия ордера - возвращается код 129. "Неправильная цена". Хотя, в тестере - всегда все проходит нормально, и если перезапустить советник - то тоже все проходит нормально.
В чем причина, и что делать ?
Закрытие происходит по паре евродоллара в два часа ночи, когда рынок спокоен. Параметр slippage устанавливаю 10 пунктов. Но уже несколько раз происходит возврат этой ошибки (и при этом все нормально проходит при перезапуске).
Что порекомендуете, друзья ?
Если во время цикла на очередном тике, советник выполняет много вычислений, то он может пропустить очередной тик. Таким образом его торговое окружение, а с ним и Bid с Ask, будут не соответствовать текущему. Поэтому всегда нужно брать актуальные цены перед выполнением торгового приказа.
Цены берутся непосредственно перед приказом:
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
Это 100% проделки брокера. Избежать этого на счетах standart не получится.
Нужно либо уходить на ECN-счета, либо отправлять повторный приказ на закрытие, при получении подобных ошибок.
Цены берутся непосредственно перед приказом:
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
Разница подходов очевидна. Так, если OrderSymbol() - не текущий символ, то Вы брали не те Bid и Ask. Получаем, что все закономерно - ошибка генерировалась правильно.
Бот работает только на текущем символе, цены обновляются (RefreshRates) и, если надо, корректируются непосредственно перед отправкой запроса, результат тот же - #129. Вот наглядный образец из лога с комментами от бота
Как видите, Bid и Ask обновляются, заданное проскальзывание с лихом перекрывает разницу меж ценой заказа и актуальной ценой и один хрен #129. Здесь Buy открылся с 3й попытки, на Sell разрешённых 3х не хватило
Это 100% проделки брокера. Избежать этого на счетах standart не получится.
Нужно либо уходить на ECN-счета, либо отправлять повторный приказ на закрытие, при получении подобных ошибок.
Разница подходов очевидна. Так, если OrderSymbol() - не текущий символ, то Вы брали не те Bid и Ask. Получаем, что все закономерно - ошибка генерировалась правильно.
Да, на ECN-счетах такого ни разу не было.
Естественно, ведь на ECN-счетах маркет исполнение, т.е. по рынку. Вы отправляете маркет ордер без цены и он исполняется по цене существующей на данный момент на рынке. А на счетах standart исполнение по потоковым ценам. Вы отсылаете маркет ордер с указанием цены открытия. И если цена на рынке отличается от цены, указанной в ордере, то Вы вместо открытия ордера получаете ошибку 129 -"неправильная цена". Поэтому я и предложил либо перейти на маркет исполнение (счет ECN), либо, при получении ошибки 129, отправлять повторный приказ.
Третьего не дано. :)
Цены берутся непосредственно перед приказом:
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
еще есть очень небольшой пустячок но почти всегда помогает бороться с подобными ошибками, необходимо цену перед запросом нормализовать, я обычно это делаю так
еще есть очень небольшой пустячок но почти всегда помогает бороться с подобными ошибками, необходимо цену перед запросом нормализовать, я обычно это делаю так
В Сервисдеске предложили также проскальзывание увеличить.
Поставлю 50 пунктов (5-разрядных), и, действительно, NormalizeDouble() вставлю в запросе цены... Хотя, казалось бы - прямой запрос должен возвращать нормализованную цену...