#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
extern string A1 = "-= Параметры MACD =-";
extern int FASTMA = 12;
extern int SLOWMA = 26;
extern int SIGNALLINE = 9;
extern string A2 = "-= Параметры CCI =-";
extern int PeriodCCI = 14;
extern ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
extern string A3 = "-= Фиксированный лот =-";
extern double FixedLot = 0.01;
extern string A4 = "-= Расчет лота по риску на сделку в процентах от депозита =-";
extern bool PercentLot = false;
extern double Risk = 2.00;
extern string A5 = "-= Фиксированные значения СтопЛосса и ТейкПрофита =-";
extern int Sl = 3000;
extern int Tp = 500;
extern string A6 = "-= ТП и СЛ в зависимости от АТР. TP=kTP*ATR. SL=kSL*ATR=-";
extern bool AutoSlTp = true;
extern int PeriodATR = 50;
extern double kSL = 1.5;
extern double kTP = 1.5;
extern string A11 = "-= Магик =-";
extern int Magic = 555;
extern string A7 = "-= Кол-во одновременных ордеров =-"; 
extern int MaxOrders = 1;
extern string A8 = "-= Трейлин стоп =-";
extern bool TrallingStop = false;
extern int Trall = 200;
extern string A9 = "-= Величина проскальзывания =-";
extern int Slip = 15;

double sl,tp,lot,Lot;
double SlPriceBuy;
double TpPriceBuy;
double SlPriceSell;
double TpPriceSell;
int Orders = 0;
int i;
int ticket;
int TIMER = 100;

int OnInit()
  {
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
bool orderopened = false;
int ThisSymbolOrders = 0;
//---
if (OrdersTotal()>0)
{
   for (i=0; i<OrdersTotal(); i++)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol()) ThisSymbolOrders++;
   }
}
//---

//---
if(AutoSlTp==true)
{
Sl = NormalizeDouble((kSL*iATR(Symbol(),0,PeriodATR,1))/Point(),0);
Tp = NormalizeDouble((kTP*iATR(Symbol(),0,PeriodATR,1))/Point(),0);
}
sl = Sl*Point();
sl = NormalizeDouble(sl,Digits);
tp = Tp*Point();
tp = NormalizeDouble(tp,Digits);
if (PercentLot == true) Lot = NormalizeDouble((AccountFreeMargin()*Risk/100)/(Sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2);
if (PercentLot == false) Lot = FixedLot;
lot = Lot;

   if (iCCI(Symbol(),0,PeriodCCI,PRICE,1)<-100 &&
       iMACD(Symbol(),0,FASTMA,SLOWMA,SIGNALLINE,PRICE,0,1)<0 &&
       Close[1]>Open[1] &&
       TIMER!=Time[1] && ThisSymbolOrders<MaxOrders)                                                            
   {      
   SlPriceBuy = Ask-sl;
   TpPriceBuy = Ask+tp;
   SlPriceBuy = NormalizeDouble(SlPriceBuy,Digits);
   TpPriceBuy = NormalizeDouble(TpPriceBuy,Digits);  
   ticket = OrderSend(Symbol(), OP_BUY, lot, NormalizeDouble(Ask,Digits), Slip,SlPriceBuy,TpPriceBuy,NULL,Magic,0,clrGreen);
   if (ticket!=-1)
   {
   OrderSelect(ticket,SELECT_BY_TICKET, MODE_TRADES);
   ObjectCreate(ChartID(),Orders,OBJ_VLINE,0,OrderOpenTime(),OrderOpenPrice());
   ObjectSet(Orders, OBJPROP_COLOR, clrGreen);
   Orders++;
   TIMER=Time[1];
   }    
   }

//---
      if (iCCI(Symbol(),0,PeriodCCI,PRICE,1)>100 &&
          iMACD(Symbol(),0,FASTMA,SLOWMA,SIGNALLINE,PRICE,0,1)>0 &&
          Close[1]<Open[1] &&
          TIMER!=Time[1] && ThisSymbolOrders<MaxOrders)                                                         
   {   
          
   SlPriceSell = Bid+sl;
   TpPriceSell = Bid-tp;
   SlPriceSell = NormalizeDouble(SlPriceSell,Digits);
   TpPriceSell = NormalizeDouble(TpPriceSell,Digits);
   ticket = OrderSend(Symbol(),OP_SELL, lot,NormalizeDouble(Bid,Digits), Slip, SlPriceSell,TpPriceSell, NULL,Magic,0,clrRed);
   if (ticket!=-1)
   {
   OrderSelect(ticket,SELECT_BY_TICKET, MODE_TRADES);
   ObjectCreate(ChartID(),Orders,OBJ_VLINE,0,OrderOpenTime(),OrderOpenPrice());
   Orders++;
   TIMER=Time[1];
   }  
   }
//---
   if (TrallingStop == true)
{
if (OrdersTotal()>0)
{   
for ( i =0; i<OrdersTotal(); i++)
{   
   OrderSelect(i,SELECT_BY_POS, MODE_TRADES);

   if (OrderType() ==OP_BUY &&                                                                  
   Symbol()==OrderSymbol() && Ask - OrderStopLoss() > Trall*Point()) 
   {
   SlPriceBuy=Ask - Trall*Point();
   OrderModify(OrderTicket(), OrderOpenPrice(), SlPriceBuy, OrderTakeProfit(), 0,clrNONE);
   }
  
   if (OrderType() ==OP_SELL  &&
   Symbol()==OrderSymbol() && OrderStopLoss() - Bid > Trall*Point()) 
   {
   SlPriceSell = Bid + Trall*Point();
   OrderModify(OrderTicket(), OrderOpenPrice(), SlPriceSell, OrderTakeProfit(), 0,clrNONE);
   }
}
}
}
//---
string ER;
int Error = GetLastError();
if (Error>=0)
{
   switch (Error)
   {
   case 0: ER="Нет ошибки";break;
   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 149: ER="Попытка открыть противоположный ордер в случае, если хеджирование запрещено";break;
   case 150: ER="Попытка закрыть позицию по инструменту в противоречии с правилом FIFO";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 4023: ER="Критическая ошибка вызова DLL-функции";break;
   case 4024: ER="Внутренняя ошибка";break;
   case 4025: ER="Нет памяти";break;
   case 4026: ER="Неверный указатель";break;
   case 4027: ER="Слишком много параметров форматирования строки";break;
   case 4028: ER="Число параметров превышает число параметров форматирования строки";break;
   case 4029: ER="Неверный массив";break;
   case 4030: 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 4068: ER="Ресурс не найден";break;
   case 4069: ER="Ресурс не поддерживается";break;
   case 4070: ER="Дубликат ресурса";break;
   case 4071: ER="Ошибка инициализации пользовательского индикатора";break;
   case 4072: ER="Ошибка загрузки пользовательского индикатора";break;
   case 4073: ER="Нет исторических данных";break;
   case 4074: 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 4112: 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;
   case 4210: ER="Неизвестное свойство графика";break;
   case 4211: ER="График не найден";break;
   case 4212: ER="Не найдено подокно графика";break;
   case 4213: ER="Индикатор не найден";break;
   case 4220: ER="Ошибка выбора инструмента";break;
   case 4250: ER="Ошибка отправки push-уведомления";break;
   case 4251: ER="Ошибка параметров push-уведомления";break;
   case 4252: ER="Уведомления запрещены";break;
   case 4253: ER="Слишком частые запросы отсылки push-уведомлений";break;
   } 
}

if (Error>0)
{
   switch (Error)
   {
   case 1: Alert("Нет ошибки, но результат неизвестен");break;
   case 2: Alert("Общая ошибка");break;
   case 3: Alert("Неправильные параметры");break;
   case 4: Alert("Нет ошибки, но результат неизвестен");break;
   case 5: Alert("Торговый сервер занят");break;
   case 6: Alert("Нет связи с торговым сервером");break;
   case 7: Alert("Недостаточно прав");break;
   case 8: Alert("Слишком частые запросы");break;
   case 9: Alert("Недопустимая операция, нарушающая функционирование сервера");break;
   case 64: Alert("Счет заблокирован");break;
   case 65: Alert("Неправильный номер счета");break;
   case 128: Alert("Истек срок ожидания совершения сделки");break;
   case 129: Alert("Неправильная цена");break;
   case 130: Alert("Неправильные стопы");break;
   case 131: Alert("Неправильный объем");break;
   case 132: Alert("Рынок закрыт");break;
   case 133: Alert("Торговля запрещена");break;
   case 134: Alert("Недостаточно денег для совершения операции");break;
   case 135: Alert("Цена изменилась");break;
   case 136: Alert("Нет цен");break;
   case 137: Alert("Брокер занят");break;
   case 138: Alert("Новые цены");break;
   case 139: Alert("Ордер заблокирован и уже обрабатывается");break;
   case 140: Alert("Разрешена только покупка");break;
   case 141: Alert("Слишком много запросов");break;
   case 145: Alert("Модификация запрещена, так как ордер слишком близок к рынку");break;
   case 146: Alert("Подсистема торговли занята");break;
   case 147: Alert("Использование даты истечения ордера запрещено брокером");break;
   case 148: Alert("Количество открытых и отложенных ордеров достигло предела, установленного брокером");break;
   case 149: Alert("Попытка открыть противоположный ордер в случае, если хеджирование запрещено");break;
   case 150: Alert("Попытка закрыть позицию по инструменту в противоречии с правилом FIFO");break;
   case 4000: Alert("Нет ошибки");break;
   case 4001: Alert("Неправильный указатель функции");break;
   case 4002: Alert("Индекс массива - вне диапазона");break;
   case 4003: Alert("Нет памяти для стека функций");break;
   case 4004: Alert("Переполнение стека после рекурсивного вызова");break;
   case 4005: Alert("На стеке нет памяти для передачи параметров");break;
   case 4006: Alert("Нет памяти для строкового параметра");break;
   case 4007: Alert("Нет памяти для временной строки");break;
   case 4008: Alert("Неинициализированная строка");break;
   case 4009: Alert("Неинициализированная строка в массиве");break;
   case 4010: Alert("Нет памяти для строкового массива");break;
   case 4011: Alert("Слишком длинная строка");break;
   case 4012: Alert("Остаток от деления на ноль");break;
   case 4013: Alert("Деление на ноль");break;
   case 4014: Alert("Неизвестная команда");break;
   case 4015: Alert("Неправильный переход");break;
   case 4016: Alert("Неинициализированный массив");break;
   case 4017: Alert("Вызовы DLL не разрешены");break;
   case 4018: Alert("Невозможно загрузить библиотеку");break;
   case 4019: Alert("Невозможно вызвать функцию");break;
   case 4020: Alert("Вызовы внешних библиотечных функций не разрешены");break;
   case 4021: Alert("Недостаточно памяти для строки, возвращаемой из функции");break;
   case 4022: Alert("Система занята");break;
   case 4023: Alert("Критическая ошибка вызова DLL-функции");break;
   case 4024: Alert("Внутренняя ошибка");break;
   case 4025: Alert("Нет памяти");break;
   case 4026: Alert("Неверный указатель");break;
   case 4027: Alert("Слишком много параметров форматирования строки");break;
   case 4028: Alert("Число параметров превышает число параметров форматирования строки");break;
   case 4029: Alert("Неверный массив");break;
   case 4030: Alert("График не отвечает");break;
   case 4050: Alert("Неправильное количество параметров функции");break;
   case 4051: Alert("Недопустимое значение параметра функции");break;
   case 4052: Alert("Внутренняя ошибка строковой функции");break;
   case 4053: Alert("Ошибка массива");break;
   case 4054: Alert("Неправильное использование массива-таймсерии");break;
   case 4055: Alert("Ошибка пользовательского индикатора");break;
   case 4056: Alert("Массивы несовместимы");break;
   case 4057: Alert("Массивы несовместимы");break;
   case 4058: Alert("Глобальная переменная не обнаружена");break;
   case 4059: Alert("Функция не разрешена в тестовом режиме");break;
   case 4060: Alert("Функция не разрешена");break;
   case 4061: Alert("Ошибка отправки почты");break;
   case 4062: Alert("Ожидается параметр типа string");break;
   case 4063: Alert("Ожидается параметр типа integer");break;
   case 4064: Alert("Ожидается параметр типа double");break;
   case 4065: Alert("В качестве параметра ожидается массив");break;
   case 4066: Alert("Запрошенные исторические данные в состоянии обновления");break;
   case 4067: Alert("Ошибка при выполнении торговой операции");break;
   case 4068: Alert("Ресурс не найден");break;
   case 4069: Alert("Ресурс не поддерживается");break;
   case 4070: Alert("Дубликат ресурса");break;
   case 4071: Alert("Ошибка инициализации пользовательского индикатора");break;
   case 4072: Alert("Ошибка загрузки пользовательского индикатора");break;
   case 4073: Alert("Нет исторических данных");break;
   case 4074: Alert("Не хватает памяти для исторических данных");break;
   case 4099: Alert("Конец файла");break;
   case 4100: Alert("Ошибка при работе с файлом");break;
   case 4101: Alert("Неправильное имя файла");break;
   case 4102: Alert("Слишком много открытых файлов");break;
   case 4103: Alert("Невозможно открыть файл");break;
   case 4104: Alert("Несовместимый режим доступа к файлу");break;
   case 4105: Alert("Ни один ордер не выбран");break;
   case 4106: Alert("Неизвестный символ");break;
   case 4107: Alert("Неправильный параметр цены для торговой функции");break;
   case 4108: Alert("Неверный номер тикета");break;
   case 4109: Alert("Торговля не разрешена. Необходимо включить опцию <Разрешить советнику торговать> в свойствах эксперта");break;
   case 4110: Alert("Ордера на покупку не разрешены. Необходимо проверить свойства эксперта");break;
   case 4111: Alert("Ордера на продажу не разрешены. Необходимо проверить свойства эксперта");break;
   case 4112: Alert("Автоматическая торговля с помощью экспертов/скриптов запрещена на стороне сервера");break;
   case 4200: Alert("Объект уже существует");break;
   case 4201: Alert("Запрошено неизвестное свойство объекта");break;
   case 4202: Alert("Объект не существует");break;
   case 4203: Alert("Неизвестный тип объекта");break;
   case 4204: Alert("Нет имени объекта");break;
   case 4205: Alert("Ошибка координат объекта");break;
   case 4206: Alert("Не найдено указанное подокно");break;
   case 4207: Alert("Ошибка при работе с объектом");break;
   case 4210: Alert("Неизвестное свойство графика");break;
   case 4211: Alert("График не найден");break;
   case 4212: Alert("Не найдено подокно графика");break;
   case 4213: Alert("Индикатор не найден");break;
   case 4220: Alert("Ошибка выбора инструмента");break;
   case 4250: Alert("Ошибка отправки push-уведомления");break;
   case 4251: Alert("Ошибка параметров push-уведомления");break;
   case 4252: Alert("Уведомления запрещены");break;
   case 4253: Alert("Слишком частые запросы отсылки push-уведомлений");break;
   } 
}
//---                                                 
   Comment(
   "\nMACD (",FASTMA,";",SLOWMA,";",SIGNALLINE,")",
   "\nCCI (",PeriodCCI,")",
   "\nMaxOrders = ",MaxOrders,
   "\nTrallingStop = ", TrallingStop,", ",Trall,
   "\nLot = ",DoubleToString(lot,2),
   "\nPercentLot = ",PercentLot,", Risk = ",DoubleToString(Risk,2)," %",
   "\nTP = ",Tp,
   "\nSL = ",Sl,
   "\nОшибка № ", Error, " - ", ER);
  }
//+------------------------------------------------------------------+