{"id":19534869,"url":"https://github.com/newyaroslav/xtechnical_analysis","last_synced_at":"2025-04-26T14:35:32.915Z","repository":{"id":162735428,"uuid":"205736618","full_name":"NewYaroslav/xtechnical_analysis","owner":"NewYaroslav","description":"C++ header-only библиотека технического анализа для алготрейдинга","archived":false,"fork":false,"pushed_at":"2023-11-09T13:55:52.000Z","size":401,"stargazers_count":22,"open_issues_count":2,"forks_count":11,"subscribers_count":4,"default_branch":"master","last_synced_at":"2023-11-09T14:47:08.954Z","etag":null,"topics":["algorithmic-trading","algorithms","ama","calc","ema","forex","forex-analysis","forex-bot","forex-prediction","forex-trading","indicators","market-analysis","metatrader","mma","nolagma","rsi","sma","std-dev","technical-analysis"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NewYaroslav.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-09-01T21:53:11.000Z","updated_at":"2023-09-19T06:16:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"4f8475b4-2c90-443a-b55d-c3210a641319","html_url":"https://github.com/NewYaroslav/xtechnical_analysis","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fxtechnical_analysis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fxtechnical_analysis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fxtechnical_analysis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Fxtechnical_analysis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NewYaroslav","download_url":"https://codeload.github.com/NewYaroslav/xtechnical_analysis/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224036195,"owners_count":17245035,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithmic-trading","algorithms","ama","calc","ema","forex","forex-analysis","forex-bot","forex-prediction","forex-trading","indicators","market-analysis","metatrader","mma","nolagma","rsi","sma","std-dev","technical-analysis"],"created_at":"2024-11-11T02:16:22.606Z","updated_at":"2024-11-11T02:16:23.776Z","avatar_url":"https://github.com/NewYaroslav.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# xtechnical_analysis\nC++ header-only библиотека технического анализа для алготрейдинга\n\n## Индикаторы\n\nБиблиотека содержит одиночные индикаторы и один универсальный индикатор MW (который может выполнять функцию сразу нескольких индикаторов).\n\n## Особенности реализации индикаторов\n\nИндикаторы имеют два метода для загрузки ценовых значений. Первый метод называется *update*, он меняет внутреннее состояние индикатора. Данный метод необходимо вызывать в момент закрытия бара.\nМетод *test* индикаторов позволяет узнать значение индикатора еще не сформировавшемся полностью баре. Данный метод по сути берет \"пробу\", давая знать, какое значение у индикатора сейчас при текущей цене.\nМетод *test* не влияет на внутреннее состояние индикатора: индикатор не запомнит цену, переданную в методе *test*. Однако, метод *test* переключает индикатор на режми \"теста\", поэтому все другие методы индикатора будут возвращать значения, актуальные для цены, переданной в методе *test*.\n\nДанный подход позволяет очень просто использовать индикаторы на графике, когда необходимо перерисовывать значения индикаторов на еще не сформировавшихся барах с приходом новых тиков.\n\n### Стандартные индикаторы\n\n* MinMax\n* FastMinMax\n* MinMaxDiff\n* PRI\n* RSI - RSI с возможностью использовать любые скользящие средние\n* RSHILLMA - RSI с полосами Боллинджера\n* BollingerBands\n* CMA - Кумулятивное скользящее среднее\n* VCMA - Кумулятивное скользящее среднее с реализацией взвешенности по объему.\n* SMA\n* WMA\n* VWMA - модифицированная скользящая средняя с реализацией взвешенности по объему.\n* EMA\n* MMA\n* AMA\n* LRMA - Индикатор линейной регрессии\n* NoLagMa - МА без задержки\n* LowPassFilter - ФНЧ\n* AverageSpeed - (индикатор не проверен!)\n* CurrencyCorrelation - (вычисление корреляции)\n* DetectorWaveform - (индикатор не проверен! экспериментальный индикатор)\n* Zscore\n* StdDev - стандартное отклонение\n* DelayEvent - Линия задержки события\n* DelayLine - Линия задержки (индикатор не проверен!)\n* OsMa - скользящее среднее индикатора осциллятора (индикатор не проверен!)\n* TrendDirectionForceIndex - Индикатор тренда с возможностью использовать любые скользящие средние\n* MAV\n* MAZ\n\n### Индикатор MW\n\nОсновной упор идет на разрабюотку универсального индкатора. В данной библиотеке это индикатор *\"скользящее окно\"* или сокращенно *MW*.\n\nКласс MW имеет несколько методов для получения различных данных анализируемых котировок.\n\n* Конструктор *MW* - в конструкторе можно задать максимальный период скользящего окна.\n\n```cpp\n/** \\brief Инициализировать скользящее окно\n * \\param period период\n */\nMW(const size_t period);\n```\n\n* Метод *is_init()* - данный метод вернет true, когда буфер скользящего окна будет полностью заполнен. Т.е. когда скользящее окно будет содержать в себе максимальное возможное количество котировок.\n\n```cpp\n/** \\brief Проверить инициализацию буфера скользящего окна\n * \\return Вернет true, если буфер скользящего окна полностью заполнен значениями.\n */\nbool is_init();\n```\n\n* Метод *update* - данный метод необходимо вызывать каждый раз, когда необходимо загрузить в индикатор новое значение котировок. Данный метод имеет несколько разновидностей:\n\n```cpp\n/** \\brief Обновить состояние индикатора\n * \\param in сигнал на входе (котировка, цена закрытия/открытия бара и пр.)\n * \\return вернет 0 в случае успеха, иначе см. ErrorType\n */\nint update(const T \u0026in);\n\t\t\n/** \\brief Обновить состояние индикатора\n * \\param in сигнал на входе (котировка, цена закрытия/открытия бара и пр.)\n * \\param out массив на выходе\n * \\return вернет 0 в случае успеха, иначе см. ErrorType\n */\nint update(const T \u0026in, std::vector\u003cT\u003e \u0026out);\n```\n* Метод *test* - данный метод похож на метод *update*, но имеет принципиальную разницу. **Этот метод не влияет на внутреннее состояние индикатора.** Данный метод нужен для \"тестирования\" индикатора, т.е. для получения значения индикатра без изменения внутненнего состояния. Этот метод может пригодится, когда нужно получить, к примеру, значение RSI по текущей котировке, но сам индикатор должен рассчитываться только по ценам закрытия бара.\n\n```cpp\n/** \\brief Протестировать индикатор\n * Данная функция отличается от update тем, что не влияет на внутреннее состояние индикатора\n * \\param in сигнал на входе\n * \\return вернет 0 в случае успеха, иначе см. ErrorType\n */\nint test(const T \u0026in);\n\t\t\n/** \\brief Протестировать индикатор\n * Данная функция отличается от update тем, что не влияет на внутреннее состояние индикатора\n * \\param in сигнал на входе\n * \\param out сигнал на выходе\n * \\return вернет 0 в случае успеха, иначе см. ErrorType\n */\nint test(const T \u0026in, std::vector\u003cT\u003e \u0026out);\n```\n\nВ зависимости от того, какой метод был выбран (*update* или *test*), остальные методы для получения тех или иных значений будут использовать временный буфер (*содержащий последнюю котировку из метода test*) или основной буфер (*который меняется только от метода update*) индикатора.\n\n* Метод get_data - позволяет получить буфер (основной или тестовый).\n\n```cpp\n/** \\brief Получить данные внутреннего буфера индикатора\n * \\param buffer буфер\n */\nvoid get_data(std::vector\u003cT\u003e \u0026buffer);\n```\n\n* Методы *get_max_value* и *get_min_value* позволяют получить максимальное и минимальное значение из основного или тестового буфера. \n\n**Внимание! Убедитесь, что буфер содержит минимум N = *period* значений!**\n\n```cpp\n/** \\brief Получить максимальное значение буфера\n * \\param max_value Максимальное значение\n * \\param period Период максимальных данных\n * \\param offset Смещение в массиве. По умолчанию 0\n */\nvoid get_max_value(T \u0026max_value, const size_t period, const size_t offset = 0);\n```\n\n* Метод *get_average* позволяет получить среднее значение из основного или тестового буфера.\n\n**Внимание! Убедитесь, что буфер содержит минимум N = *period* значений!**\n\n```cpp\n/** \\brief Получить среднее значение буфера\n * \\param average_value Среднее значение\n * \\param period Период среднего значения\n * \\param offset Смещение в массиве. По умолчанию 0\n */\nvoid get_average(T \u0026average_value, const size_t period, const size_t offset = 0);\n```\n\n* Метод *get_std_dev* позволяет получить стандартное отклонение из основного или тестового буфера.\n\n**Внимание! Убедитесь, что буфер содержит минимум N = *period* значений!**\n\n```cpp\n/** \\brief Получить стандартное отклонение буфера\n * \\param std_dev_value Стандартное отклонение\n * \\param period Период стандартного отклонения\n * \\param offset Смещение в массиве. По умолчанию 0\n */\nvoid get_std_dev(T \u0026std_dev_value, const size_t period, const size_t offset = 0)\n```\n\n* Метод *get_average_and_std_dev_array* позволяет получить массив среднего значения и стандартноого отклонения из основного или тестового буфера.\n\n**Внимание! Убедитесь, что буфер содержит минимум N = *period* значений!**\n\n```cpp\n/** \\brief Получить массив средних значений и стандартного отклонения буфера\n *\n * Минимальный период равен 2\n * \\param average_data массив средних значений\n * \\param std_data массив стандартного отклонения\n * \\param min_period минимальный период\n * \\param min_period максимальный период\n * \\param step_period шаг периода\n */\nvoid get_average_and_std_dev_array(\n\t\tstd::vector\u003cT\u003e \u0026average_data,\n\t\tstd::vector\u003cT\u003e \u0026std_data,\n\t\tsize_t min_period,\n\t\tsize_t max_period,\n\t\tconst size_t \u0026step_period);\n```\n\n* Метод *get_rsi* позволяет получить значение RSI из основного или тестового буфера.\n\n**Внимание! Убедитесь, что буфер содержит минимум N = *period + 1* значений!**\n\n```cpp\n/** \\brief Получить значение RSI\n * \\param rsi_value Значение RSI\n * \\param period Период RSI\n */\nvoid get_rsi(T \u0026rsi_value, const size_t period);\n```\n\n* Метод *get_rsi_array* позволяет получить массив значений RSI из основного или тестового буфера.\n\n**Внимание! Убедитесь, что буфер содержит минимум N = *max_period + 1* значений!**\n\n```cpp\n/** \\brief Получить массив значений RSI\n * \\param rsi_data массив значений RSI\n * \\param min_period минимальный период\n * \\param max_period максимальный период\n * \\param step_period шаг периода\n */\nvoid get_rsi_array(\n\t\tstd::vector\u003cT\u003e \u0026rsi_data,\n\t\tsize_t min_period,\n\t\tsize_t max_period,\n\t\tconst size_t \u0026step_period);\n```\n\n* Метод *clear()* очищает внутреннее состояние индикатора. Он обнуляет размер основного и тестового буфера.\n\n```cpp\n/** \\brief Очистить данные индикатора\n */\nvoid clear();\n```\n\n### Пример программы\n\n```cpp\n#include \u003ciostream\u003e\n#include \"xtechnical_indicators.hpp\"\n\nusing namespace std;\n\nint main() {\n    cout \u003c\u003c \"Hello world!\" \u003c\u003c endl;\n\t/* индикатор \"скользящее окно\" с максимальным периодом 30 */\n    xtechnical_indicators::MW\u003cdouble\u003e iMW(30);\n\t\n\t/* загрузим в индикатор тестовые значения */\n    for(int i = 1; i \u003c= 50; ++i) {\n        int temp = i % 4; // значение от 0 до 3 в зависимости от номера интерации\n        iMW.update(temp);\n\t\t/* получим массивы значений индикаторов */\n        std::vector\u003cdouble\u003e rsi;\n        std::vector\u003cdouble\u003e sma;\n        std::vector\u003cdouble\u003e std_dev;\n        iMW.get_rsi_array(rsi, 3, 15, 3);\n        iMW.get_average_and_std_dev_array(sma, std_dev, 10, 22, 3);\n\n        std::cout \u003c\u003c \"step: \" \u003c\u003c i \u003c\u003c \" temp \" \u003c\u003c temp \u003c\u003c \" is init: \" \u003c\u003c iMW.is_init() \u003c\u003c std::endl;\n        for(size_t i = 0; i \u003c sma.size(); ++i) {\n            std::cout \u003c\u003c \"rsi: \" \u003c\u003c rsi[i] \u003c\u003c \" sma: \" \u003c\u003c sma[i] \u003c\u003c \" std_dev: \" \u003c\u003c std_dev[i] \u003c\u003c std::endl;\n        }\n    }\n\n    double rsi_value = 0;\n    iMW.get_rsi(rsi_value, 15);\n    std::cout \u003c\u003c \"rsi_value: \" \u003c\u003c rsi_value \u003c\u003c std::endl;\n    double aver_value = 0;\n    iMW.get_average(aver_value, 22);\n    std::cout \u003c\u003c \"aver_value: \" \u003c\u003c aver_value \u003c\u003c std::endl;\n    double std_dev_value = 0;\n    iMW.get_std_dev(std_dev_value, 22);\n    std::cout \u003c\u003c \"std_dev: \" \u003c\u003c std_dev_value \u003c\u003c std::endl;\n    return 0;\n}\n```\n\nТестовая программа выведет на экран следующее:\n![example_0](doc/example_0.png)\n\n## Нормализация данных\n\n* calculate_min_max\n* calculate_zscore\n* calculate_difference\n* normalize_amplitudes\n* calculate_log\n\n## Статистика\n\n* calc_root_mean_square\n* calc_mean_value\n* calc_harmonic_mean\n* calc_geometric_mean\n* calc_median\n* calc_std_dev_sample\n* calc_std_dev_population\n* calc_mean_absolute_deviation\n* calc_skewness\n* calc_standard_error\n* calc_sampling_error\n* calc_coefficient_variance\n* calc_signal_to_noise_ratio\n* calc_excess\n\n## Регрессионный анализ\n\nПока реализован только метод наименьших квадратов\n\n* calc_least_squares_method\n* calc_line\n\n## Полезные ссылки\n\n* Библиотека для уджобной работы с котировками [xquotes_history](https://github.com/NewYaroslav/xquotes_history)\n* Библиотека для рисования графиков в С++ [easy_plot_cpp](https://github.com/NewYaroslav/easy_plot_cpp)\n* Индикаторы и советники для Форекс (исходники): [https://trueforex.pp.ua/](https://trueforex.pp.ua/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewyaroslav%2Fxtechnical_analysis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnewyaroslav%2Fxtechnical_analysis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewyaroslav%2Fxtechnical_analysis/lists"}