| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
C++ header-only библиотека технического анализа для алготрейдинга
Библиотека содержит одиночные индикаторы и один универсальный индикатор MW (который может выполнять функцию сразу нескольких индикаторов).
Индикаторы имеют два метода для загрузки ценовых значений. Первый метод называется update, он меняет внутреннее состояние индикатора. Данный метод необходимо вызывать в момент закрытия бара. Метод test индикаторов позволяет узнать значение индикатора еще не сформировавшемся полностью баре. Данный метод по сути берет "пробу", давая знать, какое значение у индикатора сейчас при текущей цене. Метод test не влияет на внутреннее состояние индикатора: индикатор не запомнит цену, переданную в методе test. Однако, метод test переключает индикатор на режми "теста", поэтому все другие методы индикатора будут возвращать значения, актуальные для цены, переданной в методе test.
Данный подход позволяет очень просто использовать индикаторы на графике, когда необходимо перерисовывать значения индикаторов на еще не сформировавшихся барах с приходом новых тиков.
Основной упор идет на разрабюотку универсального индкатора. В данной библиотеке это индикатор "скользящее окно" или сокращенно MW.
Класс MW имеет несколько методов для получения различных данных анализируемых котировок.
/** \brief Инициализировать скользящее окно
* \param period период
*/
MW(const size_t period);/** \brief Проверить инициализацию буфера скользящего окна
* \return Вернет true, если буфер скользящего окна полностью заполнен значениями.
*/
bool is_init();/** \brief Обновить состояние индикатора
* \param in сигнал на входе (котировка, цена закрытия/открытия бара и пр.)
* \return вернет 0 в случае успеха, иначе см. ErrorType
*/
int update(const T &in);
/** \brief Обновить состояние индикатора
* \param in сигнал на входе (котировка, цена закрытия/открытия бара и пр.)
* \param out массив на выходе
* \return вернет 0 в случае успеха, иначе см. ErrorType
*/
int update(const T &in, std::vector<T> &out);/** \brief Протестировать индикатор
* Данная функция отличается от update тем, что не влияет на внутреннее состояние индикатора
* \param in сигнал на входе
* \return вернет 0 в случае успеха, иначе см. ErrorType
*/
int test(const T &in);
/** \brief Протестировать индикатор
* Данная функция отличается от update тем, что не влияет на внутреннее состояние индикатора
* \param in сигнал на входе
* \param out сигнал на выходе
* \return вернет 0 в случае успеха, иначе см. ErrorType
*/
int test(const T &in, std::vector<T> &out);В зависимости от того, какой метод был выбран (update или test), остальные методы для получения тех или иных значений будут использовать временный буфер (содержащий последнюю котировку из метода test) или основной буфер (который меняется только от метода update) индикатора.
/** \brief Получить данные внутреннего буфера индикатора
* \param buffer буфер
*/
void get_data(std::vector<T> &buffer);Внимание! Убедитесь, что буфер содержит минимум N = period значений!
/** \brief Получить максимальное значение буфера
* \param max_value Максимальное значение
* \param period Период максимальных данных
* \param offset Смещение в массиве. По умолчанию 0
*/
void get_max_value(T &max_value, const size_t period, const size_t offset = 0);Внимание! Убедитесь, что буфер содержит минимум N = period значений!
/** \brief Получить среднее значение буфера
* \param average_value Среднее значение
* \param period Период среднего значения
* \param offset Смещение в массиве. По умолчанию 0
*/
void get_average(T &average_value, const size_t period, const size_t offset = 0);Внимание! Убедитесь, что буфер содержит минимум N = period значений!
/** \brief Получить стандартное отклонение буфера
* \param std_dev_value Стандартное отклонение
* \param period Период стандартного отклонения
* \param offset Смещение в массиве. По умолчанию 0
*/
void get_std_dev(T &std_dev_value, const size_t period, const size_t offset = 0)Внимание! Убедитесь, что буфер содержит минимум N = period значений!
/** \brief Получить массив средних значений и стандартного отклонения буфера
*
* Минимальный период равен 2
* \param average_data массив средних значений
* \param std_data массив стандартного отклонения
* \param min_period минимальный период
* \param min_period максимальный период
* \param step_period шаг периода
*/
void get_average_and_std_dev_array(
std::vector<T> &average_data,
std::vector<T> &std_data,
size_t min_period,
size_t max_period,
const size_t &step_period);Внимание! Убедитесь, что буфер содержит минимум N = period + 1 значений!
/** \brief Получить значение RSI
* \param rsi_value Значение RSI
* \param period Период RSI
*/
void get_rsi(T &rsi_value, const size_t period);Внимание! Убедитесь, что буфер содержит минимум N = max_period + 1 значений!
/** \brief Получить массив значений RSI
* \param rsi_data массив значений RSI
* \param min_period минимальный период
* \param max_period максимальный период
* \param step_period шаг периода
*/
void get_rsi_array(
std::vector<T> &rsi_data,
size_t min_period,
size_t max_period,
const size_t &step_period);/** \brief Очистить данные индикатора
*/
void clear();#include <iostream>
#include "xtechnical_indicators.hpp"
using namespace std;
int main() {
cout << "Hello world!" << endl;
/* индикатор "скользящее окно" с максимальным периодом 30 */
xtechnical_indicators::MW<double> iMW(30);
/* загрузим в индикатор тестовые значения */
for(int i = 1; i <= 50; ++i) {
int temp = i % 4; // значение от 0 до 3 в зависимости от номера интерации
iMW.update(temp);
/* получим массивы значений индикаторов */
std::vector<double> rsi;
std::vector<double> sma;
std::vector<double> std_dev;
iMW.get_rsi_array(rsi, 3, 15, 3);
iMW.get_average_and_std_dev_array(sma, std_dev, 10, 22, 3);
std::cout << "step: " << i << " temp " << temp << " is init: " << iMW.is_init() << std::endl;
for(size_t i = 0; i < sma.size(); ++i) {
std::cout << "rsi: " << rsi[i] << " sma: " << sma[i] << " std_dev: " << std_dev[i] << std::endl;
}
}
double rsi_value = 0;
iMW.get_rsi(rsi_value, 15);
std::cout << "rsi_value: " << rsi_value << std::endl;
double aver_value = 0;
iMW.get_average(aver_value, 22);
std::cout << "aver_value: " << aver_value << std::endl;
double std_dev_value = 0;
iMW.get_std_dev(std_dev_value, 22);
std::cout << "std_dev: " << std_dev_value << std::endl;
return 0;
}Тестовая программа выведет на экран следующее:

Пока реализован только метод наименьших квадратов
| Back | FazBrowse Home | New Git URL |