//+------------------------------------------------------------------+
//|                                                     JL-Lines.mq4 |
//+------------------------------------------------------------------+
/*http://www.kroufr.ru/forum/index.php?PHPSESSID=4dd2e6b4e6ae4fa1b491b38e49a2f99c&topic=3180.0
Как торговать по JL-линиям?  

Теперь вы нанесли на график линии и можете торговать по ним. 
Я только опишу, мою методику торговли, вы можете выбрать свою тактику и свои правила. 
Я использую часовые графики, также возможно использовать 4-часовые, 30-минутные, 15-минутные и так далее. Помните, однако, что чем меньше временной диапазон, тем меньше его важность для использования. 
Сделки открываются при закрытии бара, не перед закрытием. На моих графиках также используются пивоты, вчерашние максимумы и минимумы и линии туннелей Вегаса. Это дополнительные инструменты, которые вы также можете при желании использовать. 
Для некоторых из вас мой стоп-лосс может показаться слишком жестким, вы можете использовать свой стоп-лосс. Лично я предпочитаю в течении пяти дней нести небольшие убытки, а затем компенсировать их большой прибылью. При использовании этой стратегии большие последовательности убыточных дней мне не встречались. 
За последние пять недель моя прибыль при работе по системе составила 843 пипса. Я торгую по паре фунт/доллар. 

Правила для длинных позиций. 
Длинная позиция открывается, если свеча закрывается между линией Пробоя А уровнем стопа Н. 
Стоп-лосс размещается на уровне дневного открытия. Вы можете разместить стоп-лосс на уровне пробоя В. 
Когда моя прибыль составляет 20 пипсов, я сдвигаю стоп-лосс на уровень Пробоя А. 
Если цена продолжает двигаться в моем направлении, я сдвигаю стоп-лосс на ближайшую линию (JL, пивот, линии максимумов и минимумов или Вегеса), если цена находится на 30 пипсов выше этой линии. 
Позиция не открывается, если свеча открывается под линией Пробоя А и закрывается над уровнем стопа Н. 

Правила для коротких позиций. 
Короткая позиция открывается, когда свеча закрывается между линией Пробоя В и стопом L. 
Стоп-лосс размещается на уровне дневного открытия или на линии Пробоя А. 
При получении прибыли 20 пипсов, я сдвигаю стоп-лосс на уровень пробоя В. 
Если цена продолжает двигаться в мою сторону, я сдвигаю стоп-лосс на ближайшую линию, если цена находится на 30 пипсов ниже ее. 
Сделка не открывается, если свеча открылась выше уровня Пробоя В, закрывшись ниже Стопа L. 
Специальный стоп-лосс. 
Если канал уже 40 пипсов, при открытии длинной позиции в качестве уровня стоп-лосса используется уровень Пробоя В. При открытии короткой позиции в качестве стоп-лосса используется уровень Пробоя А. 

Тайм-фреймы. 
Тактика работает также с недельными и месячными графиками, но ваш стоп-лосс при этом будет намного больше. Если вы используете недельный график, то вам надо рассчитать недельные диапазоны от открытия до закрытия и от максимума до минимума, как это было описано выше. После этого вам необходимо открыть позиции на дневном или 4-часовом графике. 
Соответственно при вычислении линий по месячному графику, вы открываете позиции на недельном или дневном диапазонах. 
Я никогда не торговал на этих тайм-фреймах, поскольку не могу позволить себе такого большого стоп-лосса. 
Моя рекомендация: высчитывать линии по дневным графикам и открывать позиции по часовым.
*/
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 LightSkyBlue
#property indicator_color2 Tomato
#property indicator_color3 Blue
#property indicator_color4 Red

//---- buffers
double BreakA[],
       BreakB[],
       StopH[],
       StopL[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   IndicatorShortName("JL-Lines");
//---- indicators
   SetIndexLabel (0,"Break A");
   SetIndexStyle (0,DRAW_LINE);
   SetIndexBuffer(0,BreakA);
   SetIndexLabel (1,"Break B");
   SetIndexStyle (1,DRAW_LINE);
   SetIndexBuffer(1,BreakB);
   SetIndexLabel (2,"Stop H");
   SetIndexStyle (2,DRAW_LINE);
   SetIndexBuffer(2,StopH);
   SetIndexLabel (3,"Stop L");
   SetIndexStyle (3,DRAW_LINE);
   SetIndexBuffer(3,StopL);
//----
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
//----
   for (int i = Bars-IndicatorCounted(); i >= 0; i--)
   {
      if(TimeHour(iTime(NULL,0,i)) != 0)
      {
         BreakA[i] = BreakA[i+1];
         BreakB[i] = BreakB[i+1];
         StopH [i] = StopH [i+1];
         StopL [i] = StopL [i+1];
         continue;
      }

      int candlesPerDay = PERIOD_D1/Period(),
          day           = MathFloor(i/candlesPerDay);

      double channel1 = 0.0,
             channel2 = 0.0;

      channel1 += 1.000*MathAbs(iOpen(NULL,PERIOD_D1,day+1)-iClose(NULL,PERIOD_D1,day+1));
      channel1 += 0.618*MathAbs(iOpen(NULL,PERIOD_D1,day+2)-iClose(NULL,PERIOD_D1,day+2));
      channel1 += 0.500*MathAbs(iOpen(NULL,PERIOD_D1,day+3)-iClose(NULL,PERIOD_D1,day+3));
      channel1 += 0.382*MathAbs(iOpen(NULL,PERIOD_D1,day+4)-iClose(NULL,PERIOD_D1,day+4));
      channel1 += 0.236*MathAbs(iOpen(NULL,PERIOD_D1,day+5)-iClose(NULL,PERIOD_D1,day+5));
      channel2 += 1.000*(iHigh(NULL,PERIOD_D1,day+1)-iLow(NULL,PERIOD_D1,day+1));
      channel2 += 0.618*(iHigh(NULL,PERIOD_D1,day+2)-iLow(NULL,PERIOD_D1,day+2));
      channel2 += 0.500*(iHigh(NULL,PERIOD_D1,day+3)-iLow(NULL,PERIOD_D1,day+3));
      channel2 += 0.382*(iHigh(NULL,PERIOD_D1,day+4)-iLow(NULL,PERIOD_D1,day+4));
      channel2 += 0.236*(iHigh(NULL,PERIOD_D1,day+5)-iLow(NULL,PERIOD_D1,day+5));
      
      channel1 /= 5.0;
      channel2 /= 5.0;

      double open = iOpen(NULL,PERIOD_D1,day);
      BreakA[i] = open+0.5*channel1;
      BreakB[i] = open-0.5*channel1;
      StopH[i]  = open+0.5*channel2;
      StopL[i]  = open-0.5*channel2;
      
      Comment("JL-Lines: "+DoubleToStr(channel1/Point,0)+", "+DoubleToStr(channel2/Point,0));
   }
//----
   return(0);
}
//+------------------------------------------------------------------+