Взвешенное по времени МНК - страница 2

 

Согласен, вполне интересно, только вот разгребать я это буду походу долго :-(

Вообщем в чём суть. Есть понятие профиль объёма по цене, и есть профиль дельты по цене. Как правило сам профиль тупо складывается, а если применить к нему метод усреднения с помощью взвешенного МНК, то получится бомболёт, где свежие данные имеют больший вес, а старые меньший. Тогда будет видна истинная картина профиля дельты по цене максимального объёма. Вот и думаю, как это всё прикрутить :-( 

 
George Merts:
Да, у меня - двумерный случай.

А описание не делаете под свои функции? Я вот сам иногда забываю, какой смысл закладывал в код - стараюсь комментить суть функции...

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

 
-Aleks-:

А описание не делаете под свои функции? Я вот сам иногда забываю, какой смысл закладывал в код - стараюсь комментить суть функции...

Там же комментариев гора !!!
 
George Merts:
Там же комментариев гора !!!
Я про второй код, где, как я понимаю, функции по применению общих вычислительных алгоритмов.
 
-Aleks-:
Я про второй код, где, как я понимаю, функции по применению общих вычислительных алгоритмов.

Дык а там - нечего особо комментировать. Чисто вычислительные функции, реализующие стандартные формулы МНК.

Я не знаю, что можно прокомментировать функции, которая считает сумму квадратов по X или по Y.

Первый файл - это файл заголовка - .mqh

Второй файл - это файл имплементации - .mq5

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

 
transcendreamer:

думал как бы так ловко вывернуться чтобы рассчитать кфц за 1 проход без Гаусса и использовать скользящие суммы

но похоже такие финты не пройдут

@Quantum итерационные алгоритмы пробовал продвигать в мат. библу. Поспрашивайте у него, если хотите конструктива.

 
George Merts:

Дык а там - нечего особо комментировать. Чисто вычислительные функции, реализующие стандартные формулы МНК.

Я не знаю, что можно прокомментировать функции, которая считает сумму квадратов по X или по Y.

Первый файл - это файл заголовка - .mqh

Второй файл - это файл имплементации - .mq5

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

Прислеп я - теперь увидел - извините.

В ООП не соображаю, поэтому вопрос  - как этот код подключить - можете выложить файлы класса и пример подключения? 

 
-Aleks-:
 

В ООП не соображаю, поэтому вопрос  - как этот код подключить - можете выложить файлы класса и пример подключения? 

Значит, имеем два файла:

LSMBase.mqh

LSMBase.mq5

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

Во втором, вначале должна стоять директива

 #include <Путь\LSMBase.mqh> (разумеется, надо указать свой путь)

Все. Базовый класс готов, и пусть лежит в библиотеке (в Папке Include).

***

Теперь, скажем, нам понадобился класс, который умеет рассчитывать МНК обычного массива. Нам надо пронаследоваться от базового, и перегрузить функции получения значений X и У. Значения X - это индексы переменных, значения Y - элементы массива. Веса - можно сделать одинаковы, а можно разными, скажем, увеличивающимися, если вы хотите, чтобы более поздние элементы были важнее. Наследуемся (в данном случае - я не перегружаю функцию получения весов, но если нужен взвешенный МНК - ее надо перегрузить, чтобы она возвращала вес каждой точки):

#include <Путь\LSMBase.mq5> // Указать свой путь

class CMyLSM: public CLSMBase
{
protected:

   double   m_dArray[];  // Массив, для которого находим МНК
   

  // Перегружаем виртуальные функции. Они должны возвращать содержимое массива


   virtual int    _N() { return(ArraySize(m_dArray)); };
   virtual double _X(int iIdx) { return(iIdx); };  
   virtual double _Y(int iIdx) { return(m_dArray[iIdx]);  };  
  
public:
   CMyLSM();
   ~CMyLSM() {};

// Функция получения степеней МНК. Передаем в нее сам массив и тип МНК - флет, тренд, параболик или кубик.

 SLSMPowers CountMyLSM(double & dArray[], ELSMType ltType)

{

ArrayCopy(m_dArray,dArray); // Копируем массив во внутренний буффер

return(_CountLSM(ltType)); // Возвращаем степени.

};

Все. Теперь, в нужном нам месте объявляем объект СMyLSM, передаем ему массив, и запрашиваем у него степени.

Если нужно рассчитать кривую, полученную из МНК - используем статическую функцию:

double dMyArray[];  // Где-то у нас сформирован массив

.... // Здесь мы накапливаем данные этого массива


СMyLSM mlCounter; // Теперь надо расчитать МНК, создаем объект для этой цели

SLSMPowers lpPowers; // Создаем структуру со степенями

 lpPowers =  mlCounter.CountMyLSM(dMyArray); // Рассчитываем степени МНК.

...

double dLSMPoint0  = LSMBase::CountLSM(0,lpPowers); // Рассчитываем значение нулевой точки с найденными степенями c помощью статической функции.

double dLSMPoint1  = LSMBase::CountLSM(1,lpPowers); // Рассчитываем значение первой точки с найденными степенями c помощью статической функции.

....

Все.

Последнюю статическую функцию вызываем для всех точек - получаем значение пересчитанной по МНК кривой нужной степени.

 

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

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

Разработчкики ни в какую не хотят вводить указатели на массивы, утверждая, что "это опасно", мол, "вы удалите массив, а указатель останется прежним, вы обратитесь по нему - и это приведет к краху". Но, при этом признают необходимость в указателях на объекты, которые тоже можно создать, взять указатель на них, потом удалить объект, и обращение по указателю приведет к краху. Но тут - у разработчиков какие-то странные объяснения - мол, "в этом случае вы ответственны за удаление объекта". Можно подумать, что если это массив - то ответственность с программиста снимается.

Ну, а раз указателей на массивы нет - вот, приходится в подобных объектах иметь внутренний буффер, в который копируются необходимые значения.

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