Как проверить Stop Loss

 
Столкнулся с проблемой очень маленького SL. Ситуация когда советник неможет его выставить, если он очень маленький и цена пошла в его сторону. Ордер остается без SL. Как решить эту проблему, тем чтобы поисходила проверка установки SL и при его отсутствии сделка закрывалась?
 

Сравнивать текущую цену и стоплевел:

double SL = ... // расчет стопа

double StopLevel = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point, Digits);

// для BUY
if (NormalizeDouble(Bid - SL, Digits) >= StopLevel)
  {
   // можно открывать позу
  }

// для SELL
if (NormalizeDouble(SL - Ask, Digits) >= StopLevel)
  {
   // можно открывать позу
  }
 
Дело в том, что в большинстве случаев советник выставляет SL, но иногда из-за резкого движения цены он не успевает его выставить и такие ордера приносят большие убытки. Необходимо лишь их мининизировать - закрыть ордер при отсутствии SL. При все остальном советних довольно прибыльный.
 
не может такого быть. если не удается выставить SL, то OrderSend возвращает -1
 

когда исполнение ордеров идет по рынку - сначала открывается ордер, после устанавливается SL и TP. Если бы у моего брокера можно было бы с открытием ордера выставлять SL и TP, проблемы бы не было.

 
Kishar >>:
Дело в том, что в большинстве случаев советник выставляет SL, но иногда из-за резкого движения цены он не успевает его выставить и такие ордера приносят большие убытки. Необходимо лишь их мининизировать - закрыть ордер при отсутствии SL. При все остальном советних довольно прибыльный.

Вы сами себе противоречите. Как выставить стоп - так советник не может, потому как сильное движение. А вот закрыть позицию почему то получается и сильное движение этому не мешает.

Кстати, в качестве выхода из ситуации - вместо рыночных ордеров используйте отложенные. В отложенных ордерах можно сразу устанавливать стопы и тейки.

 
Kishar >>:

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

.. когда исполнение ордеров идет по рынку - сначала открывается ордер, после устанавливается SL и TP.

А как устанавливается SL? Через OrderModify? Вот и ответ. Анализируйте возврат GetLastError и принимайте решение либо повторяйте OrderModify с измененным SL, либо OrderClose.

 

Немного алгоритмически подойти к вопросу выставления...

*

Разбиваем на два этапа:

1. быстро выставить ордер, точнее открыть позицию

тут понятное дело не терпит отлагательств и промедления.

2. Уже не спеша (с точки зрения терминала ;) выставить стопы

буквально следующими строками кода...

Цена только что открытой позы нам известна, поэтому после проверки условия на близость долбим стопы

выставляя их пока не выставяться либо прервать скажем после пяти попыток, ибо п.3

3. Ну не успели выставить значит не успели... судьба такой

Бросаем как есть либо расширяем уровни стопов...

*

Впрочем и этого более простого варианта пока вполне хватает:

// Скрипт 0-БАЙ.mq4 --------------------------------+
#property show_inputs
 
extern double Lots=1;
extern int StopLoss=20;
extern int TakeProfit=20;
 
int start()
{
 double loss=0, profit=0;
 if (StopLoss>0) loss=Ask-StopLoss*Point; 
 if (TakeProfit>0) profit=Ask+TakeProfit*Point;
 int ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
 if (ticket==-1) Print ("Ошибка = ",GetLastError());
 else
 {
  if (!OrderSelect(ticket,SELECT_BY_TICKET)) Print ("Ошибка = ",GetLastError());
  else if (!OrderModify(ticket,OrderOpenPrice(),loss,profit,0)) Print ("Ошибка = ",GetLastError());
 }
 return(0); 
}
//-----------------------------------------------------------+ 
спасибо товарищу Херургу!
 
kombat >>:

Немного алгоритмически подойти к вопросу выставления...

Полностью согласен. У такого подхода (в любом случае выставлять нулевые стоп и профит) есть очевидный плюс - после открытия мы можем точно выставить профит и стоп на необходимое количество пунктов. Когда мы выставляем их сразу при открытии, то из-за реквотов можем получить небольшое несоответствие желаемому соотношению профита и стопа.

А возгласы типа "так ведь цена взяла и ушла!" - оставить на память "трейдерам", которые входят в рынок на полдепо и больше.

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