тейк профит и стоп лосс

 

товарищи, помоги разобраться и дописать советника, смысл такой:

есть советник который открывает сделку на продажу от линии v1  и на покупку от линии 5

нужно чтобы советник сам закрыл сделку, если на продажу то на линии v3, если на покупку то на линии v4. 

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

 

а что вы уже написали ?

тут конечно у людей отточены навыки телепатии и многие могут править код советника по аватарке автора, но можно-же проще ...

 

стоп лосс и тейк профит написаны абсолютно стандартно



double check_lot(double &lo)

{

   double l = MarketInfo(Symbol(),MODE_LOTSTEP);

   int ok = 0;

   while ( l < 1 ){l*=10;ok++;}

   if( lo < MarketInfo(Symbol(),MODE_MINLOT) )lo = MarketInfo(Symbol(),MODE_MINLOT);

   if( lo > MarketInfo(Symbol(),MODE_MAXLOT) )lo = MarketInfo(Symbol(),MODE_MAXLOT);

   return(NormalizeDouble(lo,ok));

}


int open( int type, double l, double sl = 0, double tp = 0, string comm = "")

{

   bool res;

   

   int isOpened = 0, try = 0;

   double s = 0,t = 0;

   color color_order = clrGold;

   

   while ( IsTradeContextBusy() )Sleep(500);

   RefreshRates();

   if ( sl != 0 && sl < MarketInfo(Symbol(),MODE_STOPLEVEL) )sl = MarketInfo(Symbol(),MODE_STOPLEVEL);

   if ( tp != 0 && tp < MarketInfo(Symbol(),MODE_STOPLEVEL) )tp = MarketInfo(Symbol(),MODE_STOPLEVEL);

   if ( type == 0 )

   {

      if ( tp == 0 )t = 0;

      if ( tp != 0 )t = Ask + tp * Point;

      if ( sl == 0 )s = 0;

      if ( sl != 0 )s = Ask - sl * Point;

   }

   if ( type == 1 )

   {

      if ( tp == 0 )t = 0;

      if ( tp != 0 )t = Bid - tp * Point;

      if ( sl == 0 )s = 0;

      if ( sl != 0 )s = Bid + sl * Point;

   }

   

   s = NormalizeDouble(s,Digits);

   t = NormalizeDouble(t,Digits);

   

   if ( MarketExecution )

   {

      if(type == 0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),100,0,0,comm,ID);

      if(type == 1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),100,0,0,comm,ID);

   }

   else

   {

      if(type == 0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),100,s,t,comm,ID);

      if(type == 1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),100,s,t,comm,ID);

   }

   

   while( isOpened < 0 )

   {

      Sleep(time_period_try * 1000);

      while ( IsTradeContextBusy() )Sleep(500);

      RefreshRates();

      if ( type == 0 )

      {

         if ( tp == 0 )t = 0;

         if ( tp != 0 )t = Ask + tp * Point;

         if ( sl == 0 )s = 0;

         if ( sl != 0 )s = Ask - sl * Point;

      }

      if ( type == 1 )

      {

         if ( tp == 0 )t = 0;

         if ( tp != 0 )t = Bid - tp * Point;

         if ( sl == 0 )s = 0;

         if ( sl != 0 )s = Bid + sl * Point;

      }

      s = NormalizeDouble(s,Digits);

      t = NormalizeDouble(t,Digits);

      try++;

      if ( MarketExecution )

      {

         if(type == 0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),100,0,0,comm,ID);

         if(type == 1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),100,0,0,comm,ID);

      }

      else

      {

         if(type == 0)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Ask,Digits),100,s,t,comm,ID);

         if(type == 1)isOpened = OrderSend(Symbol(),type,check_lot(l),NormalizeDouble(Bid,Digits),100,s,t,comm,ID);

      }

      if(try > number_try || isOpened >= 0) break;

   }

   

   if( isOpened < 0 ) Print("Ордер не открыт, ошибка :", GetLastError());

   else if ( MarketExecution )

   {

      if ( !OrderSelect(isOpened,SELECT_BY_TICKET) )return(0);

      if ( OrderType() == 0 )color_order = Blue;

      if ( OrderType() == 1 )color_order = Red;

      try = 0;

      

      if ( NormalizeDouble(OrderStopLoss(),Digits) != NormalizeDouble(s,Digits) || NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(t,Digits) )

      {

         while ( IsTradeContextBusy() )Sleep(500);

         res = OrderModify(OrderTicket(),OrderOpenPrice(),s,t,0,color_order);  

         

         while ( !res )

         {

            while ( IsTradeContextBusy() )Sleep(500);

            res = OrderModify(OrderTicket(),OrderOpenPrice(),s,t,0,color_order);

            

            Sleep(time_period_try * 1000);

            try ++;

            Print("Ордер с типом " + DoubleToStr(OrderType(),0) + " по цене " + DoubleToStr(OrderOpenPrice(),Digits) + " не модифицирован по OPEN, попытка " + DoubleToStr(try,0));

            if ( try > number_try || res )break;

         }

      }

   }

   return (isOpened);

}

 
menshikov_ab:

товарищи, помоги разобраться и дописать советника, смысл такой:

есть советник который открывает сделку на продажу от линии v1  и на покупку от линии 5

нужно чтобы советник сам закрыл сделку, если на продажу то на линии v3, если на покупку то на линии v4. 

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

Тут всё очень просто:

if(price_current == уровень цены, на котором установлена линия v3)
   Close_Sell();

if(price_current == уровень цены, на котором установлена линия v4)
   Close_Buy(); 

С уважением, Владимир.

 
если не сложно, можно как для дурака сделать, немного не понимаю что и куда написать
 
menshikov_ab #:
если не сложно, можно как для дурака сделать, немного не понимаю что и куда написать

Так расписал уже кодом. Хорошо, давайте словами расскажу. Берёте текущую цену валютной пары, на котором стоит советник, и отслеживаете её движение, а дальше сравниваете с уровнями цен, где стоят линии v3 и v4. Если текущая цена равна уровню цены, на которой стоит линия v3, то отрабатывает функция закрытия короткой позиции Close_Sell(). Если текущая цена равна уровню цены, на которой стоит линия v4, то отрабатывает функция закрытия длинной позиции Close_Buyl().

С уважением, Владимир.

 
MrBrooklin #:

Тут всё очень просто:

С уважением, Владимир.

Так и пролететь можно.

 

попробую разобраться.

Спасибо!

 
Koldun Zloy #:

Так и пролететь можно.

Можно, но у топикстартера было жёсткое условие - чтобы при касании линий сделка закрылась! Более мягкое условие звучало бы так - при пересечении линий снизу вверх или сверху вниз.

С уважением, Владимир.

 
MrBrooklin #:

Можно, но у топикстартера было жёсткое условие - чтобы при касании линий сделка закрылась! Более мягкое условие звучало бы так - при пересечении линий снизу вверх или сверху вниз.

С уважением, Владимир.

А может произойти так, что сначала цена выше линии, а на следующем тике уже ниже. И как тут поймать момент касания?

 
Alexey Viktorov #:

А может произойти так, что сначала цена выше линии, а на следующем тике уже ниже. И как тут поймать момент касания?

Доброе утро, Алексей! Думаю, что этот вопрос не ко мне нужно адресовать, а к топикстартеру, т.к. это его стратегия.

С уважением, Владимир.

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