Страница 1 из 1

Индикатор уровней Мюррея

Добавлено: 08 июл 2017, 22:53
Kurono
Индикатор уровней Мюррея
Автор: ох
кеш гугла

Сайбер:
ох, сравнил на дневках, все сходится и отображается корректно. Ответьте пожалуйста еще на пару вопросов.
1. Какой период в исходнике использовать на недельных и месячных графиках?
2. Индикатор будет автоматом перерисовываться или необходимо будет делать какие-нибудь манипуляции?

ox:Ответ
1) период = 90 * (1440 / Period()),
для дневок функций Period() возвращает 1440 -> ставим 90
для месяца и недели функций Period()я не знаю, что возвращает,
но по логике
для месяца ставим = 3
для недели ставим = 3*4 = 12

2) Будет сам

29.05.2015 12:43
ox:
Исправлено. Быстрее работает. Не использует MY.High и MY.Low b сохраняется.


Код: Выделить всё

function Initialize()
{
 IndicatorName = "LevelMurrey";   
 PriceStudy = true;
 AddInput("Input", Inputs.Candle);   
 AddSeries("LevelMurrey", DrawAs.Line, Color.Red);   

//0 "extremely overshoot [-2/8]";// [-2/8]
AddLevel(0, Color.White, "LevelMurreyDay");
//1 "overshoot [-1/8]";// [-1/8]
AddLevel(0, Color.White, "LevelMurreyDay");
//2 "Ultimate Support - extremely oversold [0/8]";// [0/8]
AddLevel(0, Color.Aqua, "LevelMurreyDay");
//3 "Weak, Stall and Reverse - [1/8]";// [1/8]
AddLevel(0, Color.Yellow, "LevelMurreyDay");
//4 "Pivot, Reverse - major [2/8]";// [2/8]
AddLevel(0, Color.Red, "LevelMurreyDay");
//5 "Bottom of Trading Range - [3/8], if 10-12 bars then 40% Time. BUY Premium Zone";//[3/8]
AddLevel(0, Color.Green, "LevelMurreyDay");
//6 "Major Support/Resistance Pivotal Point [4/8]- Best New BUY or SELL level";// [4/8]
AddLevel(0, Color.Blue, "LevelMurreyDay");
//7 "Top of Trading Range - [5/8], if 10-12 bars then 40% Time. SELL Premium Zone";//[5/8]
AddLevel(0, Color.Green, "LevelMurreyDay");
//8 "Pivot, Reverse - major [6/8]";// [6/8]
AddLevel(0, Color.Red, "LevelMurreyDay");
//9 "Weak, Stall and Reverse - [7/8]";// [7/8]
AddLevel(0, Color.Yellow, "LevelMurreyDay");
//10 "Ultimate Resistance - extremely overbought [8/8]";// [8/8]
AddLevel(0, Color.Aqua, "LevelMurreyDay");
//11 "overshoot [+1/8]";// [+1/8]
AddLevel(0, Color.White, "LevelMurreyDay");
//12 "extremely overshoot [+2/8]";// [+2/8]
AddLevel(0, Color.White, "LevelMurreyDay");

AddGlobalVariable("xMax", Types.Double, 0.0);
AddGlobalVariable("xMin", Types.Double, 0.0);
AddGlobalVariable("Uppers", Types.DoubleList);
AddGlobalVariable("Lowers", Types.DoubleList);

AddParameter("Period", 288, 1.0);
}

function Evaluate()
{
// Murrey Level for Period
// AlfaDirect 2015 // mql source Vladislav Goshkov (VG) // Paper Tim Kruzel

Uppers.Add(Input.High[0]);
Lowers.Add(Input.Low[0]);

if (CurrentIndex < Period)
{
      xMax = Input.High[0];
      xMin = Input.Low[0];
}
else
{
       Uppers.RemoveAt(0);
       xMax = Uppers.Max(x => x);
       Lowers.RemoveAt(0);
       xMin = Lowers.Min(x => x);
}

if (CurrentIndex == MaxIndex)
{
   double v2 = xMax;
   double v1 = xMin;
 
//determine fractal.....
   double fractal = 0;
   if( v2<=250000 && v2>25000 )
   fractal=100000;
   else
     if( v2<=25000 && v2>2500 )
     fractal=10000;
     else
       if( v2<=2500 && v2>250 )
       fractal=1000;
       else
         if( v2<=250 && v2>25 )
         fractal=100;
         else
           if( v2<=25 && v2>12.5 )
           fractal=12.5;
           else
             if( v2<=12.5 && v2>6.25)
             fractal=12.5;
             else
               if( v2<=6.25 && v2>3.125 )
               fractal=6.25;
               else
                 if( v2<=3.125 && v2>1.5625 )
                 fractal=3.125;
                 else
                   if( v2<=1.5625 && v2>0.390625 )
                   fractal=1.5625;
                   else
                     if( v2<=0.390625 && v2>0)
                     fractal=0.1953125;
     
   double range = (v2-v1);
   double sum = Math.Floor(Math.Log(fractal/range)/Math.Log(2));
   double octave = fractal*(Math.Pow(0.5, sum));
   double mn = Math.Floor(v1/octave)*octave;
   
   double mx = 0.0;
   if ( (mn+octave)>v2 )
     mx = mn+octave;
   else
     mx = mn+(2*octave);
// calculating xx
//x2
    double x2=0;
    if( (v1>=(3*(mx-mn)/16+mn)) && (v2<=(9*(mx-mn)/16+mn)) )
       x2 = mn+(mx-mn)/2;
//x1
     double x1=0;
    if( (v1>=(mn-(mx-mn)/8))&& (v2<=(5*(mx-mn)/8+mn)) && (x2==0) )
       x1=mn+(mx-mn)/2;
//x4
    double x4=0;
    if( (v1>=(mn+7*(mx-mn)/16))&& (v2<=(13*(mx-mn)/16+mn)) )
       x4=mn+3*(mx-mn)/4;
//x5
    double x5=0;
    if( (v1>=(mn+3*(mx-mn)/8))&& (v2<=(9*(mx-mn)/8+mn))&& (x4==0) )
       x5=mx;
//x3
    double x3=0;
    if( (v1>=(mn+(mx-mn)/8))&& (v2<=(7*(mx-mn)/8+mn))&& (x1==0) && (x2==0) && (x4==0) && (x5==0) )
       x3=mn+3*(mx-mn)/4;
//x6
    double x6=0;
    if( (x1+x2+x3+x4+x5) ==0 )
       x6=mx;
double finalH = x1+x2+x3+x4+x5+x6;
// calculating yy
//y1
    double y1=0;
    if( x1>0 )
       y1=mn;
//y2
    double y2=0;
    if( x2>0 )
       y2=mn+(mx-mn)/4;
//y3
    double y3=0;
    if( x3>0 )
       y3=mn+(mx-mn)/4;
//y4
    double y4=0;
    if( x4>0 )
       y4=mn+(mx-mn)/2;
//y5
    double y5=0;
    if( x5>0 )
       y5=mn+(mx-mn)/2;
//y6
    double y6=0;
    if( (finalH>0) && ((y1+y2+y3+y4+y5)==0) )
    y6=mn;
   double finalL = y1+y2+y3+y4+y5+y6;

double dmml = (finalH-finalL)/8;
Levels[0].Level = finalL-dmml*2;
Levels[1].Level = finalL-dmml*1;
Levels[2].Level = finalL-dmml*0;
Levels[3].Level = finalL+dmml*1;
Levels[4].Level = finalL+dmml*2;
Levels[5].Level = finalL+dmml*3;
Levels[6].Level = finalL+dmml*4;
Levels[7].Level = finalL+dmml*5;
Levels[8].Level = finalL+dmml*6;
Levels[9].Level = finalL+dmml*7;
Levels[10].Level = finalL+dmml*8;
Levels[11].Level = finalL+dmml*9;
Levels[12].Level = finalL+dmml*10;
}
}