Нужна помощь с ошибкой #130 недействительный стоплосс

 
Уважаемый форум,

Я видел, что многие на форуме борются с этой ошибкой.
Как я понял из других тем, ошибка может быть вызвана следующими причинами
a: установка значения стоплосса слишком близко к текущей цене
b: неправильное количество цифр после 0.

Что касается a:
Как я понял. MarketInfo(Symbol(), MODE_STOPLEVEL)) должен дать мне минимальное расстояние, которое должен иметь стоплосс.
Вот пример неудачной сделки:

Marekt Info:
Дата: 2011/9/15 16:31
Символ: #ESU1
Уровень стопа: 75.00000000
Точка: 0.01000000
Размер тика: 0.25000000
Значение тика: 12.50000000
Цифры: 2.00000000

Таким образом, минимальное расстояние должно быть стоп-уровень * точка, верно? Значит, 0.75.
Итак, вот мой неудачный ордер:
2011.09.15 16:32:07 '393930': order sell 18.00 #ESU1 opening at 1201.00 sl: 1202.35 tp: 0.00 failed [Invalid S/L or T/P].
Ошибка: 130 / недействительные стопы

стоплосс находится на расстоянии 1.35 от открытия. Так что все должно быть в порядке. Цифры (b) также совпадают.
Так почему же я получаю эту ошибку?

Кроме того, эту ошибку трудно воспроизвести. Иногда она появляется. Иногда нет.
Иногда она появляется несколько раз друг за другом.

Есть идеи?
Заранее спасибо!

шиноби
 
Каким был спред в точное время, когда произошла эта ошибка?
 

вы можете сделать ошибку в коде и использовать RefreshRates().

Я не знаю, как это сделать, но, возможно, вы можете сделать что-то вроде этого.

if(Trade==fase)

{

int ErrorCode= GetLastError();

if (ErrorCode=130)

{

RefreshRates();

}

}

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

Также, если вы еще не сделали это, используйте функцию NormalizeDouble для округления чисел.

 
35806:

вы можете сделать случай ошибки в своем коде и использовать RefreshRates()

Как это поможет?
 
RaptorUK:
Как это поможет?

Это может быть временной проблемой. Он сказал, что это зависит от регистра, поэтому обновление тарифов может исправить это.
 
35806:

это может быть временной проблемой. он сказал, что это зависит от регистра, поэтому обновление тарифов может исправить это.
Мы не видели никакого кода. Если он не использует никаких предопределенных переменных, никакое количество RefreshRates не поможет.
 

правда.

 
Спасибо за ваши мысли.

Raptor, я не знаю спред для торговли выше. Я добавил вывод журнала в код, и в следующий раз, когда произойдет ошибка, я смогу сказать вам спред.
Но не могли бы вы сказать мне, почему спред важен? Каким образом я должен учитывать спред при определении стоплосса?

Я посылаю ордер, например, так:
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);

Таким образом, единственной предопределенной переменной, которую я использую при отправке ордеров, является: Ask
SLIPPAGE и TAKEPROFIT равны 0.
EXPERT_ID - некоторое уникальное магическое число
position_size - целое число, например, 3
initial_stop - мой стоплосс, который (в случае примера выше) Bid - risk.
Риск - это значение больше, чем (MODE_STOPLEVEL * Point), в случае со сделкой в первом посте. Риск был: 1.35
 
shinobi:
Спасибо за ваши мысли.

Raptor, я не знаю спред для торговли выше. Я добавил в код вывод лога, в следующий раз, когда произойдет ошибка, я смогу сказать вам спред.
Но не могли бы вы сказать мне, почему спред важен? Каким образом мне нужно учитывать спред при определении стоплосса?


Молодец, что добавил печать в журнал на будущее:-)

Мне всегда приходится долго и упорно думать о том, где нужно учитывать Spread, а где нет... Кажется, у меня есть ментальный блок, когда это касается... но я думаю, что все правильно.

Для покупки это не должно иметь значения, покупка происходит по Ask, SL произойдет по Bid, так что спред уже учтен в вашей OpenPrice. Для продажи дело обстоит иначе... вы продаете по Bid, и ваш SL будет взят по цене Ask... где цена Ask? ну, это зависит от спреда в то время... Я думаю, что это правильно, пожалуйста, подумайте об этом и посмотрите, имеет ли это смысл... Я буду рад, если меня поправят, если я ошибаюсь... :-)

 
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
Советники должны подстраиваться под 4/5-значных брокеров, TP, SL и проскальзывание. На ECN-брокерах вы должны открыть и ПОТОМ установить стопы.
//++++ These are adjusted for 5 digit brokers.
int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int     init(){
     if (Digits % 2 == 1){      // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//---- These are adjusted for 5 digit brokers.
    /* On ECN brokers you must open first and THEN set stops
    int ticket = OrderSend(...)
    if (ticket < 0)
       Alert("OrderSend failed: ", GetLastError());
    else if (!OrderSelect(ticket, SELECT_BY_POS))
       Alert("OrderSelect failed: ", GetLastError());
    else if (!OrderModify(OrderTicket()...)
       Alert("OrderModify failed: ", GetLastError());
     */
 
35806:

это может быть временной проблемой. он сказал, что это зависит от регистра, поэтому обновление тарифов может исправить это.
AFAIK RefreshRates() не имеет никакого отношения к ошибке 130.