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

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