//+------------------------------------------------------------------+
//|                                                  # Eitery BP.mq4 |
//|                                     Copyright 2014, Kolosov D.E. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kolosov D.E."
#property show_inputs


extern bool    открывать_ордера           =  false;
extern double  расстояние_от_цены         =  30;
extern int     отступ_от_уровня           =  5;
extern double  лот                        =  0.1;
extern int     тэйк_профит_1              =  50;
extern int     тэйк_профит_2              =  100;
extern int     стоп_лосс                  =  40;
extern bool    ставить_третью_отложку     =  false;
extern int     проскальзывание            =  5;

extern color   цвет_хая                   =  DodgerBlue;
extern int     стиль_хая                  =  3;
extern color   цвет_лоя                   =  FireBrick;
extern int     стиль_лоя                  =  3;

extern int магический_номер = 83515;

double high_level[4];
string name_high = "high_";
double low_level[4];
string name_low  = "low_";
double all_level[8];

double buy_level  = -10000,
       sell_level = -10000;

int start()
{
   проверка_на_пятизнак();
   рисуем_уровни();
   определяем_нужные_нам_уровни();
   
   Sleep(1000);
   
   if (открывать_ордера) {
      // Открываем сначала ордера на покупку
      if (buy_level > 0) {
         открыть_отложенный_ордер(OP_BUYSTOP, buy_level, 1);
         открыть_отложенный_ордер(OP_BUYSTOP, buy_level, 2);
         if (ставить_третью_отложку) {
            открыть_отложенный_ордер(OP_BUYSTOP, buy_level, 3);
         }
      } else Print("Ордера на бай не открываем");
      // Открываем ордера на продажу
      if (sell_level > 0) {
         открыть_отложенный_ордер(OP_SELLSTOP, sell_level, 1);
         открыть_отложенный_ордер(OP_SELLSTOP, sell_level, 2);
         if (ставить_третью_отложку) {
            открыть_отложенный_ордер(OP_SELLSTOP, sell_level, 3);
         }
      } else Print("Ордера на сэл не открываем");     
   }
   
   return(0);
}
//+------------------------------------------------------------------+

bool открыть_отложенный_ордер(int тип, double цена_открытия, int номер_ордера)
{
   int ticket = 0;
   double tp = 0.0, sl = 0.0;
   string комментарий = "";
 
   if (тип == OP_BUYSTOP) {
      if (номер_ордера == 1) {
         tp = NormalizeDouble(цена_открытия + тэйк_профит_1*Point, Digits);
         sl = NormalizeDouble(цена_открытия - стоп_лосс*Point,     Digits);
         комментарий = "Breaking Point Buy #1";
      } else if (номер_ордера == 2) {
         tp = NormalizeDouble(цена_открытия + тэйк_профит_2*Point, Digits);
         sl = NormalizeDouble(цена_открытия - стоп_лосс*Point,     Digits);
         комментарий = "Breaking Point Buy #2";
      } else if (номер_ордера == 3) {
         tp = 0.0;
         sl = NormalizeDouble(цена_открытия - стоп_лосс*Point,   Digits);
         комментарий = "Breaking Point Buy #3";
      }
      while (true) {
         ticket = OrderSend(Symbol(),OP_BUYSTOP,лот,цена_открытия,проскальзывание,sl,tp,комментарий,магический_номер,0,Blue);
         if (ticket <= 0) {
            Print("Ордер BuyStop по цене " + DoubleToStr(цена_открытия,Digits) + " не был открыт. Ошибка " + GetLastError());
         } else { Print("Ордер успешно открыт. Ticket = ", ticket); break; }
         Sleep(10000);
      }
   }
   
   if (тип == OP_SELLSTOP) {
      if (номер_ордера == 1) {
         tp = NormalizeDouble(цена_открытия - тэйк_профит_1*Point, Digits);
         sl = NormalizeDouble(цена_открытия + стоп_лосс*Point,     Digits);
         комментарий = "Breaking Point Sell #1";
      } else if (номер_ордера == 2) {
         tp = NormalizeDouble(цена_открытия - тэйк_профит_2*Point, Digits);
         sl = NormalizeDouble(цена_открытия + стоп_лосс*Point,     Digits);
         комментарий = "Breaking Point Sell #2";
      } else if (номер_ордера == 3) {
         tp = 0.0;
         sl = NormalizeDouble(цена_открытия + стоп_лосс*Point,   Digits);
         комментарий = "Breaking Point Sell #3";
      }
      while (true) {
         ticket = OrderSend(Symbol(),OP_SELLSTOP,лот,цена_открытия,проскальзывание,sl,tp,комментарий,магический_номер,0,Red);
         if (ticket < 0) {
            Print("Ордер SellStop по цене " + DoubleToStr(цена_открытия,Digits) + " не был открыт. Ошибка " + GetLastError());
         } else { Print("Ордер успешно открыт. Ticket = ", ticket); break; }
         Sleep(10000);
      }      
   }
}

void определяем_нужные_нам_уровни()
{
   double mid_price = (Ask+Bid)/2.0;
   
   for (int i = 0; i < 8; i++) {
      if (i < 4) all_level[i] = (high_level[i]  - mid_price)/Point;
      if (i > 3) all_level[i] = (low_level[i-4] - mid_price)/Point;
   }
   ArraySort(all_level,0,0,MODE_ASCEND);
   
   int n = 0;
   for (i = 0; i < 8; i++) {
      if (MathAbs(all_level[i]) < расстояние_от_цены) { all_level[i] = 0.0; }
   }
   
   if (поиск_положительного() > 0) {
      buy_level = MathAbs(поиск_положительного()*Point + mid_price);
      Print("Успешно найден уровень в бай: " + DoubleToStr(buy_level,Digits)); 
   } else {
      Print("Все уровни ниже текущей цены!");
   }
   
   if (поиск_отрицательного() < 0) {
      sell_level = MathAbs(поиск_отрицательного()*Point + mid_price);
      Print("Успешно найден уровень в сэл: " + DoubleToStr(sell_level,Digits)); 
   } else {
      Print("Все уровни выше текущей цены!");
   }  
}

double поиск_положительного()
{
   double min = 10000000;
   for (int i = 0; i < 8; i++) {
      if (all_level[i] > 0) {
         if (all_level[i] < min) {
            min = all_level[i];
         }
      }
   }
   if (min == 10000000) return (-1);
   else                 return (min);
}

double поиск_отрицательного()
{
   double max = -10000000;
   for (int i = 0; i < 8; i++) {
      if (all_level[i] < 0) {
         if (all_level[i] > max) {
            max = all_level[i];
         }
      }
   }
   if (max == -10000000) return (1);
   else                  return (max);
}

void рисуем_уровни()
{
   for (int i = 0; i < 4; i++) {
      high_level[i] = iHigh(Symbol(),PERIOD_D1,i+1) + отступ_от_уровня*Point;
      накалякаем_линии(name_high + DoubleToStr(i,0), high_level[i], цвет_хая, стиль_хая);
      low_level[i]  =  iLow(Symbol(),PERIOD_D1,i+1) - отступ_от_уровня*Point;
      накалякаем_линии(name_low  + DoubleToStr(i,0),  low_level[i], цвет_лоя, стиль_лоя);      
   }
}

void накалякаем_линии(string имя_линии, double цена_коорд, color цвет_линии, int стиль_линии) 
{
   if (ObjectFind(  имя_линии) != 0) {
      ObjectCreate( имя_линии, OBJ_HLINE, 0, Time[0], цена_коорд);
      ObjectSet(    имя_линии, OBJPROP_STYLE, стиль_линии);
      ObjectSet(    имя_линии, OBJPROP_COLOR, цвет_линии);
      ObjectSet(    имя_линии, OBJPROP_WIDTH, 0);
      return;
   }
   
   ObjectDelete( имя_линии);
   ObjectCreate( имя_линии, OBJ_HLINE, 0, Time[0], цена_коорд);
   ObjectSet(    имя_линии, OBJPROP_STYLE, стиль_линии);
   ObjectSet(    имя_линии, OBJPROP_COLOR, цвет_линии);
   ObjectSet(    имя_линии, OBJPROP_WIDTH, 0);
}

void проверка_на_пятизнак()
{
   if (Digits == 3 || Digits == 5) {
      расстояние_от_цены *= 10;
      отступ_от_уровня   *= 10;
      тэйк_профит_1      *= 10;
      тэйк_профит_2      *= 10;
      стоп_лосс          *= 10;
      проскальзывание    *= 10;
   }
}

/*
открываешь утром в пн терминал (не важно во сколько). Кидаешь скрипт, он рисует уровни. 
по хай лоу предыдущим вт, ср, чт, пт с отступом в 5 пунктов. и по этим уровням выставил 
отложки 3 штуки. СЛ весзде 40 пп, ТП 1 50пп, ТП2 100 пп, Третий ордер без ТП. Еще модно 
бы функцию, чтобы выставлял 2 или 3 отложки на выбор. т.е. либо две с ТП, либо еще к ним 
добавлял третий ордер без ТП. вроде все)

ну и чтобы потом все ордера можно было двигать

а добавь тогда еще в экстерны размер отступа, если не сложно; отступа от хай лоу
*/