#property copyright "VAY"
#property link "loopsidery@yahoo.com"

string EAname = "RandomWalker 1.3 + fatl";
int Magic  = 2980787;

int slippage = 5;

extern string xxx0 = "--- MM parameters ";
extern bool FixedLot = TRUE;
extern bool ScaledLot = FALSE;  
extern bool FixedRisk = FALSE;
extern double LotSize = 0.05;
extern double LotPercent = 10;

extern string xxx1 = "--- Main Logic parameters ";
extern int MaxTrades = 2;
extern int TimeOutMin = 20;
extern double SoftTakeProfit = 20;
extern double SoftStopLoss = 60; 
extern double HardStopLoss = 100; 

extern string xxx2 = "--- Trend parameters ";
extern int df_Period = 60;
extern string xxxx2 = "--- Close Trend ";
extern bool close_trend = true;

extern string xxx3 = "--- WPR M5 parameters ";
extern int WPR_TF_1 = 5;
extern int WPR_Period_1 = 14;
extern double WPR_Level1 = -96; 

extern string xxx4 = "--- WPR M1 parameters ";
extern int WPR_TF_2 = 1;
extern int WPR_Period_2 = 14;
extern double WPR_Level2 = -97; 

extern string  Session         = "--- Trading time ";
extern bool UseTradingTime = TRUE;
extern int HourStartGMT = 17;
extern int HourEndGMT = 7;
extern int HourStopOnFridayGMT = 4;
extern int GMTOffset = 3;

extern string  Trailing       = "=== Trail Parameters ===";
extern bool UseTrail = TRUE;
extern int Bars_Fractals = 11;      // Количество баров в фрактале

double point4;
double spread;
double stop_level;

//--- Параметры для автолота
double MinLot;
double MaxLot;
double LotStep;
double LotVal;
double One_Lot;
double VarLotSize;

int init() {
   if (Digits < 4) {
      point4 = 0.01;
   } else {
      point4 = 0.0001;
   }
       //--- Инициализация параметров для MM
   MinLot = MarketInfo(Symbol(), MODE_MINLOT);
   MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   LotVal = MarketInfo(Symbol(), MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   One_Lot=MarketInfo(Symbol(),MODE_MARGINREQUIRED)*AccountLeverage()/100;//Стоим. 1 лот приведенное к плечу 1:100
   return(0);
}
 
int start() {
   bool res;
   int ticket;
   spread = ND(Ask-Bid);
   stop_level = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
   double SL = ND(MathMax(HardStopLoss*point4,stop_level));
   double TP = ND(MathMax(HardStopLoss*point4,stop_level));

   HideTestIndicators(TRUE);
   double df_1 = 0.342152940854*iClose(NULL,df_Period,1)
+0.3093292710818*iClose(NULL,df_Period,2)
+0.2494886026077*iClose(NULL,df_Period,3)
+0.1729967470992*iClose(NULL,df_Period,4)
+0.0925637619799*iClose(NULL,df_Period,5)
+0.02063133334364*iClose(NULL,df_Period,6)
-0.0330807757871*iClose(NULL,df_Period,7)
-0.0633224564657*iClose(NULL,df_Period,8)
-0.0699201252728*iClose(NULL,df_Period,9)
-0.0571825815615*iClose(NULL,df_Period,10)
-0.0326138365275*iClose(NULL,df_Period,11)
-0.00472222203391*iClose(NULL,df_Period,12)
+0.01887417755416*iClose(NULL,df_Period,13)
+0.0330626229331*iClose(NULL,df_Period,14)
+0.0359799385551*iClose(NULL,df_Period,15)
+0.02892153255004*iClose(NULL,df_Period,16)
+0.01547756053013*iClose(NULL,df_Period,17)
+0.0002774619935816*iClose(NULL,df_Period,18)
-0.01239612720349*iClose(NULL,df_Period,19)
-0.01962143471368*iClose(NULL,df_Period,20)
-0.02040646532991*iClose(NULL,df_Period,21)
-0.01564282987562*iClose(NULL,df_Period,22)
-0.00754279142733*iClose(NULL,df_Period,23)
+0.001162950482821*iClose(NULL,df_Period,24)
+0.00803410120806*iClose(NULL,df_Period,25)
+0.01154650780504*iClose(NULL,df_Period,26)
+0.01135097902722*iClose(NULL,df_Period,27)
+0.00815882017765*iClose(NULL,df_Period,28)
+0.00337147099221*iClose(NULL,df_Period,29)
-0.001454786740187*iClose(NULL,df_Period,30)
-0.00509465397315*iClose(NULL,df_Period,31)
-0.00705602263847*iClose(NULL,df_Period,32)
-0.00791744078702*iClose(NULL,df_Period,33)
-0.00996601702916*iClose(NULL,df_Period,34)
+0.00455978659094*iClose(NULL,df_Period,35);

   double df_2 = 0.342152940854*iClose(NULL,df_Period,2)
+0.3093292710818*iClose(NULL,df_Period,3)
+0.2494886026077*iClose(NULL,df_Period,4)
+0.1729967470992*iClose(NULL,df_Period,5)
+0.0925637619799*iClose(NULL,df_Period,6)
+0.02063133334364*iClose(NULL,df_Period,7)
-0.0330807757871*iClose(NULL,df_Period,8)
-0.0633224564657*iClose(NULL,df_Period,9)
-0.0699201252728*iClose(NULL,df_Period,10)
-0.0571825815615*iClose(NULL,df_Period,11)
-0.0326138365275*iClose(NULL,df_Period,12)
-0.00472222203391*iClose(NULL,df_Period,13)
+0.01887417755416*iClose(NULL,df_Period,14)
+0.0330626229331*iClose(NULL,df_Period,15)
+0.0359799385551*iClose(NULL,df_Period,16)
+0.02892153255004*iClose(NULL,df_Period,17)
+0.01547756053013*iClose(NULL,df_Period,18)
+0.0002774619935816*iClose(NULL,df_Period,19)
-0.01239612720349*iClose(NULL,df_Period,20)
-0.01962143471368*iClose(NULL,df_Period,21)
-0.02040646532991*iClose(NULL,df_Period,22)
-0.01564282987562*iClose(NULL,df_Period,23)
-0.00754279142733*iClose(NULL,df_Period,24)
+0.001162950482821*iClose(NULL,df_Period,25)
+0.00803410120806*iClose(NULL,df_Period,26)
+0.01154650780504*iClose(NULL,df_Period,27)
+0.01135097902722*iClose(NULL,df_Period,28)
+0.00815882017765*iClose(NULL,df_Period,29)
+0.00337147099221*iClose(NULL,df_Period,30)
-0.001454786740187*iClose(NULL,df_Period,31)
-0.00509465397315*iClose(NULL,df_Period,32)
-0.00705602263847*iClose(NULL,df_Period,33)
-0.00791744078702*iClose(NULL,df_Period,34)
-0.00996601702916*iClose(NULL,df_Period,35)
+0.00455978659094*iClose(NULL,df_Period,36);

// вывод комментария

if (df_1 > df_2) string trend = "Trend UP";
if (df_1 < df_2) trend = "Trend DOWN";

Comment ("\n",
         "df_1  ", DoubleToStr(df_1,5), "\n",
         "df_2  ", DoubleToStr(df_2,5), "\n",
         "\n",
         trend);


//
   double iwpr1 = iWPR(NULL,WPR_TF_1,WPR_Period_1,1);
   double iwpr2 = iWPR(NULL,WPR_TF_2,WPR_Period_2,1);
   
         // установка стопов и закрытие ордеров
   for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
            double OP = OrderOpenPrice();
            if (OrderType() == OP_BUY) {
               if (OrderStopLoss() == 0) {
                  res = OrderModify(OrderTicket(), OrderOpenPrice(), ND(Ask-SL), ND(Ask+TP), 0, Blue);
                  if (!res) HandleError();
               }
               if (UseTrail && Bid > OP + SoftTakeProfit*point4) {
                  TrailingByFractals(OrderTicket(),WPR_TF_1 ,Bars_Fractals ,2 , FALSE);         
               }
               if (   (Bid > OP + SoftTakeProfit*point4 && iwpr2 >= -100-WPR_Level2) 
                   || (Bid > OP + spread && iwpr1 >= -100-WPR_Level1) 
                   || (Bid < OP - SoftStopLoss*point4 && iwpr2 >= -100-WPR_Level2)
                   || (Bid < OP - HardStopLoss*point4 )
                   || (close_trend == true && df_1 < df_2) ) {
                  Print("Closing OP_BUY: WPR1 = ",DoubleToStr(iwpr1,2),"  WPR2 = ",DoubleToStr(iwpr2,2));
                  res = CareCloseOrder(OrderTicket(), OP_BUY, OrderLots());
               }             
            } else if (OrderType() == OP_SELL) {
               if (OrderStopLoss() == 0) {
                  OrderModify(OrderTicket(), OrderOpenPrice(), ND(Ask+SL), ND(Ask-TP), 0, Red);
               }
               if (UseTrail && Ask < OP - SoftTakeProfit*point4) {
                  TrailingByFractals(OrderTicket(),WPR_TF_1 ,Bars_Fractals ,2 , FALSE);         
               }            
               if (   (Ask < OP - SoftTakeProfit*point4 && iwpr2 <= WPR_Level2)
                   || (Ask < OP - spread && iwpr1 <= WPR_Level1) 
                   || (Ask > OP + SoftStopLoss*point4 && iwpr2 <= WPR_Level2) 
                   || (Ask > OP + HardStopLoss*point4)
                   || (close_trend == true && df_1 > df_2) ) {
                  Print("Closing OP_SELL: WPR1 = ",DoubleToStr(iwpr1,2),"  WPR2 = ",DoubleToStr(iwpr2,2));
                  res = CareCloseOrder(OrderTicket(), OP_SELL, OrderLots());
               }             
            }
         }
      }
   }

         // считаем открытые ордера и находим время открытия последнего ордера
   int open_trades=0;
   int open_time=0;
   for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
            open_trades++;
            if (OrderOpenTime() > open_time) open_time = OrderOpenTime();
         }
      }
   }

         // открытие ордеров
   VarLotSize = GetLots2(SL);
   if ((open_trades == 0 || open_trades < MaxTrades && TimeCurrent()-open_time > TimeOutMin*60) && IsTradeSession()) {
      if (df_1 > df_2 && iwpr1 <= WPR_Level1) {
         Print("Opening OP_BUY: Bid = ",DoubleToStr(Bid,4)," MA = ",DoubleToStr(df_1,2)," WPR1 = ",DoubleToStr(iwpr1,2));
         ticket = OrderSend(Symbol(), OP_BUY, VarLotSize, ND(Ask), slippage, 0, 0, EAname, Magic, 0, Blue);
         if (ticket < 0) HandleError();
      } else if (df_1 < df_2 && iwpr1 >= -100-WPR_Level1) {
         Print("Opening OP_SELL: Bid = ",DoubleToStr(Bid,4)," MA = ",DoubleToStr(df_1,2)," WPR1 = ",DoubleToStr(iwpr1,2));
         ticket = OrderSend(Symbol(), OP_SELL, VarLotSize, ND(Bid), slippage, 0, 0, EAname, Magic, 0, Red);
         if (ticket < 0) HandleError();
      }
   }

}

//
//---------------
//
bool IsTradeSession() {
   if (!UseTradingTime) return(TRUE);
   int Hour_Start_Trade = HourStartGMT+GMTOffset;
   int Hour_Stop_Trade = HourEndGMT+GMTOffset;
   if (Hour_Start_Trade<=0) Hour_Start_Trade = Hour_Start_Trade+24;
   if (Hour_Start_Trade>24) Hour_Start_Trade = Hour_Start_Trade-24;
   if (Hour_Stop_Trade<=0) Hour_Stop_Trade = Hour_Stop_Trade+24;
   if (Hour_Stop_Trade>24) Hour_Stop_Trade = Hour_Stop_Trade-24;
   if (Hour_Start_Trade < Hour_Stop_Trade && TimeHour(TimeCurrent()) < Hour_Start_Trade || TimeHour(TimeCurrent()) > Hour_Stop_Trade) return (FALSE);
   if (Hour_Start_Trade > Hour_Stop_Trade && (TimeHour(TimeCurrent()) < Hour_Start_Trade && TimeHour(TimeCurrent()) > Hour_Stop_Trade)) return (FALSE);
//
   int HourStopOnFriday = HourStopOnFridayGMT+GMTOffset;
   if (DayOfWeek() == 5 && TimeHour(TimeCurrent()) >= HourStopOnFriday) return(FALSE);
   return (true);
}

//
//---------------
// MM
double GetLots2(double SL) {
   double lot;
   if (FixedLot) {
      lot = LotSize;
   } else if (ScaledLot) {
      lot = MathFloor(AccountFreeMargin()*LotPercent/100/One_Lot/LotStep)*LotStep;
   } else if (FixedRisk) {
      lot = MathFloor((AccountFreeMargin()*LotPercent/100)/(SL/Point*LotVal)/LotStep)*LotStep;
   } else {
      lot = LotSize;
   }   
   if (lot < MinLot) lot = MinLot;
   if (lot > MaxLot) lot = MaxLot;
   return(lot);
}

//--- 
bool CareCloseOrder(int orderNum, int orderType, double Lots) {
   int RetryNum=30;
   int TryDelay=7500;
   bool res = TRUE;
   for (int k=1; (k <= RetryNum); k++) {
      if (orderType == OP_BUY) res = OrderClose(orderNum, Lots, ND(Bid), slippage, Blue);
      if (orderType == OP_SELL) res = OrderClose(orderNum, Lots, ND(Ask), slippage, Red);
      if (!res) HandleError();
      if (res) break;
      Sleep(TryDelay);
   } 
   return (res); 
}

double ND(double np) {
  return(NormalizeDouble(np,Digits));
}


int HandleError() {
   int error_0 = GetLastError();
   Print("ERROR (" + error_0 + ") : " + error(error_0));
   if (error_0 == 130/* INVALID_STOPS */ || error_0 == 129/* INVALID_PRICE */ || error_0 == 138/* REQUOTE */ || error_0 == 135/* PRICE_CHANGED */ || error_0 == 136/* OFF_QUOTES */) {
      RefreshRates();
      return (1);
   }
   if (error_0 == 146/* TRADE_CONTEXT_BUSY */ || error_0 == 133/* TRADE_DISABLED */ || error_0 == 128/* TRADE_TIMEOUT */ || error_0 == 139/* ORDER_LOCKED */) {
      Sleep(500);
      RefreshRates();
      return (1);
   }
   if (error_0 == 4/* SERVER_BUSY */ || error_0 == 137/* BROKER_BUSY */ || error_0 == 4022/* SYSTEM_BUSY */ || error_0 == 6/* NO_CONNECTION */ || error_0 == 141/* TOO_MANY_REQUESTS */ ||
      error_0 == 8/* TOO_FREQUENT_REQUESTS */) {
      Sleep(1500);
      RefreshRates();
      return (1);
   }
   if (error_0 == 147/* TRADE_EXPIRATION_DENIED */) {
      RefreshRates();
      return (1);
   }
   if (error_0 != 0/* NO_ERROR */) {
      Sleep(500);
      RefreshRates();
      return (0);
   }
   return (0);
}

//---
string error(int eer)
{
   string er;
   switch(eer)
     {
      //---- 
      case 0:
      case 1:   er="Нет ошибки, но результат неизвестен";                         break;
      case 2:   er="Общая ошибка";                                                break;
      case 3:   er="Неправильные параметры";                                      break;
      case 4:   er="Торговый сервер занят";                                       break;
      case 5:   er="Старая версия клиентского терминала";                         break;
      case 6:   er="Нет связи с торговым сервером";                               break;
      case 7:   er="Недостаточно прав";                                           break;
      case 8:   er="Слишком частые запросы";                                      break;
      case 9:   er="Недопустимая операция нарушающая функционирование сервера";   break;
      case 64:  er="Счет заблокирован";                                           break;
      case 65:  er="Неправильный номер счета";                                    break;
      case 128: er="Истек срок ожидания совершения сделки";                       break;
      case 129: er="Неправильная цена";                                           break;
      case 130: er="Неправильные стопы";                                          break;
      case 131: er="Неправильный объем";                                          break;
      case 132: er="Рынок закрыт";                                                break;
      case 133: er="Торговля запрещена";                                          break;
      case 134: er="Недостаточно денег для совершения операции";                  break;
      case 135: er="Цена изменилась";                                             break;
      case 136: er="Нет цен";                                                     break;
      case 137: er="Брокер занят";                                                break;
      case 138: er="Новые цены - Реквот";                                         break;
      case 139: er="Ордер заблокирован и уже обрабатывается";                     break;
      case 140: er="Разрешена только покупка";                                    break;
      case 141: er="Слишком много запросов";                                      break;
      case 145: er="Модификация запрещена, так как ордер слишком близок к рынку"; break;
      case 146: er="Подсистема торговли занята";                                  break;
      case 147: er="Использование даты истечения ордера запрещено брокером";      break;
      case 148: er="Количество открытых и отложенных ордеров достигло предела ";  break;
      //---- 
      case 4000: er="Нет ошибки";                                                 break;
      case 4001: er="Неправильный указатель функции";                             break;
      case 4002: er="Индекс массива - вне диапазона";                             break;
      case 4003: er="Нет памяти для стека функций";                               break;
      case 4004: er="Переполнение стека после рекурсивного вызова";               break;
      case 4005: er="На стеке нет памяти для передачи параметров";                break;
      case 4006: er="Нет памяти для строкового параметра";                        break;
      case 4007: er="Нет памяти для временной строки";                            break;
      case 4008: er="Неинициализированная строка";                                break;
      case 4009: er="Неинициализированная строка в массиве";                      break;
      case 4010: er="Нет памяти для строкового массива";                          break;
      case 4011: er="Слишком длинная строка";                                     break;
      case 4012: er="Остаток от деления на ноль";                                 break;
      case 4013: er="Деление на ноль";                                            break;
      case 4014: er="Неизвестная команда";                                        break;
      case 4015: er="Неправильный переход";                                       break;
      case 4016: er="Неинициализированный массив";                                break;
      case 4017: er="Вызовы DLL не разрешены";                                    break;
      case 4018: er="Невозможно загрузить библиотеку";                            break;
      case 4019: er="Невозможно вызвать функцию";                                 break;
      case 4020: er="Вызовы внешних библиотечных функций не разрешены";           break;
      case 4021: er="Недостаточно памяти для строки, возвращаемой из функции";    break;
      case 4022: er="Система занята";                                             break;
      case 4050: er="Неправильное количество параметров функции";                 break;
      case 4051: er="Недопустимое значение параметра функции";                    break;
      case 4052: er="Внутренняя ошибка строковой функции";                        break;
      case 4053: er="Ошибка массива";                                             break;
      case 4054: er="Неправильное использование массива-таймсерии";               break;
      case 4055: er="Ошибка пользовательского индикатора";                        break;
      case 4056: er="Массивы несовместимы";                                       break;
      case 4057: er="Ошибка обработки глобальныех переменных";                    break;
      case 4058: er="Глобальная переменная не обнаружена";                        break;
      case 4059: er="Функция не разрешена в тестовом режиме";                     break;
      case 4060: er="Функция не подтверждена";                                    break;
      case 4061: er="Ошибка отправки почты";                                      break;
      case 4062: er="Ожидается параметр типа string";                             break;
      case 4063: er="Ожидается параметр типа integer";                            break;
      case 4064: er="Ожидается параметр типа double";                             break;
      case 4065: er="В качестве параметра ожидается массив";                      break;
      case 4066: er="Запрошенные исторические данные в состоянии обновления";     break;
      case 4067: er="Ошибка при выполнении торговой операции";                    break;
      case 4099: er="Конец файла";                                                break;
      case 4100: er="Ошибка при работе с файлом";                                 break;
      case 4101: er="Неправильное имя файла";                                     break;
      case 4102: er="Слишком много открытых файлов";                              break;
      case 4103: er="Невозможно открыть файл";                                    break;
      case 4104: er="Несовместимый режим доступа к файлу";                        break;
      case 4105: er="Ни один ордер не выбран";                                    break;
      case 4106: er="Неизвестный символ";                                         break;
      case 4107: er="Неправильный параметр цены для торговой функции";            break;
      case 4108: er="Неверный номер тикета";                                      break;
      case 4109: er="Торговля не разрешена";                                      break;
      case 4110: er="Длинные позиции не разрешены";                               break;
      case 4111: er="Короткие позиции не разрешены";                              break;
      case 4200: er="Объект уже существует";                                      break;
      case 4201: er="Запрошено неизвестное свойство объекта";                     break;
      case 4202: er="Объект не существует";                                       break;
      case 4203: er="Неизвестный тип объекта";                                    break;
      case 4204: er="Нет имени объекта";                                          break;
      case 4205: er="Ошибка координат объекта";                                   break;
      case 4206: er="Не найдено указанное подокно";                               break;
      case 4207: er="Ошибка при работе с объектом";                               break;
      default:   er="unknown error";
     }
  return(er);
}

//
//---
//
void TrailingByFractals(int ticket,int tmfrm,int frktl_bars,int indent,bool trlinloss)   {
   int i, z; // counters
   int extr_n; // номер ближайшего экстремума frktl_bars-барного фрактала 
   double temp; // служебная переменная
   int after_x, be4_x; // свечей после и до пика соответственно
   int ok_be4, ok_after; // флаги соответствия условию (1 - неправильно, 0 - правильно)
   int sell_peak_n, buy_peak_n; // номера экстремумов ближайших фракталов на продажу (для поджатия дл.поз.) и покупку соответсвенно   
   double SLnew;
   
   // проверяем переданные значения
   if ((frktl_bars<=3) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET)))
      {
      Print("Трейлинг функцией TrailingByFractals() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   temp = frktl_bars;
      
   if (MathMod(frktl_bars,2)==0)
   extr_n = temp/2;
   else                
   extr_n = MathRound(temp/2);
      
   // баров до и после экстремума фрактала
   after_x = frktl_bars - extr_n;
   if (MathMod(frktl_bars,2)!=0)
   be4_x = frktl_bars - extr_n;
   else
   be4_x = frktl_bars - extr_n - 1;    
   
   // если длинная позиция (OP_BUY), находим ближайший фрактал на продажу (т.е. экстремум "вниз")
   if (OrderType()==OP_BUY)
      {
      // находим последний фрактал на продажу
      for (i=extr_n;i<iBars(Symbol(),tmfrm);i++)
         {
         ok_be4 = 0; ok_after = 0;
         
         for (z=1;z<=be4_x;z++)
            {
            if (iLow(Symbol(),tmfrm,i)>=iLow(Symbol(),tmfrm,i-z)) 
               {
               ok_be4 = 1;
               break;
               }
            }
            
         for (z=1;z<=after_x;z++)
            {
            if (iLow(Symbol(),tmfrm,i)>iLow(Symbol(),tmfrm,i+z)) 
               {
               ok_after = 1;
               break;
               }
            }            
         
         if ((ok_be4==0) && (ok_after==0))                
            {
            sell_peak_n = i; 
            break;
            }
         }
      SLnew = iLow(Symbol(),tmfrm,sell_peak_n)-indent*point4;
     
      // если тралить в убытке
      if (trlinloss==true)
         {
         // если новый стоплосс лучше имеющегося (в т.ч. если стоплосс == 0, не выставлен)
         // а также если курс не слишком близко, ну и если стоплосс уже не был перемещен на рассматриваемый уровень         
         if ((SLnew>OrderStopLoss()+point4) && (SLnew<Bid-stop_level))
            {
            Print("SL level is moved by the trail");
            if (!OrderModify(ticket,OrderOpenPrice(),SLnew,OrderTakeProfit(),OrderExpiration(),Blue))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      // если тралить только в профите, то
      else
         {
         // если новый стоплосс лучше имеющегося И курса открытия, а также не слишком близко к текущему курсу
         if ((SLnew>OrderStopLoss()+point4) && (SLnew>OrderOpenPrice()) && (SLnew<Bid-stop_level))
            {
            Print("SL level is moved by the trail");
            if (!OrderModify(ticket,OrderOpenPrice(),SLnew,OrderTakeProfit(),OrderExpiration(),Red))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      }
      
   // если короткая позиция (OP_SELL), находим ближайший фрактал на покупку (т.е. экстремум "вверх")
   if (OrderType()==OP_SELL)
      {
      // находим последний фрактал на продажу
      for (i=extr_n;i<iBars(Symbol(),tmfrm);i++)
         {
         ok_be4 = 0; ok_after = 0;
         
         for (z=1;z<=be4_x;z++)
            {
            if (iHigh(Symbol(),tmfrm,i)<=iHigh(Symbol(),tmfrm,i-z)) 
               {
               ok_be4 = 1;
               break;
               }
            }
            
         for (z=1;z<=after_x;z++)
            {
            if (iHigh(Symbol(),tmfrm,i)<iHigh(Symbol(),tmfrm,i+z)) 
               {
               ok_after = 1;
               break;
               }
            }            
         
         if ((ok_be4==0) && (ok_after==0))                
            {
            buy_peak_n = i;
            break;
            }
         }        
      SLnew = iHigh(Symbol(),tmfrm,buy_peak_n)+indent*point4+spread;

      // если тралить в убытке
      if (trlinloss==true)
         {
         if (((SLnew<OrderStopLoss()-point4) || (OrderStopLoss()==0)) && (SLnew>Ask+stop_level))
            {
            Print("SL level is moved by the trail");
            if (!OrderModify(ticket,OrderOpenPrice(),SLnew,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }      
      // если тралить только в профите, то
      else
         {
         // если новый стоплосс лучше имеющегося И курса открытия
         if ((((SLnew<OrderStopLoss()-point4) || (OrderStopLoss()==0))) && (SLnew<OrderOpenPrice()) && (SLnew>Ask+stop_level))
            {
            Print("SL level is moved by the trail");
            if (!OrderModify(ticket,OrderOpenPrice(),SLnew,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      }      
   }


