Разностное исчисление, примеры. - страница 4

 
Yousufkhodja Sultonov:

При увеличении выборки до N=100, уравнение 4-ой степени дает следующий результат:



С математической точки зрения границы Вашего поиска очень размыты. Не могли бы вы по подробнее описать как это выглядит?

 
Nikolai Semko:

Да, я ошибся. Думал, что Вы, действительно, используете аппроксимацию. Посмотрел повнимательней Ваш код и понял, что это не аппроксимация, а просто банальное усреднение, пусть и весьма необычное. После чего Вы сдвигаете фиолетовую линию и красную линию на 72 бара влево, а красный хвостик из 92 баров дорисовываете, и он как раз перерисовывается с каждым новым баром. Синяя линия формируется из сдвинутой фиолетовой. И, кстати, правильнее использовать цену close, а не open. Если поменять на close, то сразу видно, что с каждым тиком красный хвостик из 92 баров прыгает.

Сдвижка влево скользящих средних не несет в себе никакой полезности и практического применения. А только служит для красивости, подгонки и обалванивания. 

Нужно понять разницу между аппроксимацией и сглаживанием (усреднением). При аппроксимации вычисляются на заданном отрезке данных коэффициенты какой-то функции (полиномиальные, Фурье, Безье, сплайны и т.д.) и  эти коэффициенты как правило меняются все с изменением хотя бы одного значения данных, поэтому функция и перерисовывается на всем промежутке наблюдаемых данных. А вот при усреднении считается только одна текущая точка на основе предыдущих данных, поэтому усреднения (сглаживания) не перерисовываются, но зато всегда запаздывают от данных в отличии от аппроксимации.
И не понял я, при чем здесь полином какой-то степени и бином Ньютона, если даже степеней то в коде никаких нет.

))

Угу, а теперь еще и синусоида без явно выраженной функции Sin.

Разностное уравнение для синуса: https://dxdy.ru/post1247421.html#p1247421

      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a2_Buffer[i]=  2701*a1_Buffer[i]   -5328   *a1_Buffer[i+1 ]    +  2628 *a1_Buffer[i+2 ];

      a4_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}

      a3_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a3_Buffer[i+0+z]=  2.998096443*a3_Buffer[i+1+z]  -  2.998096443*a3_Buffer[i+2+z]   +   1*a3_Buffer[i+3+z]   ;  }}

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}

      a6_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a6_Buffer[i+0+z]=  3.998096443*a6_Buffer[i+1+z]  -  5.996192886*a6_Buffer[i+2+z]   +   3.998096443*a6_Buffer[i+3+z]  -  1*a6_Buffer[i+4+z] ;  }}

Выделен расчет синусоид с периодом 144. Первая около константы (на рисунке зеленая), вторая около наклонной прямой (на рисунке красная). 

Рекуррентная формула для синуса : Дискуссионные темы (М) - Страница 7
  • dxdy.ru
В принципе, используется и рекуррентное вычисление через возвратное уравнение второго порядка, и через комплексную экспоненту. Первое менее расходно по ресурсам (умножение и два сложения и две ячейки памяти) по сравнению со вторым (два умножения, четыре сложения, две ячейки памяти при постоянной частоте), но накапливается погрешность быстрее...
 

Наверно, нужно было сразу приложить  к ветке "список литературы". ))

Литературы по теме много, поэтому предложу на свой вкус пару тонких книг:

Исчисление конечных разностей  Леонид Кузьмич Лахтин 

Маркушевич А.И. Возвратные последовательности

 
Aleksey Panfilov:

))

Угу, а теперь еще и синусоида без явно выраженной функции Sin.

Разностное уравнение для синуса: https://dxdy.ru/post1247421.html#p1247421

Выделен расчет синусоид с периодом 144. Первая около константы (на рисунке зеленая), вторая около наклонной прямой (на рисунке красная). 


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

Алексей, насколько я понял, Вы профи в вопросе рекурсии. Лично я в этом дуб дубом. У меня к Вам вопрос, просьба и предложение. Сможете с помощью Ваших методов убыстрить аппроксимацию методом Фурье? Что-то мне подсказывает что это возможно. Если Вам это удастся, то это будет просто ВАУ!!! и практическая польза будет колоссальная. Я прикрепляю пример аппроксимации с экстраполяцией методом Фурье на MT5 ( просто он гораздо быстрей работает и попросту лучше ). Этот пример я взял отсюда и немного усовершенствовал его для наглядности, добавив управление с помощью мышки и клавиш Ctrl (изменяет стартовую позицию) и Shift (меняет период наблюдения с одновременным изменение количества гармоник). Сможете попробовать?

Управление этим индикатором следующее: предварительно щелкнув на график мышкой (для активации окна) нажмите Ctrl (и отпустите) и двигайте мышкой для изменения стартовой позиции, чтобы закончить процесс, нажмите любую клавишу (кроме Ctrl и Shift). Тоже самое с клавишей Shift для изменения периода (диапазона баров для вычисления аппроксимирующей функции).

Файлы:
Fourier.mq5  16 kb
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Разностное исчисление, примеры.

Nikolai Semko, 2018.01.12 00:43


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


Николай, спасибо за сообщение и приложенный индикатор.

И полностью согласен, прежде всего необходимо однозначное понимание терминов и названий.

Объясню свою позицию.

По двум точкам можно провести прямую, значит найти любую точку этой прямой, или внутри интервала между точками (интерполяция), или за пределами интервала между точками (экстраполяция).

По трем точкам можно провести однозначную кривую соответствующую например квадратной параболе, выражаемую в декартовой системе координат линейным квадратным уравнением. Это значит, также можно найти любую точку этой кривой как внутри интервала между крайними точками (интерполяция), так и вне этого интервала (экстраполяция). При этом закон по которому строятся эти точки остается полиноминальным. Добавлю, также по трем точкам, как минимум, можно провести однозначную синусоиду, если предположить синусоидальный закон развития, или окружность если предположить её наличие.

Таким образом интерполяция полиномом второй степени по трем точкам (в нашем случае, две из которых накапливают предыдущую историю а третья несет новую информацию) четвертой, оказывается необходимым (могут быть и другие законы) и достаточным определением действия или процесса.

Конечно, если Вы не предложите других терминов для этого.

При этом я полностью согласен, что если необходимо построить кривую по числу значений превышающих минимально необходимое число, то нужно использовать статистически (или иным способом) обоснованные методы взвешивания значений, в том числе регрессию.
 
Aleksey Panfilov:


Николай, спасибо за сообщение и приложенный индикатор.

И полностью согласен, прежде всего необходимо однозначное понимание терминов и названий.

Объясню свою позицию.

По двум точкам можно провести прямую, значит найти любую точку этой прямой, или внутри интервала между точками (интерполяция), или за пределами интервала между точками (экстраполяция).

По трем точкам можно провести однозначную кривую соответствующую например квадратной параболе, выражаемую в декартовой системе координат линейным квадратным уравнением. Это значит, также можно найти любую точку этой кривой как внутри интервала между крайними точками (интерполяция), так и вне этого интервала (экстраполяция). При этом закон по которому строятся эти точки остается полиноминальным. Добавлю, также по трем точкам, как минимум, можно провести однозначную синусоиду, если предположить синусоидальный закон развития, или окружность если предположить её наличие.

Таким образом интерполяция полиномом второй степени по трем точкам (в нашем случае, две из которых накапливают предыдущую историю а третья несет новую информацию) четвертой, оказывается необходимым (могут быть и другие законы) и достаточным определением действия или процесса.

Конечно, если Вы не предложите других терминов для этого.

При этом я полностью согласен, что если необходимо построить кривую по числу значений превышающих минимально необходимое число, то нужно использовать статистически (или иным способом) обоснованные методы взвешивания значений, в том числе регрессию.

Как по трем точкам строить полиномиальную кривую я реализовал недавно в этом коде . Советую с ним ознакомиться.

Но в вашем коде нет расчета полинома по трем точкам:

Aleksey Panfilov:

На графике выглядит так:

Сине-красная линия интерполяция (нахождение точки внутри интервала) полиномом 4 ой степени с плечом 72.

a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

Тонкая синяя линия  экстраполяция (нахождение точки вне интервала) полиномом 2 ой степени с плечом 78.

a2_Buffer[i]=  3160*a1_Buffer[i]   -6240   *a1_Buffer[i+1 ]    +  3081*a1_Buffer[i+2 ];

Красная, это линия построения полинома 4 ой степени. Она перерисовывается и опирается на точку открытия последнего бара.

a4_Buffer[i+92]=a1_Buffer[i];   if(i<=10) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}


То что вы называете полиномом 2-й степени и полиномом 4-й степени таковыми полиномами не являются. 

Так как формула полинома 2-й степени:

Price = a+b*i+c*i²

а формула полинома 4-й степени:

Price = a+b*i+c*i²+d*i³+f*i⁴

где

a,b,c,d,f - коэффициенты, которые необходимо вычислять

i - номер бара.

А у вас витиеватый способ усреднения, в котором (на примере того, что вы называете полиномом 2-й степени) текущая точка одной линии  i рассчитывается  из последних трех точек (i,i+1 и i+2) другой линии с различными весовыми коэффициентами. Это и называется усреднение (или сглаживание). Поэтому Вы и сдвинули график на 72 бара влево, чтоб спрятать запаздывание графика, которое происходит в результате именно усреднения.

В моем же примере  расчет полинома по трем точкам четко и наглядно виден.

 
Nikolai Semko:

В моем же примере  расчет полинома по трем точкам четко и наглядно виден.

Индикатор у Вас очень хороший.

Если такой же у Вас есть для четверки то приложите его к любым трем точкам серенькой линии индикатора из сообщения 23 этой ветки.

Эта линия (серая) рассчитывается в буфере:

 a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}
   1*Y1-3*Y2+3*Y3-1*Y4 =0 - разностное уравнение параболы второй степени. Для равноотстоящих точек.
 
Aleksey Panfilov:

Индикатор у Вас очень хороший.

Если такой же у Вас есть для четверки то приложите его к любым трем точкам серенькой линии индикатора из сообщения 23 этой ветки.

Эта линия (серая) рассчитывается в буфере:

   1*Y1-3*Y2+3*Y3-1*Y4 =0 - разностное уравнение параболы второй степени. Для равноотстоящих точек.

у меня там дальше в комментариях есть код для МТ4

Да серая линия у вас полином. И красный хвостик из 92 бар из 2 сообщения , который вы дорисовываете к сдвинутой усредненной,  тоже полином и он как раз перерисовывается. Но Вы же все остальное тоже обзываете полиномом и при этом утверждали что ваш полином не перерисовывается. А это не так. Поэтому я и прошу называть вещи своими именами.

И кстати в моем примере формирование следующих точек в полиноме происходит через расчет коэффициентов и этот алгоритм быстрее чем ваше "разностное исчисление", хотя я тоже применяю разность с предыдущим значением:

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

ваш вариант:

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }
 
Nikolai Semko:

у меня там дальше в комментариях есть код для МТ4

Да серая линия у вас полином. И красный хвостик из 92 бар из 2 сообщения , который вы дорисовываете к сдвинутой усредненной,  тоже полином и он как раз перерисовывается. Но Вы же все остальное тоже обзываете полиномом и при этом утверждали что ваш полином не перерисовывается. А это не так. Поэтому я и прошу называть вещи своими именами.


Да, согласен полиномом второй степени связаны только 4 точки участвующие в построении, или 6 точек для полинома четвертой степени. Вся линия которая получается и не перерисовывается конечно не полином, она только построена в рассмотренных случаях при помощи полинома определенной степени.

Тонкие линии только визуализируют те полиномы при помощи которых строится очередная точка.

Похоже о терминах мы договорились. :) 


И кстати в моем примере формирование следующих точек в полиноме происходит через расчет коэффициентов и этот алгоритм быстрее чем ваше "разностное исчисление", хотя я тоже применяю разность с предыдущим значением:

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

ваш вариант:

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }

По поводу скорости Вы скорее всего правы.

Предлагаю пока не касаться вопросов быстродействия и наверно, небрежностей (прежде всего моих:))   ) в написании кода, конечно если они не критичны.

 
Nikolai Semko:

 Сможете с помощью Ваших методов убыстрить аппроксимацию методом Фурье? Что-то мне подсказывает что это возможно. Если Вам это удастся, то это будет просто ВАУ!!! и практическая польза будет колоссальная. Я прикрепляю пример аппроксимации с экстраполяцией методом Фурье на MT5 ( просто он гораздо быстрей работает и попросту лучше ). Этот пример я взял отсюда и немного усовершенствовал его для наглядности, добавив управление с помощью мышки и клавиш Ctrl (изменяет стартовую позицию) и Shift (меняет период наблюдения с одновременным изменение количества гармоник). Сможете попробовать?

Управление этим индикатором следующее: предварительно щелкнув на график мышкой (для активации окна) нажмите Ctrl (и отпустите) и двигайте мышкой для изменения стартовой позиции, чтобы закончить процесс, нажмите любую клавишу (кроме Ctrl и Shift). Тоже самое с клавишей Shift для изменения периода (диапазона баров для вычисления аппроксимирующей функции).


По поводу Фурье, тема богатая. При наличии интереса, будем её касаться периодически. 

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

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