Блог им. elektroyar |Библиотека для работы с временем и датой ztime

 С++ библиотека для работы с датой и временем Z-time

Библиотека для работы с временем и датой ztime

Всем привет! Ранее я уже писал про библиотеку для работы с датой и временем. С тех пор я добавил в нее новый функционал и адаптировал под использование в VS (оказалось, что в VS имя xtime уже занято). Эта библиотека очередной велосипед, но что поделать, люблю делать велосипеды
boost::posix_time, std, boost ::chrono… надо учиться эффективно использовать чужие велосипеды, иначе легко завязнуть в своих...

В трейдинге данная библиотека может быть полезна, если нужно измерять точное время в программе при помощи NTP без корректировки времени самого сервера/ПК, для проверки взаимосвязи настроения рынка с фазами Луны, для различных преобразований времени в разные форматы.


Описание


Данная библиотека представляет собой сборник алгоритмов, классов, функций и констант для удобной работы с временем:

  • Измерение точного времени при помощи NTP
  • Получение реального времени компьютера с точностью до микросекунд
  • Преобразование даты в метку времени и обратно
  • Парсинг строк или формирование строки из даты
  • Расчет фаз Луны, поиск следующего новолуния
  • Преобразование UINX времени в OLE Automation Date и обратно
  • Получение секунды, минуты, часа дня из метки времени, получение последней метки времени месяца и т.п.
  • И многие другие возможности...


( Читать дальше )

Блог им. elektroyar |С++ Библиотека для сервера и клиента Named Pipe

В общем, сделал библиотеку simple-named-pipe-server для  работы с именованными каналами. Библиотека содержит сервер и клиент для C++11, а также клиент для MQL4.

С++ Библиотека для сервера и клиента Named Pipe


Очень простая, многопоточная серверная и клиентская библиотека Named Pipe, реализованная с использованием C++11. Проект был проверен на компиляторе mingw 7.3.0 x64. Папка code_blocks содержит примеры для IDE Code::Blocks. Не забудьте в проектах указать свой компилятор, иначе проект не соберется. Сделал либу только сегодня, так что в ней могут быть ошибочки.

Пример сервера
#include <iostream>
#include "named-pipe-server.hpp"

int main() {
    /* в конструкторе сервера можно также задать размер буфера */
    SimpleNamedPipe::NamedPipeServer server("my_server");

    /* обработчики событий */
    server.on_open = [&](SimpleNamedPipe::NamedPipeServer::Connection* connection) {
        std::cout << "open, handle: " << connection->get_handle() << std::endl;
    };
    server.on_message = [&](SimpleNamedPipe::NamedPipeServer::Connection* connection, 
			const std::string &in_message) {
        /* обрабатываем входящие сообщения */
        std::cout << "message " << in_message << ", handle: " << connection->get_handle() << std::endl;
        connection->send("ok");
    };
    server.on_close = [&](SimpleNamedPipe::NamedPipeServer::Connection* connection) {
        std::cout << "close, handle: " << connection->get_handle() << std::endl;
    };
    server.on_error = [&](SimpleNamedPipe::NamedPipeServer::Connection* connection, const std::error_code &ec) {
        std::cout << "error, handle: " << connection->get_handle() << ", what " << ec.value() << std::endl;
    };

    /* запускаем сервер */
    server.start();
    std::system("pause");

    /* останавливаем сервер 
     * (деструктор класса сам выполнит остановку, вызывать не обязательно)
     */
    server.stop();
    std::cout << "close program" << std::endl;
    return EXIT_SUCCESS;
}


( Читать дальше )

Блог им. elektroyar |Супер ускорение расчета индикаторов

Когда-то давно я занимался распознавание образов и использовал такую вещь как интегральное представление изображения. И на самом деле этот же метод применим и в алготрейдинге, например для быстрого расчета SMA, или сбора статистики винрейта за указанный период. 

Например, был ценовой ряд из 6-ти элементов:

1.104, 1.102, 1.105, 1.106, 1.103, 1.101 

Найдем его интегральное представление (начнем с нуля):

0.0, 1.104, 2.206, 3.311, 4.417, 5.52, 6.621

Чему будет равно SMA за последние 3 элемента? Достаточно посчитать разницу: 6.621 - 3.311 и разделить ее на 3.

SMA(3) = (6.621 - 3.311)/3 = 1.103

Убедимся, что SMA(3) найдено верно. 

(1.106 + 1.103 + 1.101)/3 = 1.103

Таким образом можно найти SMA с любым периодом, совершив всего навсего одну операцию вычитания и одну операцию деления. Это позволит гораздо быстрее получить набор значений индикаторов типа SMA, RSI, STD_DEV.
Вроде все хорошо, НО НАДО ПОМНИТЬ, что если использовать тип данных с плавающей точкой, то у нас будет накапливаться ошибка. Поэтому ценовой ряд лучше сначала преобразовать в целочисленный тип. Для этого достаточно для 5-ти значных котировок умножить цену на число 100 000.

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




Блог им. elektroyar |Про программирование в алготрейдинге и полезные навыки

По моему опыту в алготрейдинге (под алготрейдингом я подразумеваю поиск закономерностей и их использование) большая часть времени уходит на исследования, это примерно 90% времени. Однако, часто можно услышать критику примерно следующего плана.
  • Нужно писать код на питоне/джаве, можно в два счета набросать торгового робота. Нафиг Си и С++, сложна.
  • Не нужно изобретать велосипеды, все уже сделано за нас. Зря потратить время, бери готовое и действуй. Метатрейдер в помощь.
  • Нужно всегда писать чистый код, а не говнокод. 
Если все это верно, то получается, что успех в алготрейдинге (да и в IT) должен зависеть от этих факторов. Однако, к примеру, на практике большая часть доли в проекте принадлежит обычно не программистам (т.е. людям, которые вообще могут не уметь программировать), хороший код не обязательно принесет много денег, да и сложные алгоритмы порой без разницы, на каком языке реализовывать, быстрее они не напишутся.

Если объяснить проще, то успех не равен чистоте, хорошести и прочим характеристикам кода. Тогда почему происходит акцентуация на подобные факторы? 

( Читать дальше )

Блог им. elektroyar |Библиотека С++ для загрузки экономических новостей

Есть один хороший сайт www.investing.com с экономическими новостями, которым пользуются многие трейдеры на Форексе. И решил я как-то раз попробовать посмотреть, что будет на бэктестинге торговли по новостям. Поковырявшись в страничке экономического календаря сделал в итоге С++ библиотеку для загрузки новостей. Для http запросов библиотека использует curl. Новости загружаются по UTC времени, загрузить их можно со времен начала эпохи UNIX

Класс для хранения одной новости:
/** \brief Класс Новостей
*/
class News
{
public:
	std::string name;          /**< Имя новости */
	std::string currency;      /**< Валюта новости */
	std::string country;       /**< Страна новости */
	int level_volatility = -1; /**< Уровень волатильности (-1 не инициализировано,  низкий уровень = 0, средний 1, высокий 2) */
	double previous;           /**< Предыдущее значение */
	double actual;             /**< Актуальное значение */
	double forecast;           /**< Предсказанное значение */
	bool is_previous = false;  /**< Наличие предыдущего значения */
	bool is_actual = false;    /**< Наличие актуального значения */
	bool is_forecast = false;  /**< Наличие предсказанного значения */
	uint64_t timestamp = 0;    /**< Метка времени новости */

	News() {};
};
Для хранения массива исторических данных новостей используется библиотека 

( Читать дальше )

....все тэги
UPDONW
Новый дизайн