Перенос стопа

 

Добрый день. 

Хотел сделать траил стоп, но не знаю как закциклить, сделка редактируется лишь раз.

  for(int i= OrdersTotal()-1; i>= 0 ; i--)

         {

         

         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

         

         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber)

         {

         if(OrderType() == OP_BUY && Bid >= OrderOpenPrice()+ 210*Point && OrderStopLoss() < OrderOpenPrice())

         OrderModify(OrderTicket(), OrderOpenPrice(), Bid-20*Point, OrderTakeProfit(), 0, CLR_NONE);

         }

         

         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber)

         {

         if(OrderType() == OP_SELL && Ask <= OrderOpenPrice()- 210*Point && OrderStopLoss() > OrderOpenPrice())

         OrderModify(OrderTicket(), OrderOpenPrice(), Ask+20*Point, OrderTakeProfit(), 0, CLR_NONE);

         }

Нужно чтобы редактирование происходило постоянно.

 

 

 
xjasond:

Добрый день. 

Хотел сделать траил стоп, но не знаю как закциклить, сделка редактируется лишь раз.

  for(int i= OrdersTotal()-1; i>= 0 ; i--)

         {

         

         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

         

         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber)

         {

         if(OrderType() == OP_BUY && Bid >= OrderOpenPrice()+ 210*Point && OrderStopLoss() < OrderOpenPrice())

         OrderModify(OrderTicket(), OrderOpenPrice(), Bid-20*Point, OrderTakeProfit(), 0, CLR_NONE);

         }

         

         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber)

         {

         if(OrderType() == OP_SELL && Ask <= OrderOpenPrice()- 210*Point && OrderStopLoss() > OrderOpenPrice())

         OrderModify(OrderTicket(), OrderOpenPrice(), Ask+20*Point, OrderTakeProfit(), 0, CLR_NONE);

         }

Нужно чтобы редактирование происходило постоянно.

 

 

Поместите ваш код в функцию OnTick(). Код будет выполнятся каждый раз после прихода нового тика.
 
Vitalii Ananev:
Поместите ваш код в функцию OnTick(). Код будет выполнятся каждый раз после прихода нового тика.

Сейчас код находится в ontick(). Я попробовал удалить проверку 

OrderStopLoss() > OrderOpenPrice() 

Стоп начал тянутся постоянно, но  так же и в низ (если на покупку). То есть просто начал следовать за ценой
 
xjasond:

Добрый день. 

Хотел сделать траил стоп, но не знаю как закциклить, сделка редактируется лишь раз.

  for(int i= OrdersTotal()-1; i>= 0 ; i--)

         {

         

         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

         

         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber)

         {

         if(OrderType() == OP_BUY && Bid >= OrderOpenPrice()+ 210*Point && OrderStopLoss() < OrderOpenPrice())

         OrderModify(OrderTicket(), OrderOpenPrice(), Bid-20*Point, OrderTakeProfit(), 0, CLR_NONE);

         }

         

         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber)

         {

         if(OrderType() == OP_SELL && Ask <= OrderOpenPrice()- 210*Point && OrderStopLoss() > OrderOpenPrice())

         OrderModify(OrderTicket(), OrderOpenPrice(), Ask+20*Point, OrderTakeProfit(), 0, CLR_NONE);

         }

Нужно чтобы редактирование происходило постоянно.

 

 

Это ты бу написал.

 Надо сравнивать цену с СЛ

Bid >= OrderStopLoss()+trailing*Point
 

Попробовал сделать так:

 

 for(int b = OrdersTotal()-1;b >= 0;b--)

         {

         

         OrderSelect(b, SELECT_BY_POS, MODE_TRADES);

         

         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber && OrderType()==OP_BUY)

         {

         if(Bid >= OrderOpenPrice()+ 210*Point && Bid >= OrderStopLoss())

         OrderModify(OrderTicket(), OrderOpenPrice(), Bid-20*Point, OrderTakeProfit(), 0, CLR_NONE);   

         }

         

         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber && OrderType()==OP_SELL)

         {

         if(Ask <= OrderOpenPrice()- 210*Point && Ask <= OrderStopLoss())

         OrderModify(OrderTicket(), OrderOpenPrice(), Ask+20*Point, OrderTakeProfit(), 0, CLR_NONE);

         }

         }

В итоге стоп лосс редактируется то постоянно, но теперь он просто летает за ценой на расстоянии 2х пунктов (когда цена выше 21) .

 Тоесть если открыт бай - цена прошла 21 пункт вверх мне нужно разместить стоп на 2 пункта ниже, и вести его за ценой, но не уменьшать (сейчас уменьшается)

 

Я пас.

Говорю надо цену СЛ сравнивать, а ты опять про цену открытия

 
Vasyl Nosal:

Я пас.

Говорю надо цену СЛ сравнивать, а ты опять про цену открытия

Да я понять не могу как сравнить. Разве я не сравниваю? Ask <= OrderStopLoss() , мне нужно как то предыдующий стоплосс запомнить или что? 


 

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

Если кто знает, подскажите пожалуйста как это можно сделать

 
 if(Bid >= OrderStopLoss()+ 210*Point)
 
Vasyl Nosal:
 if(Bid >= OrderStopLoss()+ 210*Point)

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

То есть первый перенос стопа делать как прошла цена 21 пункт ( на 19 пунктах будет стоп ) , а после уже на расстоянии 2х пунктов  от текущей цены

 

 Не могу понять как это осуществить

 

 

 

 for(int b = OrdersTotal()-1;b >= 0;b--)

    {

     OrderSelect(b, SELECT_BY_POS, MODE_TRADES);

        {

           if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber && OrderType()==OP_BUY)

                {

                  if(Bid >= OrderStopLoss()+ 210*Point)

                  OrderModify(OrderTicket(), OrderOpenPrice(), Bid-20*Point, OrderTakeProfit(), 0, CLR_NONE);   

                }        

           if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber && OrderType()==OP_SELL)

               {

                   if(Ask <= OrderStopLoss()- 210*Point)

                   OrderModify(OrderTicket(), OrderOpenPrice(), Ask+20*Point, OrderTakeProfit(), 0, CLR_NONE);

               }

         }  

      } 

 
xjasond:

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

То есть первый перенос стопа делать как прошла цена 21 пункт ( на 19 пунктах будет стоп ) , а после уже на расстоянии 2х пунктов  от текущей цены

 

 Не могу понять как это осуществить

 

 

 

 for(int b = OrdersTotal()-1;b >= 0;b--)

    {

     OrderSelect(b, SELECT_BY_POS, MODE_TRADES);

        {

           if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber && OrderType()==OP_BUY)

                {

                  if(Bid >= OrderStopLoss()+ 210*Point)

                  OrderModify(OrderTicket(), OrderOpenPrice(), Bid-20*Point, OrderTakeProfit(), 0, CLR_NONE);   

                }        

           if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicnumber && OrderType()==OP_SELL)

               {

                   if(Ask <= OrderStopLoss()- 210*Point)

                   OrderModify(OrderTicket(), OrderOpenPrice(), Ask+20*Point, OrderTakeProfit(), 0, CLR_NONE);

               }

         }  

      } 

Я думал ты хочешь вникнуть. Надо было сразу сказать "Мне нужен код трейлинга" а не голову морочить.

 extern int TrailingStart =0;
 extern int TrailingStop = 20;
 extern int TrailingStep =10;

 

void Traling_Stop_f()
 {
  for(int i=0; i<OrdersTotal(); i++) 
  { 
    if(OrderSelect(i, SELECT_BY_POS))
    {
    if(OrderSymbol() == Symbol())
    {        
    if(OrderMagicNumber()==Magic)
    {

    if(OrderType()==OP_BUY) 
      { 
      if(Bid>=NormalizeDouble(OrderOpenPrice()+TrailingStart*point+TrailingStop*point,Digits)) 
      { 
        if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop+TrailingStep)*point,Digits))
        {
        if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(Bid-TrailingStop*point,Digits))
        {
        while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
        RefreshRates();
          if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*point,Digits), OrderTakeProfit(), 0, clrNONE))
          continue;
        } 
        }
      }
      } 
     else
    if(OrderType()==OP_SELL) 
      { 
      if(Ask<=NormalizeDouble(OrderOpenPrice()-TrailingStart*point-TrailingStop*point,Digits)) 
      { 
        if((NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep)*point,Digits)) || OrderStopLoss()==0) 
        {
        if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(Ask+TrailingStop*point,Digits))
        {
        while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
        RefreshRates();
          if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*point,Digits), OrderTakeProfit(), 0, clrNONE))
          continue;
        }
        }
      }
      } 
    }
    }
    } 
  }
  
 }