Стоп Лосс

 

Доброго времени суток!

Столкнулся с такой проблемой:

По идее когда открывается ордер, в том же направлении выставляются отложенные ордера. Стопы для обычного и отложенного ордера разные, но отложенный ордер либо не открывается(ошибка 130), либо стоп лосс и тейк профит ставится с непонятными значениями.

Как решить данную проблему?

if ( (SMMA1<MA28_1))        
           {
            ticket=OrderSend(NULL,OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
            "EMA position:",16384,0,Green);
            for(i=stop_positions;i>=0; i--)
            {
          
       open_step_2=open_step_2+Open_Step;
       ticket2=OrderSend(Symbol(),OP_BUYSTOP, Lots2, Ask+open_step_2*Point,2,(Ask+open_step_2)-SL*Point,(Ask+open_step_2)+TP*Point,"take_trend",MagicNumber2,0,Blue);


 

 
Filya1212:

Доброго времени суток!

Столкнулся с такой проблемой:

По идее когда открывается ордер, в том же направлении выставляются отложенные ордера. Стопы для обычного и отложенного ордера разные, но отложенный ордер либо не открывается(ошибка 130), либо стоп лосс и тейк профит ставится с непонятными значениями.

Как решить данную проблему?

if ( (SMMA1<MA28_1))        
           {
            ticket=OrderSend(NULL,OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
            "EMA position:",16384,0,Green);
            for(i=stop_positions;i>=0; i--)
            {
          
       open_step_2=open_step_2+Open_Step;
       ticket2=OrderSend(Symbol(),OP_BUYSTOP, Lots2, Ask+open_step_2*Point,2,(Ask+open_step_2)-SL*Point,(Ask+open_step_2)+TP*Point,"take_trend",MagicNumber2,0,Blue);


возможно,ошибка 130, это слишком близко поставленный ордер к цене, в основном 30пп, брокер исполняет ордера по Instant Execution 

 
Спасибо, поменял шаг выставления отложников, но тем не менее проблема со стопами не ушла, вся суть в том, что стопы на отложенниках выставляются почему то по отношению к уже открытому ордеру
 
Стопы указаны правильно, а вот про NormolizeDouble напрочь забыл. Модификация ордера есть имеет место быть, но пока что не реализовывал. 
 
ну и по традиции, начинайте вот прям сейчас учится ставить стопы/тейки в два этапа - поставили рыночный ордер - получили ответ от сервера что ордер встал - поставили тейк/стоп, поставили отложник - получили ответ что отложник установлен - дождались когда он сработает и станет рыночным - установили тейк/стоп, если делать не в таком порядке то на выходе можно получит полную хрень и букет ошибок
 
Artem Ashikhmin:

Не правильно указаны стопы может? Надо бы использовать NormalizeDouble(Bid и Digits)

if ( (SMMA1<MA28_1))        
           {
            ticket=OrderSend(NULL,OP_BUY,Lots,Ask,3,NormalizeDouble(Bid-StopLoss*Point,Digits),NormalizeDouble(Bid+TakeProfit*Point,Digits),
            "EMA position:",16384,0,Green);
            for(i=stop_positions;i>=0; i--) //зачем перебор ордеров в цикле, если нет модификации ордера, а просто его установка на место со стопами сразу?
            {
          
       open_step_2=open_step_2+Open_Step; //тут зачем так замудрено? например во внешних параметрах добавить: open_step_2 = 150;
       ticket2=OrderSend(Symbol(),OP_BUYSTOP, Lots2, NormalizeDouble(Ask+open_step_2*Point,Digits),2//зачем ticket2? просто ticket будет достаточно
NormalizeDouble((Bid+open_step_2)-SL*Point,Digits),NormalizeDouble((Bid+open_step_2)+TP*Point,Digits),"take_trend",MagicNumber2,0,Blue);


//Для sell использовать цену стоп уровней Ask, а открытие и установка отложенного ордера по Bid 

P.S.
Чтобы не было в дальнейшем ошибки 130, надо брать значения для установки стоп уровней хотя бы: спрейд вал.пары * 2 (т.е. если спрейд 17, то мин.уровень 30-35)

Сделал так, ситуация стала получше, но не на много, теперь стопы становятся кратными стопам основного ордера, в тестере получил вот такие результаты:

                                                      цена Стоп лосс  Тэйк профит    

1 2016.08.25 18:05 buy        1 3.00 4791.25 4780.25    4800.25    0.00 10000.00

2 2016.08.25 18:05 buy stop 2 1.00 4792.25 4290.25 5430.25 0.00 10000.00

3 2016.08.25 18:05 buy stop 3 1.00 4793.25 4390.25 5530.25 0.00 10000.00

4 2016.08.25 18:05 buy stop 4 1.00 4794.25 4490.25 5630.25 0.00 10000.00

5 2016.08.25 18:05 buy stop 5 1.00 4795.25 4590.25 5730.25 0.00 10000.00

6 2016.08.25 18:05 buy stop 6 1.00 4796.25 4690.25 5830.25 0.00 10000.00

7 2016.08.25 18:05 buy stop 7 1.00 4797.25 4790.25 5930.25 0.00 10000.00

8 2016.08.25 18:17 buy 2 1.00 4792.25 4290.25 5430.25 0.00 10000.00

9 2016.08.25 18:17 buy 3 1.00 4793.25 4390.25 5530.25 0.00 10000.00

 Убрав *Point отложенные ордера не выставляются, а также проделав аналогичные действя на SELL сделки перестали открыаться вообще и выдают 130 ошибку

 
Artem Ashikhmin:

А если близкие стопы, например работает скальпинг, то после срабатывания ордера и перебора его в цикле что он рыночный цена уже будет не актуальна для установки уровней стопа,
в итоге ошибка 130 неправильные стопы.

ну например есн тип счёта не даст в одном приказе и ордер поставить и стопы к нему, ещё с короткими стопами ордер может вовсе не встать - либо встать без стопов (бывало и такое) - тоже самое с отложником - может сработать и на томже тике закрыться по стопу либо остаться без стопа вовсе - и вообще приказ на установку ордера и приказ на установку стопа к нему это два приказа, просто нам дали возможность отправлять эти два приказа вместе
 
Artem Ashikhmin:

Сделаем тогда по умному:

   open_step_2   = open_step_2 + Open_Step;
   double Price  = NormalizeDouble((Ask-Bid)/Point,Digits);
   double Step   = NormalizeDouble((Price + open_step_2) * Point, Digits);
   double PriceB = NormalizeDouble(Ask + Step, Digits);
   double PriceS = NormalizeDouble(Bid - Step, Digits);

if ( (SMMA1<MA28_1)){

            ticket=OrderSend(NULL,OP_BUY,Lots,Ask,3,NormalizeDouble(Bid-StopLoss*Point,Digits),NormalizeDouble(Bid+TakeProfit*Point,Digits),
            "EMA position:",16384,0,Green);        

       ticket2=OrderSend(Symbol(),OP_BUYSTOP, Lots2, PriceB,2,
NormalizeDouble((Bid+open_step_2)-SL*Point,Digits),NormalizeDouble((Bid+open_step_2)+TP*Point,Digits),"take_trend",MagicNumber2,0,Blue);


 

Если  open_step_2 и Open_Step задают в пунктах - то сделано много лишних вычислений, а в конце лажа всё равно.
 
Artem Ashikhmin:

Ну да.

   double MultStopOrd = 15;
   double Price  = NormalizeDouble((Ask-Bid)/Point,Digits);
   double Step   = NormalizeDouble((Price * MultStopOrd) * Point, Digits);
   double PriceB = NormalizeDouble(Ask + Step, Digits);
   double PriceS = NormalizeDouble(Bid - Step, Digits);

if ( (SMMA1<MA28_1)){

            ticket=OrderSend(NULL,OP_BUY,Lots,Ask,3,NormalizeDouble(Bid-StopLoss*Point,Digits),NormalizeDouble(Bid+TakeProfit*Point,Digits),
            "EMA position:",16384,0,Green);        

       ticket2=OrderSend(Symbol(),OP_BUYSTOP, Lots2, PriceB,2,
NormalizeDouble((Bid+open_step_2)-SL*Point,Digits),NormalizeDouble((Bid+open_step_2)+TP*Point,Digits),"take_trend",MagicNumber2,0,Blue);
Что "ну да"? Лажа всё ещё там )))
 
Artem Ashikhmin:

Проверил всё нормально и множить и плюсовать.
Где неправильно ? У меня это всё работает.

double MultStopOrd = 15; - Зачем дабл???

double Price  = NormalizeDouble((Ask-Bid)/Point,Digits); - Спред в пунктах,  зачем так сложно?

NormalizeDouble((Bid+open_step_2)-SL*Point,Digits), NormalizeDouble((Bid+open_step_2)+TP*Point,Digits) - Вот тут ЛАЖА... Как и что работает? Какая будет цена стопа?

 
Artem Ashikhmin:

Так, по новой:

   open_step_2   = 150;
   double Price  = NormalizeDouble((Ask-Bid)/Point,Digits);
   double Step   = NormalizeDouble((Price + open_step_2) * Point, Digits);
//-----------------------------------------------------------------------+
   double PriceB = NormalizeDouble(Ask + Step, Digits);
   double SLb    = NormalizeDouble(PriceB - StopLoss * Point, Digits);
   double TPb    = NormalizeDouble(PriceB + TakeProfit * Point, Digits);
//-----------------------------------------------------------------------+
   double PriceS = NormalizeDouble(Bid - Step, Digits);
   double SLs    = NormalizeDouble(PriceS + StopLoss * Point, Digits);
   double TPs    = NormalizeDouble(PriceS - TakeProfit * Point, Digits);

if ( (SMMA1<MA28_1)){

            ticket=OrderSend(NULL,OP_BUY,Lots,Ask,3,NormalizeDouble(Bid-StopLoss*Point,Digits),NormalizeDouble(Bid+TakeProfit*Point,Digits),
            "EMA position:",16384,0,Green);        

       ticket2=OrderSend(Symbol(), OP_BUYSTOP, Lots2, PriceB, 2, SLb, TPb, "take_trend", MagicNumber2, 0, Blue);
А цикл куда делся? Топикстартеру вроде как сетка отложек нужна была, с шагом Open_Step.