Трейлинг стоп-лосс

 

Приветствую. Пытаюсь найти  советник/скрипт/волшебную палочку, которая могла бы поттягивать стоп-лосс для buy ордера ниже минимума предыдущей свечи и для sell ордера выше максимума предыдущей свечи. По-идее реализация такого безобразия не особо сложной должна быть, но такое ощущение, что никто ничего подобного не делал. Есть у кого информация по этому поводу?

Заранее благодарю за предметные ответы

 

Если МТ4, то используйте этот:

//трейлинг рыночных ордеров, стоплосс держится на расстоянии Distance от самой экстремальной тени из последних HoursNumber часов 
int DoTrailOrders(double eDistance, double eHoursNumber, int eMagicNumber, string eSymbol, int eTimeFrame)
   {
   int eDigits=(int)MarketInfo(eSymbol,MODE_DIGITS);
   eDistance*=MarketInfo(eSymbol,MODE_POINT);
   double eSpread=MarketInfo(eSymbol,MODE_SPREAD)*MarketInfo(eSymbol,MODE_POINT);
   int eBarsNumber=(int)MathMax(MathCeil(3600.0/PeriodSeconds(eTimeFrame)*eHoursNumber),1);
   double eExtremum;
   int ePosition, eTotal=OrdersTotal(), eType;
   for(ePosition=0; ePosition<eTotal; ePosition++)
      {
      if(!OrderSelect(ePosition,SELECT_BY_POS,MODE_TRADES))
         {
         //обработка ошибки
         continue;
         }
      eType=OrderType();
      if(eType!=OP_BUY && eType!=OP_SELL) continue;
      if(OrderMagicNumber()!=eMagicNumber) continue;
      if(OrderSymbol()!=eSymbol) continue;
      //наблюдаем начиная с бара следующим за баром открытия
      if(iBarShift(eSymbol,eTimeFrame,OrderOpenTime())==0) continue;
      if(eType==OP_BUY)
         {
         //стоп устанавливается на расстоянии eDistance от самой низкой тени бара из истории eBarsNumber
         eExtremum=iLow(eSymbol,eTimeFrame,iLowest(eSymbol,eTimeFrame,MODE_LOW,eBarsNumber,1));
         //расстояние от минимума до StopLoss должно превысить TrailingLevel
         if(NormalizeDouble(eExtremum-OrderStopLoss(),eDigits)<=eDistance && OrderStopLoss()>0) continue;
         //расстояние от минимума до цены открытия должно превысить TrailingLevel
         if(NormalizeDouble(eExtremum-OrderOpenPrice(),eDigits)<=eDistance) continue;
         //новый стоп должен быть не ближе к текущей цене, чем на два спреда
         if(NormalizeDouble(MarketInfo(eSymbol,MODE_BID)-eExtremum+eDistance,eDigits)<=eSpread) continue;
         
         if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(eExtremum-eDistance,eDigits),OrderTakeProfit(),OrderExpiration(),clOpenBuy))
            {
            //обработка ошибки
            }
         }
      if(eType==OP_SELL)
         {
         //стоп устанавливается на расстоянии eDistance от самой высокой тени бара из истории eBarsNumber
         eExtremum=iHigh(eSymbol,eTimeFrame,iHighest(eSymbol,eTimeFrame,MODE_HIGH,eBarsNumber,1));
         if(NormalizeDouble(OrderStopLoss()-eExtremum,eDigits)<=eDistance && OrderStopLoss()>0) continue;
         if(NormalizeDouble(OrderOpenPrice()-eExtremum,eDigits)<=eDistance) continue;
         if(NormalizeDouble(eExtremum+eDistance-MarketInfo(eSymbol,MODE_ASK),eDigits)<=eSpread) continue;
         if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(eExtremum+eDistance,eDigits),OrderTakeProfit(),OrderExpiration(),clOpenSell))
            {
            //обработка ошибки
            }
         }
      }
   return(0);
   }
 
Aleksei Stepanenko #:

Если МТ4, то используйте этот:

Спасибо большое, попробую 👍

 
Есть такое поверие, если переводишь ордер в БУ то как правило БУ и получаешь!!! Так к слову....
 
Mihail Marchukajtes #:
Есть такое поверие, если переводишь ордер в БУ то как правило БУ и получаешь!!! Так к слову....

Это смотря когда переводишь)