Error 130, invalid stops

 

Здравствуйте,


Подскажите пожалуйста, где может быть ошибка у меня в коде.

Я пытаюсь открыть позицию, но получаю ошибку 130 - invalid stops.

Вот код:


iTicket = OrderSend(Symbol(), OP_BUY, e_dLotSize, NormalizeDouble(Ask, Digits), 10, 0.0,
NormalizeDouble(dMABidMain + dSpreadCurr * e_dTakeProfitInSpreads, Digits));
if (iTicket > 0)
{
Print(g_strInf, "Opened new BUY positions #", iTicket,
", Ask=", DoubleToStr(Ask, Digits),
", Bid=", DoubleToStr(Bid, Digits),
", OpenPrice=", DoubleToStr(Ask, Digits),
", TakeProfit=", DoubleToStr(dMABidMain + dSpreadCurr * e_dTakeProfitInSpreads, Digits),
", LotSize=", e_dLotSize
);
}
else
{
iErrorCode = GetLastError();
dNewStopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
dNewFreezeLevel = MarketInfo(Symbol(), MODE_FREEZELEVEL);
Print(g_strErr, "Failed to open new BUY position",
", NewStpLvl=", DoubleToStr(dNewStopLevel, Digits),
", NewFrzLvl=", DoubleToStr(dNewFreezeLevel, Digits),
", Ask=", DoubleToStr(Ask, Digits),
", Bid=", DoubleToStr(Bid, Digits),
", OpenPrice=", DoubleToStr(Ask, Digits),
", TakeProfit=", DoubleToStr(dMABidMain + dSpreadCurr * e_dTakeProfitInSpreads, Digits),
", LotSize=", e_dLotSize,
", ErrCode=", iErrorCode, ", ", ErrorDescription(iErrorCode)
);
}


Вот логи:


ERR Failed to open new BUY position, NewStpLvl=0.00000, NewFrzLvl=0.00000, Ask=1.26506, Bid=1.26432, OpenPrice=1.26506, TakeProfit=1.26573, LotSize=0.1, ErrCode=130, invalid stops

Видно, что пытаюсь купить по цене Ask. TakeProfit поставлен вроде правильно. И все равно не срабатывает. Может, я где-нибудь Bid/Ask перепутал?

Грешил на StopLevel, но он нулевой. Может нельзя выставлять уровень Take Profit одновременно с открытием позиции?

Как узнать в чем проблема?

Можно предположить, что с момента получения тика цены Bid/Ask изменились, но ведь тогда ошибка должна быть уже другой, верно?

Или нельзя не указывать stop loss (ставить нулевым) при задании take profit?


Спасибо.

 

"В случае, если программа пытается изменить положение стоп-приказа так, что он оказывается ближе к рынку, чем на минимально допустимую дистанцию, то такой торговый приказ будет отклонён клиентским терминалом, и исполнение функции OrderModify() закончится неудачей (ошибка 130). Поэтому в программе обязательно должен быть предусмотрен блок вычислений, учитывающий это ограничение."


Поиск в помощь.

 

сделайте так

double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
tp=NormalizeDouble(MathMax(dMABidMain+dSpreadCurr*e_dTakeProfitInSpreads, Bid+StopLvl), Digits)
 
sergeev >>:

сделайте так


Спасибо, попробую.

Но все равно не понимаю. Я смотрю на значение MODE_STOPLEVEL в логах и оно нулевое (NewStpLvl=0.00000). И значение выражения (dMABidMain+dSpreadCurr*e_dTakeProfitInSpreads) я тоже вывожу в лог (TakeProfit=1.26573) и видно, что оно больше Bid (Bid=1.26432).

Что, от момента вызова функции OrderSend до вызова dNewStopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); значение StopLevel может измениться с ненулевого на нулевое?

 
bvg77 писал(а) >>

Спасибо, попробую.

Но все равно не понимаю. Я смотрю на значение MODE_STOPLEVEL в логах и оно нулевое (NewStpLvl=0.00000). И значение выражения (dMABidMain+dSpreadCurr*e_dTakeProfitInSpreads) я тоже вывожу в лог (TakeProfit=1.26573) и видно, что оно больше Bid (Bid=1.26432).

Что, от момента вызова функции OrderSend до вызова dNewStopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); значение StopLevel может измениться с ненулевого на нулевое?

Не верь глазам своим.

 
bvg77 >>:

Спасибо, попробую.

Но все равно не понимаю. Я смотрю на значение MODE_STOPLEVEL в логах и оно нулевое (NewStpLvl=0.00000). И значение выражения (dMABidMain+dSpreadCurr*e_dTakeProfitInSpreads) я тоже вывожу в лог (TakeProfit=1.26573) и видно, что оно больше Bid (Bid=1.26432).

Что, от момента вызова функции OrderSend до вызова dNewStopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); значение StopLevel может измениться с ненулевого на нулевое?


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

Я так понимаю у вас Broco или FXCM?
 
sergeev >>:


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

Я так понимаю у вас Broco или FXCM?

fxcm

спасибо за подсказку. буду проверять.

Причина обращения: