WTSExpressData.hpp
source: wtcpp/folder98/folder01/folder2/file09.md
/*!
* \file WTSExpressData.hpp
* \project WonderTrader
*
* \author Wesley
* \date 2020/03/30
*
* \brief Wt指标数据定义文件
*/
#pragma once
#include <stdint.h>
#include "WTSDataDef.hpp"
#include "WTSMarcos.h"
#ifdef _MSC_VER
#include <WTypes.h>
#else
typedef unsigned long COLORREF;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
#endif
NS_WTP_BEGIN
//////////////////////////////////////////////////////////////////////////
//线型类,指标用到
class WTSLineInfo : public WTSObject
{
public:
static WTSLineInfo* create(COLORREF clr, int width = 1, int style = 0)
{
WTSLineInfo* pRet = new WTSLineInfo();
pRet->_line_color = clr;
pRet->_line_width = width;
pRet->_line_style = style;
return pRet;
}
COLORREF color() const{return _line_color;}
int width() const{return _line_width;}
int style() const{return _line_style;}
protected:
WTSLineInfo()
:_line_color(RGB(255,255,255))
,_line_width(1)
,_line_style(0){}
protected:
COLORREF _line_color; // 指标线颜色
int _line_width; // 指标线宽度
int _line_style; // 指标线风格
};
//////////////////////////////////////////////////////////////////////////
//指标参数类
class WTSExpressParams : public WTSObject
{
public:
static WTSExpressParams* create()
{
WTSExpressParams* pRet = new WTSExpressParams;
return pRet;
}
// 添加参数
void addParam(int param)
{
m_vecParams.emplace_back(param);
}
// 设置参数
void setParam(uint32_t idx, int param)
{
if(idx >= m_vecParams.size())
return;
m_vecParams[idx] = param;
}
// 根据索引获取指标参数
int getParam(uint32_t idx) const
{
if(idx >= m_vecParams.size())
return INVALID_INT32;
return m_vecParams[idx];
}
// 获取参数数量
uint32_t getParamCount() const{return m_vecParams.size();}
// 运算符重载[]
int& operator[](uint32_t idx){return m_vecParams[idx];}
protected:
vector<int> m_vecParams; // 指标参数列表
};
//////////////////////////////////////////////////////////////////////////
//指标线类
class WTSExpressLine : public WTSValueArray
{
public:
static WTSExpressLine* create(uint32_t size, WTSExpressLineType lineType = WELT_Polyline, uint32_t decimal = 0, uint32_t uStyle = ELS_LINE_VISIBLE|ELS_TITLE_VISIBLE)
{
WTSExpressLine* pRet = new WTSExpressLine;
pRet->m_uDecimal = decimal;
pRet->m_uStyle = uStyle;
pRet->m_lineType = lineType;
pRet->resize(size);
return pRet;
}
WTSExpressLine(): m_ayLineInfo(NULL){}
virtual void release()
{
if(isSingleRefs() && m_ayLineInfo)
{
m_ayLineInfo->release();
}
WTSObject::release();
}
virtual void retain()
{
WTSObject::retain();
}
/*
* 读取数值数组的格式化字符串
*/
const char* getFormat()
{
if(m_strFormat.empty())
{
char format[12] = {0};
sprintf(format, "%%.%df", m_uDecimal);
m_strFormat = format;
}
return m_strFormat.c_str();
}
/*
* 读取数据的小数点位数
*/
uint32_t getDecimal(){return m_uDecimal;}
void addLineInfo(WTSLineInfo* lineInfo)
{
if(m_ayLineInfo == NULL)
{
m_ayLineInfo = WTSArray::create();
}
m_ayLineInfo->append(lineInfo, true);
}
WTSLineInfo* getLineInfo(uint32_t idx = 0)
{
if(m_ayLineInfo == NULL || m_ayLineInfo->size()==0 || idx >= m_ayLineInfo->size())
return NULL;
return STATIC_CONVERT(m_ayLineInfo->at(idx), WTSLineInfo*);
}
void clearLineInfo()
{
if(m_ayLineInfo)
m_ayLineInfo->clear();
}
void setLineTag(const char* tag){m_strLineTag = tag;}
const char* getLineTag(){return m_strLineTag.c_str();}
bool isStyle(uint32_t uStyle) const{ return (m_uStyle & uStyle) == uStyle; }
void setLineType(WTSExpressLineType lineType){m_lineType = lineType;}
WTSExpressLineType getLineType() const{return m_lineType;}
protected:
WTSArray* m_ayLineInfo;
std::string m_strLineTag;
uint32_t m_uStyle;
uint32_t m_uDecimal;
std::string m_strFormat;
WTSExpressLineType m_lineType;
};
typedef vector<WTSExpressLine*> WTSVecExpLines;
//////////////////////////////////////////////////////////////////////////
//指标类
class WTSExpressData : public WTSObject
{
public:
static WTSExpressData* create(const char* title, WTSExpressType eType = WET_Unique)
{
WTSExpressData* pRet = new WTSExpressData;
pRet->setTitle(title);
pRet->setType(eType);
return pRet;
}
protected:
WTSExpressData() :m_ayExpLines(NULL), m_dDevide(1.0), m_dBaseLine(0.0), m_bBaseLine(false){}
virtual ~WTSExpressData()
{
}
public:
virtual void release()
{
if (isSingleRefs() && m_ayExpLines)
m_ayExpLines->release();
WTSObject::release();
}
void setTitle(const char* title){m_strExpTitle = title;}
const char* getTitle() const{return m_strExpTitle.c_str();}
void setType(WTSExpressType eType){m_expType = eType;}
WTSExpressType getType() const{return m_expType;}
void setBaseLine(bool bEnable = true, double dBaseLine = 0.0)
{
m_bBaseLine = bEnable;
m_dBaseLine = dBaseLine;
}
bool hasBaseLine() const{ return m_bBaseLine; }
double getBaseLine() const{ return m_dBaseLine; }
uint32_t addExpLine(WTSExpressLine* line)
{
if(NULL == line)
return INVALID_UINT32;
if(NULL == m_ayExpLines)
m_ayExpLines = WTSArray::create();
m_ayExpLines->append(line, false);
return m_ayExpLines->size() - 1;
}
WTSExpressLine* getExpLine(uint32_t idx)
{
if(NULL == m_ayExpLines || idx >= m_ayExpLines->size())
return NULL;
return STATIC_CONVERT(m_ayExpLines->at(idx), WTSExpressLine*);
}
uint32_t getLineCount(){return (NULL == m_ayExpLines)?0:m_ayExpLines->size();}
bool crossOver(uint32_t idx0, uint32_t idx1)
{
if(NULL == m_ayExpLines)
return false;
if(idx0 >= m_ayExpLines->size() || idx1 >= m_ayExpLines->size())
return false;
WTSExpressLine* line0 = STATIC_CONVERT(m_ayExpLines->at(idx0),WTSExpressLine*);
WTSExpressLine* line1 = STATIC_CONVERT(m_ayExpLines->at(idx1),WTSExpressLine*);
if(line0->size() < 2 || line1->size() < 2)
return false;
double preValue0 = line0->at(line0->size()-2);
double curValue0 = line0->at(line0->size()-1);
double preValue1 = line1->at(line1->size()-2);
double curValue1 = line1->at(line1->size()-1);
if(preValue0 <= preValue1 && curValue0 > curValue1)
return true;
return false;
}
bool crossUnder(uint32_t idx0, uint32_t idx1)
{
if(NULL == m_ayExpLines)
return false;
if(idx0 >= m_ayExpLines->size() || idx1 >= m_ayExpLines->size())
return false;
WTSExpressLine* line0 = STATIC_CONVERT(m_ayExpLines->at(idx0),WTSExpressLine*);
WTSExpressLine* line1 = STATIC_CONVERT(m_ayExpLines->at(idx1),WTSExpressLine*);
if(line0->size() < 2 || line1->size() < 2)
return false;
double preValue0 = line0->at(line0->size()-2);
double curValue0 = line0->at(line0->size()-1);
double preValue1 = line1->at(line1->size()-2);
double curValue1 = line1->at(line1->size()-1);
if(preValue0 >= preValue1 && curValue0 < curValue1)
return true;
return false;
}
double maxvalue(int32_t head, int32_t tail) const
{
double ret = INVALID_DOUBLE;
WTSArray::ConstIterator it = m_ayExpLines->begin();
for(; it != m_ayExpLines->end(); it++)
{
WTSExpressLine* line = STATIC_CONVERT(*it, WTSExpressLine*);
bool bAbs = (line->getLineType() == WELT_VolStick || line->getLineType() == WELT_AStickLine);
double v = line->maxvalue(head, tail, bAbs);
if(v == INVALID_DOUBLE)
continue;
if(ret == INVALID_DOUBLE)
ret = v;
else
ret = max(ret, v);
}
return ret;
}
double minvalue(int32_t head, int32_t tail) const
{
double ret = INVALID_DOUBLE;
WTSArray::ConstIterator it = m_ayExpLines->begin();
for(; it != m_ayExpLines->end(); it++)
{
WTSExpressLine* line = STATIC_CONVERT(*it, WTSExpressLine*);
bool bAbs = (line->getLineType() == WELT_VolStick || line->getLineType() == WELT_AStickLine);
if(bAbs)//原因是成交量柱,是以0开始绘制的
return 0;
double v = line->minvalue(head, tail, bAbs);
if (v == INVALID_DOUBLE)
continue;
if(ret == INVALID_DOUBLE)
ret = v;
else
ret = min(ret, v);
}
return ret;
}
uint32_t size() const
{
if(NULL == m_ayExpLines || m_ayExpLines->size()==0)
return 0;
return STATIC_CONVERT(m_ayExpLines->at(0), WTSExpressLine*)->size();
}
uint32_t getPrecision() const { return m_uPrec; }
void setPrecision(uint32_t prec){ m_uPrec = prec; }
void setDevide(double dvd){m_dDevide = dvd;}
double getDevide() const{return m_dDevide;}
protected:
WTSArray* m_ayExpLines;
std::string m_strExpTitle;
WTSExpressType m_expType;
uint32_t m_uPrec;
double m_dDevide;
bool m_bHasTitle;
bool m_bBaseLine;
double m_dBaseLine;
};
NS_WTP_END