Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Согласен, вполне интересно, только вот разгребать я это буду походу долго :-(
Вообщем в чём суть. Есть понятие профиль объёма по цене, и есть профиль дельты по цене. Как правило сам профиль тупо складывается, а если применить к нему метод усреднения с помощью взвешенного МНК, то получится бомболёт, где свежие данные имеют больший вес, а старые меньший. Тогда будет видна истинная картина профиля дельты по цене максимального объёма. Вот и думаю, как это всё прикрутить :-(
Да, у меня - двумерный случай.
А описание не делаете под свои функции? Я вот сам иногда забываю, какой смысл закладывал в код - стараюсь комментить суть функции...
Без понимания за что отвечает каждая функция не просто применить Ваш код, который безусловно заслуживает внимания.
А описание не делаете под свои функции? Я вот сам иногда забываю, какой смысл закладывал в код - стараюсь комментить суть функции...
Там же комментариев гора !!!
Я про второй код, где, как я понимаю, функции по применению общих вычислительных алгоритмов.
Дык а там - нечего особо комментировать. Чисто вычислительные функции, реализующие стандартные формулы МНК.
Я не знаю, что можно прокомментировать функции, которая считает сумму квадратов по X или по Y.
Первый файл - это файл заголовка - .mqh
Второй файл - это файл имплементации - .mq5
Объявление класса - в первом файле. А во втором - расписаны функции этого класса. По идее - все это можно было бы запихнуть в один файл, но мне гораздо удобнее иметь два файла - именно потому, что реализация класса не мешает восприятия его интерфейса. Интерфейс класса - в заголовочном файле, там все прокомментировано, как и зачем какая функция нужна. А в имплементации - чисто расчетные блоки. Что там еще комментировать ?
думал как бы так ловко вывернуться чтобы рассчитать кфц за 1 проход без Гаусса и использовать скользящие суммы
но похоже такие финты не пройдут
Дык а там - нечего особо комментировать. Чисто вычислительные функции, реализующие стандартные формулы МНК.
Я не знаю, что можно прокомментировать функции, которая считает сумму квадратов по X или по Y.
Первый файл - это файл заголовка - .mqh
Второй файл - это файл имплементации - .mq5
Объявление класса - в первом файле. А во втором - расписаны функции этого класса. По идее - все это можно было бы запихнуть в один файл, но мне гораздо удобнее иметь два файла - именно потому, что реализация класса не мешает восприятия его интерфейса. Интерфейс класса - в заголовочном файле, там все прокомментировано, как и зачем какая функция нужна. А в имплементации - чисто расчетные блоки. Что там еще комментировать ?
Прислеп я - теперь увидел - извините.
В ООП не соображаю, поэтому вопрос - как этот код подключить - можете выложить файлы класса и пример подключения?
В ООП не соображаю, поэтому вопрос - как этот код подключить - можете выложить файлы класса и пример подключения?
Значит, имеем два файла:
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 для каждой.
Разработчкики ни в какую не хотят вводить указатели на массивы, утверждая, что "это опасно", мол, "вы удалите массив, а указатель останется прежним, вы обратитесь по нему - и это приведет к краху". Но, при этом признают необходимость в указателях на объекты, которые тоже можно создать, взять указатель на них, потом удалить объект, и обращение по указателю приведет к краху. Но тут - у разработчиков какие-то странные объяснения - мол, "в этом случае вы ответственны за удаление объекта". Можно подумать, что если это массив - то ответственность с программиста снимается.
Ну, а раз указателей на массивы нет - вот, приходится в подобных объектах иметь внутренний буффер, в который копируются необходимые значения.