Диалог автора. Александр Смирнов. - страница 14

 
Yurixx:
Prival:

Вот VBAG сначала выложил 1 индикатор, потом его заменил другим (я все видел :-) ), и выложил третий но уже эксперт. А картинки движущейся я так и не могу увидеть, которая меня убедит, что математик прав. Твердолобый такой "тупой" военный :-) на слепую веру не возмеш :-)


Не знаю, Сергей, зачем тебе движущиеся картинки, но могу сделать для тебя индикатор с 2-мя линиями. Одна LRMA, другая 3*LWMA-2*MA. Они будут полностью совмещаться, т.е. одна из них не будет видна из-за другой. Отключаешь цвет этой другой - видишь первую. Включаешь цвет - видишь только вторую.

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


Спасибо. Постараюсь сам. Отвлечься надо. Фильтр Калман доделал наконец-то. А вот запустить на тестере уже неделю не могу. Боюсь, вдруг получилось :-( . Ищу ошибки пытаюсь подготовить для него данные её лучше, сделать прогноз еще точнее. В маткаде работает, а вот в тестере боюсь запускать.

 
VBAG:
Если у Вас есть более рациональные алгоритмы расчетов машек или регрессии, было бы очень интересно взлянуть!

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

Например, простая SMA. Встроенный алгоритм должен быть универсальным и вычислять ее в любом месте независимо от контекста. А в собственной программе можно использовать результаты предыдущих вычислений. Чтобы вычислить новое значение SMA нужно взять сумму предыдущих N значений цены, вычесть из нее первое и прибавить новое - текущее. А потом эту сумму уже разделить на N. Следовательно нужно тащить за собой переменную с суммой предыдущих N цен и массивчик этих N цен и на каждом баре обновлять эту сумму и массивчик. В результате для вычисления SMA на каждом баре требуется выполнить 3 оператора: обновить сумму, обновить элемент массива, вычислить значение SMA. Никаких циклов.

 
Prival:

А вот запустить на тестере уже неделю не могу. Боюсь, вдруг получилось :-( .


Да, и такое бывает. :-))
 
LeoV писал:
Вот к примеру JMA и SSA с периодом 50. Правда у меня CSSA основанный на SSA но не перерисовывающий. Очень быстрый. Рекомендую этот алгоритм.....

Off-topic, конечно, но все равно интересно - LeoV, а не могли бы Вы показать картинку индикатора CSSA Cycles того же разработчика (очень уж красиво смотрится на акциях) ? Хочется посмотреть, как он выглядит на котировках Forex.
 
Yurixx:
Такая метода, наверное, имеет смысл, но только если периоды небольшие. И память не главная причина. При перезагрузке будет теряться то, что за собой тащим. А вообще здорово.Спасибо за ответ.
 
Prival:

Фильтр Калман доделал наконец-то.

Говорят Вы тему Кальмана продавили? А я чегой-то обсуждение это пропустил. Где можно посмотреть об этом?

P.S. Прицепил файлик по теме - может кому интересно будет.
 
Да уж, назвался груздем - полезай в кузов. ОК, Сергей, вот тебе доказательство (все равно оно мне нужно, для собственной уверенности):

Пусть у нас есть отсчеты времени - t = 1, 2, ... N. Нумерация - обратная принятой в MQL4, т.е. N - текущий бар, "нулевой". Этим отсчетам соответствуют клоузы Сlose(1), Сlose(2), ... Сlose(N). Попробуем построить прямую y = A*t+B, проходящую через клоузы по МНК. А затем вычислим А*N + B, т.е. LRMA на текущем баре.

Вычисляем сумму квадратов ошибок:

Delta^2 = Sum( ( y(i) - Close(i) )^2; i = 1..N ) = Sum( ( A*i + B - Close(i) )^2; i = 1..N )

Дифференцируем эту шнягу по А и В и получаем систему уравнений для оптимальных к-тов А и В:

Sum( ( A*i + B - Close(i) ) * i ); i = 1..N ) = 0
Sum( A*i + B - Close(i) ); i = 1..N ) = 0

Раскрывая суммы, получаем (диапазоны индексов я опускаю для упрощения записи):

А*Sum( i^2 ) + B*Sum( i ) = Sum( i*Close(i) )
А*Sum( i ) + B*Sum( 1 ) = Sum( Close(i) )

Prival, теперь смотри на правые части. Сумма справа в первом уравнении - это уже почти LWMA, только без нормирующего к-та. Во втором - это SMA, тоже без него. Вот точные формулы для этих машек:

LWMA = 2/(N*(N+1)) * Sum( i*Close(i) )
SMA = 1/N * Sum( Close(i) )

Теперь вспоминаем, чему равна сумма квадратов натуральных от 1 до N (это N*(N+1)*(2*N+1)/6), подставляем в нашу систему и получаем:

А * N*(N+1)*(2*N+1)/6 + В * N*(N+1)/2 = LWMA * N*(N+1)/2
А * N*(N+1)/2 + В * N = SMA * N

Упрощаем:

А * (2*N+1)/3 + В = LWMA
А * (N+1)/2 + В = SMA

Решать систему не буду, лень (тут и так уже все ясно). Просто умножу первое уравнение на 3, а второе на 2, после чего вычту почленно из первого второе:

А * (2*N+1) + 3 * В - А * (N+1) - 2 * В = 3 * LWMA - 2 * SMA

Слева после упрощения остается А*N + В, т.е. в точности наша регрессия в точке N.
 
Алексей! Еще раз риспект! А я все голову ломаю откуда в формуле моей LRMA(точнее сказать Омеговской) "/6"!
 
VBAG:
Такая метода, наверное, имеет смысл, но только если периоды небольшие. И память не главная причина. При перезагрузке будет теряться то, что за собой тащим. А вообще здорово.Спасибо за ответ.


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

У этой методы лишь один недостаток - вместо одного iMA надо написать какое-то количество строк кода собственными руками. :-)

 

Алексей спасибо. Посижу с карандашиком. Производные по A и B вроде вот такие


перепроверил ответ верный, да действительно A*N+B=3*LWMA-2*SMA

хотя у математика двойка пропущена при взятии производной.

и меня терзают смутные сомненья, что совпадать должны не в точке N, а (N-1)/2. Булашев стр.156. Вродебы. Вот картинка что совпадают в точке N. Так что я скорее неправ.

Причина обращения: