Индикатор математических уровней Мюррея по алгоритму Vladyslav Goshkov

 

Есть индикатор для MT5 на основе алгоритма  Vladyslav Goshkov 

Находится по ссылке 

В нем есть кусок кода без комментариев (в оригинале Владислава по ссылке  их тоже нет).

Ответов по значениям переменных и описания вычислений в ветке где Владислав выложил код для MT4 - я не нашел :(

Если кто-то предметно понимает (пошагово) назначение вычислений (зачем и почему?) просьба прокомментировать.

Интересует конкретно кусок после вычисления range:

Чем является переменная sum? Зачем нам логарифм в этой конструкции? ( double sum=MathFloor(MathLog(fractal/range)/MathLog(2)); )

Почему октава вычисляется как произведение "ритма (ритма? верно ведь?)" * 0.5 в степени sum ( double octave=fractal*(MathPow(0.5,sum)); )?

Что означают переменные mn и mx?  (чем они вообще являются).

Что вычисляется для значений x1..x6 и y1..y6 ? (чем они вообще являются, откуда в вычислениях берутся цифры 9, 16, 5, 8 и т.д.).

Дебажить не посылать - уже дебажил, понятнее не стало, непонятна логика вычислений.

void CalcMurreyMath(int index,const double &high[],const double &low[])
  {
   double min=low[ArrayMinimum(low,index-(CalculationPeriod+StepBack),CalculationPeriod+StepBack)];
   double max=high[ArrayMaximum(high,index-(CalculationPeriod+StepBack),CalculationPeriod+StepBack)];
   double fractal=DetermineFractal(max);
   double range=max-min;
   double sum=MathFloor(MathLog(fractal/range)/MathLog(2));
   double octave=fractal*(MathPow(0.5,sum));
   double mn=MathFloor(min/octave)*octave;
   double mx=mn+(2*octave);
   if((mn+octave)>=max)
      mx=mn+octave;
// calculating xx
//x2
   double x2=0;
   if((min>=(3*(mx-mn)/16+mn)) && (max<=(9*(mx-mn)/16+mn)))
      x2=mn+(mx-mn)/2;
//x1
   double x1=0;
   if((min>=(mn-(mx-mn)/8)) && (max<=(5*(mx-mn)/8+mn)) && (x2==0))
      x1=mn+(mx-mn)/2;
//x4
   double x4=0;
   if((min>=(mn+7*(mx-mn)/16)) && (max<=(13*(mx-mn)/16+mn)))
      x4=mn+3*(mx-mn)/4;
//x5
   double x5=0;
   if((min>=(mn+3*(mx-mn)/8)) && (max<=(9*(mx-mn)/8+mn)) && (x4==0))
      x5=mx;
//x3
   double x3=0;
   if((min>=(mn+(mx-mn)/8)) && (max<=(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;
   
   int shift=index-ShiftBarsForward;
   Buffer1[shift]=(finalL-dmml*2); //-2/8
   Buffer2[shift]=Buffer1[shift]+dmml;
   Buffer3[shift]=Buffer2[shift]+dmml;
   Buffer4[shift]=Buffer3[shift]+dmml;
   Buffer5[shift]=Buffer4[shift]+dmml;
   Buffer6[shift]=Buffer5[shift]+dmml;
   Buffer7[shift]=Buffer6[shift]+dmml;
   Buffer8[shift]=Buffer7[shift]+dmml;
   Buffer9[shift]=Buffer8[shift]+dmml;
   Buffer10[shift]=Buffer9[shift]+dmml;
   Buffer11[shift]=Buffer10[shift]+dmml;
   Buffer12[shift]=Buffer11[shift]+dmml;
   Buffer13[shift]=Buffer12[shift]+dmml;
   //EMPTY_VALUE
   if(Buffer1[shift]!=Buffer1[shift-1]) Buffer1[shift-1]=EMPTY_VALUE;
   if(Buffer2[shift]!=Buffer2[shift-1]) Buffer2[shift-1]=EMPTY_VALUE;
   if(Buffer3[shift]!=Buffer3[shift-1]) Buffer3[shift-1]=EMPTY_VALUE;
   if(Buffer4[shift]!=Buffer4[shift-1]) Buffer4[shift-1]=EMPTY_VALUE;
   if(Buffer5[shift]!=Buffer5[shift-1]) Buffer5[shift-1]=EMPTY_VALUE;
   if(Buffer6[shift]!=Buffer6[shift-1]) Buffer6[shift-1]=EMPTY_VALUE;
   if(Buffer7[shift]!=Buffer7[shift-1]) Buffer7[shift-1]=EMPTY_VALUE;
   if(Buffer8[shift]!=Buffer8[shift-1]) Buffer8[shift-1]=EMPTY_VALUE;
   if(Buffer9[shift]!=Buffer9[shift-1]) Buffer9[shift-1]=EMPTY_VALUE;
   if(Buffer10[shift]!=Buffer10[shift-1]) Buffer10[shift-1]=EMPTY_VALUE;
   if(Buffer11[shift]!=Buffer11[shift-1]) Buffer11[shift-1]=EMPTY_VALUE;
   if(Buffer12[shift]!=Buffer12[shift-1]) Buffer12[shift-1]=EMPTY_VALUE;
   if(Buffer13[shift]!=Buffer13[shift-1]) Buffer13[shift-1]=EMPTY_VALUE;
  }

 
Вы что, считаете, что автор алгоритма Владислав Горшков? Само название индикатора как бы намекает, что его автор, это некто по имени Мюррей -  Томас Хеннинг Мюррей
 
И что вы так все тут любите показывать отрывки из обрывков кода? Где функция DetermineFractal?
 
Можно Влада спросить 

 
Dmitry Fedoseev:
Вы что, считаете, что автор алгоритма Владислав Горшков? Само название индикатора как бы намекает, что его автор, это некто по имени Мюррей -  Томас Хеннинг Мюррей

1. Я в курсе кто такой Мюррей, Ганн, и что Влад по мотивами изложений Тимом Крузелом своего понимания линий Мюррея -  написал алгоритм. Вопрос по реализации.

2. Да, я считаю что автор алгоритма, его программной реализации в том виде в котором она есть во всех индикаторах линий Мюррея - Vladyslav Goshkov

3. Если Вы зашли для "поделать замечания", то спасибо, такая помощь не очень нужна, это в ветки с флудом.

 
Dmitry Fedoseev:
И что вы так все тут любите показывать отрывки из обрывков кода? Где функция DetermineFractal?

Если после приведения функции определения фрактала Вы поможете решить вопрос, я буду очень рад и благодарен Вам.

Вы ведь не пройдете мимо? )

double DetermineFractal(double v)
  {
   if(v<=250000 && v>25000)
      return(100000);
   if(v<=25000 && v>2500)
      return(10000);
   if(v<=2500 && v>250)
      return(1000);
   if(v<=250 && v>25)
      return(100);
   if(v<=25 && v>12.5)
      return(12.5);
   if(v<=12.5 && v>6.25)
      return(12.5);
   if(v<=6.25 && v>3.125)
      return(6.25);
   if(v<=3.125 && v>1.5625)
      return(3.125);
   if(v<=1.5625 && v>0.390625)
      return(1.5625);
   if(v<=0.390625 && v>0)
      return(0.1953125);
   return(0);
  }
 
Roman Kutemov:
Можно Влада спросить 

Я его позвал в тред, отправил ему ссылку на топик в личку с просьбой заглянуть, но он к сожалению пока молчит.

 
double sum=MathFloor(MathLog(fractal/range)/MathLog(2));

Это вычисление логарифма по основанию 2. 

 
White Rabbit:

...

2. Да, я считаю что автор алгоритма, его программной реализации в том виде в котором она есть во всех индикаторах линий Мюррея - Vladyslav Goshkov

...

Алгоритм и программная реализация не одно и тоже. Предполагаю, что Владислав нашел где-то код и просто переписал его, чтобы разобраться. Потому что видел индикатор с этими уровнями еще задолго до появления здесь Владислава.

 

Фактический диапазон - это "октава" в которой "играем". Тогда вот это вычисление:

sum=MathFloor(MathLog(fractal/range)/MathLog(2));

Это вычисление номера октавы, в которой идет игра.

--

octave=fractal*(MathPow(0.5,sum));

Это вычисление середины рабочей октавы...

Что-то типа поиска "отражения" реальных котировок на некую идеальную гармоническую систему (или наоборот). Этот вопрос может только сам Мюррей раскрыть. 

В интернете говорят, что это некая адаптация квадрата Ганна.

Больше всего вопросов вызывает функция DetermineFractal - не просматривается система, сначала уровни на 10 уменьшаются, потом делятся на 2.

 
Dmitry Fedoseev:

Фактический диапазон - это "октава" в которой "играем". Тогда вот это вычисление:

Это вычисление номера октавы, в которой идет игра.

--

Это вычисление середины рабочей октавы...

Что-то типа поиска "отражения" реальных котировок на некую идеальную гармоническую систему (или наоборот). Этот вопрос может только сам Мюррей раскрыть. 

В интернете говорят, что это некая адаптация квадрата Ганна.

Больше всего вопросов вызывает функция DetermineFractal - не просматривается система, сначала уровни на 10 уменьшаются, потом делятся на 2.

Насколько я понимаю Владислав писал алгоритм опираясь на вот эти заметки (в аттаче) Тима Крузела.

В этом доке приводится таблица нахождения ритма ( DetermineFractal ) в том же виде, что и у Владислава.