/*
* binary-cpp-api - Binary C++ API client
*
* Copyright (c) 2018 Elektro Yar. Email: [email protected]
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef BASEALGORITHMEASY_HPP_INCLUDED
#define BASEALGORITHMEASY_HPP_INCLUDED
//------------------------------------------------------------------------------
#include "HistoricalDataEasy.hpp"
#include "BasePayoutModelEasy.hpp"
#include "BinaryApiCommon.hpp"
//------------------------------------------------------------------------------
namespace BaseAlgorithmEasy
{
using namespace BinaryApiCommon;
//------------------------------------------------------------------------------
/** \brief ÐлаÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð°Ð»Ð³Ð¾ÑиÑмов ÑоÑговли
*/
class BigFatherRobots {
public:
/** \brief СбÑоÑиÑÑ ÑоÑÑоÑÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов
* ÐаннÑй меÑод оÑиÑÐ°ÐµÑ Ð²Ð½ÑÑÑенние ÑоÑÑоÑÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов
*/
virtual void reset_indicators() {};
/** \brief ÐÑоÑеÑÑиÑоваÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑÑ ÑобоÑа на Ñене
* \param price Ñена
* \param timestamp вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑка
* \param indx Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ¾ÑиÑовок
* \param forecast ÑоÑÑоÑние пÑогнозиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑобоÑа
* \return веÑÐ½ÐµÑ 0 в ÑлÑÑае ÑÑпеÑ
а
*/
virtual int test_indicators(double price, unsigned long long timestamp, int indx, int &forecast) {return DATA_NOT_AVAILABLE;};
/** \brief ÐбновиÑÑ Ð²Ð½ÑÑÑенние ÑоÑÑоÑÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов ÑобоÑа
* \param price Ñена
* \param timestamp вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑка
* \param indx Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ¾ÑиÑовок
* \param forecast ÑоÑÑоÑние пÑогнозиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑобоÑа
* \return веÑÐ½ÐµÑ 0 в ÑлÑÑае ÑÑпеÑ
а
*/
virtual int update_indicators(double price, unsigned long long timestamp, int indx, int &forecast) {return DATA_NOT_AVAILABLE;};
/** \brief ÐбновиÑÑ Ð²Ð½ÑÑÑенние ÑоÑÑоÑÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов ÑобоÑа
* \param price ÑенÑ
* \param timestamp вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑка
* \param forecast ÑоÑÑоÑние пÑогнозов ÑобоÑа
* \return веÑÐ½ÐµÑ 0 в ÑлÑÑае ÑÑпеÑ
а
*/
virtual int update_indicators(std::vector &price, unsigned long long timestamp, std::vector &forecast, std::vector &bots) {return DATA_NOT_AVAILABLE;};
/** \brief ÐолÑÑиÑÑ Ð²ÑÐµÐ¼Ñ ÑкÑпиÑаÑии опÑиона (в ÑекÑндаÑ
)
* \return вÑÐµÐ¼Ñ ÑкÑпиÑаÑии опÑиона (знаÑение менÑÑе 0 ознаÑÐ°ÐµÑ Ð¾ÑибкÑ)
*/
virtual int get_duration() {return DATA_NOT_AVAILABLE;};
/** \brief УÑÑановиÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð±Ð¸Ð½Ð°Ñного опÑиона
* \param duration длиÑелÑноÑÑÑ Ð±Ð¸Ð½Ð°Ñного опÑиона в ÑекÑндаÑ
*/
virtual void set_duration(int duration) {};
/** \brief ÐолÑÑиÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð¿ÐµÑед наÑалом ÑабоÑÑ ÑобоÑа
* \return задеÑжка в ÑекÑндаÑ
*/
virtual int get_delay_before_work() {
return DATA_NOT_AVAILABLE;
}
};
//------------------------------------------------------------------------------
/** \brief ÐлаÑÑ ÑобоÑа Ð´Ð»Ñ ÑоÑговли по индикаÑоÑÑ ÐоллинджеÑ
*/
class SimpleBbRobot : public BigFatherRobots {
private:
std::vector<:bollingerbands>> iBB;
int duration_ = xtime::SECONDS_IN_MINUTE * 3;
int delay_before_work_ = 0;
const int bot_id_ = 0;
public:
SimpleBbRobot() {};
/** \brief ÐниÑиализиÑоваÑÑ ÑобоÑа
* \param period пеÑÐ¸Ð¾Ð´Ñ ÐоллинджеÑа
* \param std_factor множиÑели ÑÑандаÑÑного оÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ ÐоллинджеÑа
*/
SimpleBbRobot(std::vector periods, std::vector std_factors) {
if(periods.size() != std_factors.size() || periods.size() == 0)
return;
iBB.resize(periods.size());
for(size_t i = 0; i < periods.size(); ++i) {
iBB[i] = IndicatorsEasy::BollingerBands(periods[i], std_factors[i]);
delay_before_work_ = std::max(delay_before_work_, periods[i]);
}
delay_before_work_ *= xtime::SECONDS_IN_MINUTE;
};
/** \brief СбÑоÑиÑÑ ÑоÑÑоÑÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов
* ÐаннÑй меÑод оÑиÑÐ°ÐµÑ Ð²Ð½ÑÑÑенние ÑоÑÑоÑÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑов
*/
virtual void reset_indicators()
{
for(size_t i = 0; i < iBB.size(); ++i) {
iBB[i].clear();
}
}
/** \brief ÐÑоÑеÑÑиÑоваÑÑ ÑобоÑа на Ñене
* \param price Ñена
* \param timestamp вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑка
* \param indx Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ¾ÑиÑовок
* \param forecast ÑоÑÑоÑние пÑогнозиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑобоÑа
* \return веÑÐ½ÐµÑ 0 в ÑлÑÑае ÑÑпеÑ
а
*/
virtual int test_indicators(double price, unsigned long long timestamp, int indx, int &forecast)
{
forecast = NO_FORECAST;
if(indx >= iBB.size())
return INVALID_PARAMETER;
double ml, tl, bl;
int err = iBB[indx].test(price, tl, ml, bl);
if(err != OK) return err;
if(price > tl) {
forecast = DN;
} else
if(price < bl) {
forecast = UP;
}
return OK;
}
/** \brief ÐбновиÑÑ Ð²Ð½ÑÑÑенние ÑоÑÑоÑÐ½Ð¸Ñ ÑобоÑа
* \param price Ñена
* \param timestamp вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑка
* \param indx Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ¾ÑиÑовок
* \param forecast ÑоÑÑоÑние пÑогнозиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑобоÑа
* \return веÑÐ½ÐµÑ 0 в ÑлÑÑае ÑÑпеÑ
а
*/
virtual int update_indicators(double price, unsigned long long timestamp, int indx, int &forecast)
{
forecast = NO_FORECAST;
if(indx >= iBB.size())
return INVALID_PARAMETER;
double ml, tl, bl;
int err = iBB[indx].update(price, tl, ml, bl);
if(err != OK) return err;
if(price > tl) {
forecast = DN;
} else
if(price < bl) {
forecast = UP;
}
return OK;
}
/** \brief ÐбновиÑÑ Ð²Ð½ÑÑÑенние ÑоÑÑоÑÐ½Ð¸Ñ ÑобоÑа
* \param price ÑÐµÐ½Ñ Ð²ÑеÑ
валÑÑнÑÑ
паÑ
* \param timestamp вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑка
* \param forecast ÑоÑÑоÑÐ½Ð¸Ñ Ð¿ÑогнозиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑобоÑа
* \return веÑÐ½ÐµÑ 0 в ÑлÑÑае ÑÑпеÑ
а
*/
virtual int update_indicators(std::vector &price, unsigned long long timestamp, std::vector &forecast, std::vector &bots)
{
if(price.size() != iBB.size())
return INVALID_PARAMETER;
forecast.resize(iBB.size());
bots.resize(iBB.size());
for(size_t n = 0; n < iBB.size(); ++n) {
update_indicators(price[n], timestamp, n, forecast[n]);
bots[n] = bot_id_;
}
return OK;
}
/** \brief УÑÑановиÑÑ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð±Ð¸Ð½Ð°Ñного опÑиона
* \param duration длиÑелÑноÑÑÑ Ð±Ð¸Ð½Ð°Ñного опÑиона в ÑекÑндаÑ
*/
virtual void set_duration(int duration) {
duration_ = duration;
};
/** \brief ÐолÑÑиÑÑ Ð²ÑÐµÐ¼Ñ ÑкÑпиÑаÑии опÑиона (в ÑекÑндаÑ
)
* \return вÑÐµÐ¼Ñ ÑкÑпиÑаÑии опÑиона (знаÑение менÑÑе 0 ознаÑÐ°ÐµÑ Ð¾ÑибкÑ)
*/
virtual int get_duration() {return duration_;};
/** \brief ÐолÑÑиÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð¿ÐµÑед наÑалом ÑабоÑÑ ÑобоÑа
* \return задеÑжка в ÑекÑндаÑ
*/
virtual int get_delay_before_work() {return delay_before_work_;}
};
//------------------------------------------------------------------------------
}
//------------------------------------------------------------------------------
#endif // BASEALGORITHMEASY_HPP_INCLUDED