Ai
4 Star 3 Fork 3

luogan129/Indicator

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
Main.cpp 14.20 KB
一键复制 编辑 原始数据 按行查看 历史
Martin Tang 提交于 2016-07-13 10:24 +08:00 . bugfix
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
/*****************************************************************************
* 禅论可视化分析系统
* Copyright (C) 2016, Martin Tang
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#include "Main.h"
//=============================================================================
// 数学函数部分
//=============================================================================
// 顶底扫描定位函数
void Parse1(int nCount, float *pOut, float *pHigh, float *pLow)
{
int nState = -1;
int nHigh = 0;
int nLow = 0;
for (int i = 1; i < nCount; i++)
{
// 设定默认输出为零
pOut[i] = 0;
// 寻找高点模式
if (nState == 1)
{
// 如果当前最高大于之前最高,更新位置信息
if (pHigh[i] >= pHigh[nHigh])
{
pOut[nHigh] = 0;
nHigh = i;
pOut[nHigh] = 1;
}
// 确认转向(原文:当前最高小于高点最低,当前最低小于高点最低)
if ((pHigh[i] < pHigh[nHigh]) && (pLow[i] < pLow[nHigh]))
{
pOut[nHigh] = 1;
nState = -1;
nLow = i;
}
}
// 寻找低点模式
else if (nState == -1)
{
// 如果当前最低小于之前最低,更新位置信息
if (pLow[i] <= pLow[nLow])
{
pOut[nLow] = 0;
nLow = i;
pOut[nLow] = -1;
}
// 确认转向(原文:当前最高大于高点最低,当前最低大于高点最低)
if ((pLow[i] > pLow[nLow]) && (pHigh[i] > pHigh[nLow]))
{
pOut[nLow] = -1;
nState = 1;
nHigh = i;
}
}
}
}
// 化简函数(至少5根K线完成一笔)
int Parse2(int nCount, float *pOut, float *pHigh, float *pLow)
{
int nSpan = 0;
int nCurrTop = 0, nPrevTop = 0;
int nCurrBot = 0, nPrevBot = 0;
for (int i = 0; i < nCount; i++)
{
// 遇到高点,合并化简上升段(上下上)
if (pOut[i] == 1)
{
// 更新位置信息
nPrevTop = nCurrTop;
nCurrTop = i;
// 存在小于五根的线段,去除中间一段
if ((pHigh[nCurrTop] >= pHigh[nPrevTop]) &&
(pLow [nCurrBot] > pLow [nPrevBot]))
{
// 检查合法性(严格按照连续五根形成一笔)
if (((nCurrTop - nCurrBot < 4) && (nCount - nCurrTop > 4)) ||
(nCurrBot - nPrevTop < 4) || (nPrevTop - nPrevBot < 4))
{
pOut[nCurrBot] = 0;
pOut[nPrevTop] = 0;
}
else if (nCount - nCurrTop > 4)
{
// 检查第三段(上)K线合并
nSpan = nCurrTop - nCurrBot;
for (int j = nCurrBot; j < nCurrTop; j++)
{
if ((pHigh[j] >= pHigh[j+1]) && (pLow[j] <= pLow[j+1]))
{
nSpan--;
}
}
if (nSpan < 4)
{
pOut[nCurrBot] = 0;
pOut[nPrevTop] = 0;
}
// 检查第二段(下)K线合并
nSpan = nCurrBot - nPrevTop;
for (int j = nPrevTop; j < nCurrBot; j++)
{
if ((pHigh[j] >= pHigh[j+1]) && (pLow[j] <= pLow[j+1]))
{
nSpan--;
}
}
if (nSpan < 4)
{
pOut[nCurrBot] = 0;
pOut[nPrevTop] = 0;
}
// 检查第一段(上)K线合并
nSpan = nPrevTop - nPrevBot;
for (int j = nPrevBot; j < nPrevTop; j++)
{
if ((pHigh[j] >= pHigh[j+1]) && (pLow[j] <= pLow[j+1]))
{
nSpan--;
}
}
if (nSpan < 4)
{
pOut[nCurrBot] = 0;
pOut[nPrevTop] = 0;
}
}
}
}
// 遇到低点,合并化简下降段(下上下)
if (pOut[i] == -1)
{
// 更新位置信息
nPrevBot = nCurrBot;
nCurrBot = i;
// 存在小于五根的线段,去除中间一段
if ((pLow [nCurrBot] <= pLow [nPrevBot]) &&
(pHigh[nCurrTop] < pHigh[nPrevTop]))
{
// 检查合法性(严格按照连续五根形成一笔)
if (((nCurrBot - nCurrTop < 4) && (nCount - nCurrBot > 4)) ||
(nCurrTop - nPrevBot < 4) || (nPrevBot - nPrevTop < 4))
{
pOut[nCurrTop] = 0;
pOut[nPrevBot] = 0;
}
else if (nCount - nCurrBot > 4)
{
// 检查第三段(下)K线合并
nSpan = nCurrBot - nCurrTop;
for (int j = nCurrTop; j < nCurrBot; j++)
{
if ((pHigh[j] >= pHigh[j+1]) && (pLow[j] <= pLow[j+1]))
{
nSpan--;
}
}
if (nSpan < 4)
{
pOut[nCurrTop] = 0;
pOut[nPrevBot] = 0;
}
// 检查第二段(上)K线合并
nSpan = nCurrTop - nPrevBot;
for (int j = nPrevBot; j < nCurrTop; j++)
{
if ((pHigh[j] >= pHigh[j+1]) && (pLow[j] <= pLow[j+1]))
{
nSpan--;
}
}
if (nSpan < 4)
{
pOut[nCurrTop] = 0;
pOut[nPrevBot] = 0;
}
// 检查第一段(下)K线合并
nSpan = nPrevBot - nPrevTop;
for (int j = nPrevTop; j < nPrevBot; j++)
{
if ((pHigh[j] >= pHigh[j+1]) && (pLow[j] <= pLow[j+1]))
{
nSpan--;
}
}
if (nSpan < 4)
{
pOut[nCurrTop] = 0;
pOut[nPrevBot] = 0;
}
}
}
}
}
}
//=============================================================================
// 输出函数1号:线段高低点标记信号
//=============================================================================
void Func1(int nCount, float *pOut, float *pHigh, float *pLow, float *pTime)
{
// 搜寻所有的高低点
Parse1(nCount, pOut, pHigh, pLow);
// 根据设置的遍数,进行化简(第归算法)
for (int i = 0; i < *pTime; i++)
{
Parse2(nCount, pOut, pHigh, pLow);
}
}
//=============================================================================
// 输出函数2号:中枢高点数据
//=============================================================================
void Func2(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
CCentroid Centroid;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
// 遇到线段高点,推入中枢算法
if (Centroid.PushHigh(i, pHigh[i]))
{
// 区段内更新算得的中枢高数据
for (int j = Centroid.nStart; j <= Centroid.nEnd; j++)
{
pOut[j] = Centroid.fPHigh;
}
}
}
else if (pIn[i] == -1)
{
// 遇到线段低点,推入中枢算法
if (Centroid.PushLow(i, pLow[i]))
{
// 区段内更新算得的中枢低数据
for (int j = Centroid.nStart; j <= Centroid.nEnd; j++)
{
pOut[j] = Centroid.fPHigh;
}
}
}
// 尾部未完成中枢处理
if (Centroid.bValid && (Centroid.nLines >= 2) && (i == nCount - 1))
{
for (int j = Centroid.nStart; j < nCount; j++)
{
pOut[j] = Centroid.fHigh;
}
}
}
}
//=============================================================================
// 输出函数3号:中枢低点数据
//=============================================================================
void Func3(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
CCentroid Centroid;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
// 遇到线段高点,推入中枢算法
if (Centroid.PushHigh(i, pHigh[i]))
{
// 区段内更新算得的中枢高数据
for (int j = Centroid.nStart; j <= Centroid.nEnd; j++)
{
pOut[j] = Centroid.fPLow;
}
}
}
else if (pIn[i] == -1)
{
// 遇到线段低点,推入中枢算法
if (Centroid.PushLow(i, pLow[i]))
{
// 区段内更新算得的中枢低数据
for (int j = Centroid.nStart; j <= Centroid.nEnd; j++)
{
pOut[j] = Centroid.fPLow;
}
}
}
// 尾部未完成中枢处理
if (Centroid.bValid && (Centroid.nLines >= 2) && (i == nCount - 1))
{
for (int j = Centroid.nStart; j < nCount; j++)
{
pOut[j] = Centroid.fLow;
}
}
}
}
//=============================================================================
// 输出函数4号:中枢起点、终点信号
//=============================================================================
void Func4(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
CCentroid Centroid;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
// 遇到线段高点,推入中枢算法
if (Centroid.PushHigh(i, pHigh[i]))
{
// 进行标记
pOut[Centroid.nStart] = 1;
pOut[Centroid.nEnd] = 2;
}
}
else if (pIn[i] == -1)
{
// 遇到线段低点,推入中枢算法
if (Centroid.PushLow(i, pLow[i]))
{
// 进行标记
pOut[Centroid.nStart] = 1;
pOut[Centroid.nEnd] = 2;
}
}
// 尾部未完成中枢处理
if (Centroid.bValid && (Centroid.nLines >= 2) && (i == nCount - 1))
{
pOut[Centroid.nStart] = 1;
pOut[nCount-1] = 2;
}
}
}
//=============================================================================
// 输出函数5号:三类买卖点信号
//=============================================================================
void Func5(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
CCentroid Centroid;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
if (Centroid.PushHigh(i, pHigh[i]))
{
// 第三类卖点信号
pOut[i] = 13;
}
else if (Centroid.fTop1 < Centroid.fTop2)
{
// 第二类卖点信号
pOut[i] = 12;
}
else
{
pOut[i] = 0;
}
}
else if (pIn[i] == -1)
{
if (Centroid.PushLow(i, pLow[i]))
{
// 第三类买点信号
pOut[i] = 3;
}
else if (Centroid.fBot1 > Centroid.fBot2)
{
// 第二类买点信号
pOut[i] = 2;
}
else
{
pOut[i] = 0;
}
}
}
}
//=============================================================================
// 输出函数6号:形态买卖点信号
//=============================================================================
void Func6(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
float fTop1 = 0, fTop2 = 0, fTop3 = 0, fTop4 = 0;
float fBot1 = 0, fBot2 = 0, fBot3 = 0, fBot4 = 0;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
fTop4 = fTop3;
fTop3 = fTop2;
fTop2 = fTop1;
fTop1 = pHigh[i];
if (((fBot1 - fTop2)/fTop2 > (fBot2 - fTop3)/fTop3) &&
((fBot2 - fTop3)/fTop3 > (fBot3 - fTop4)/fTop4))
{
if ((fBot1 < fBot2) && (fTop2 < fTop3) &&
(fBot2 < fBot3) && (fTop3 < fTop4))
{
pOut[i] = 1;
continue;
}
if ((fBot1 > fBot2) && (fTop2 > fTop3) && (fBot2 < fBot3) &&
(fTop3 < fTop4) && (fBot1 < fTop3))
{
pOut[i] = 2;
continue;
}
if ((fBot1 > fTop3) && (fBot2 > fBot3) && (fTop3 > fTop4))
{
pOut[i] = 3;
continue;
}
}
}
else if (pIn[i] == -1)
{
fBot4 = fBot3;
fBot3 = fBot2;
fBot2 = fBot1;
fBot1 = pLow[i];
if (((fBot1 - fTop1)/fTop1 > (fBot2 - fTop2)/fTop2) &&
((fBot2 - fTop2)/fTop2 > (fBot3 - fTop3)/fTop3))
{
if ((fBot1 < fBot2) && (fTop1 < fTop2) &&
(fBot2 < fBot3) && (fTop2 < fTop3))
{
pOut[i] = 1;
continue;
}
if ((fBot1 > fBot2) && (fTop1 > fTop2) && (fBot2 < fBot3) &&
(fTop2 < fTop3) && (fBot1 < fTop2))
{
pOut[i] = 2;
continue;
}
if ((fBot1 > fTop2) && (fBot2 > fBot3) && (fTop2 > fTop3))
{
pOut[i] = 3;
continue;
}
}
}
else
{
pOut[i] = 0;
}
}
}
//=============================================================================
// 输出函数7号:线段强度分析指标
//=============================================================================
void Func7(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
int nPrevTop = 0, nPrevBot = 0;
for (int i = 0; i < nCount; i++)
{
// 遇到线段高点
if (pIn[i-1] == 1)
{
// 标记高点位置
nPrevTop = i - 1;
}
// 遇到线段低点
else if (pIn[i-1] == -1)
{
// 标记低点位置
nPrevBot = i - 1;
}
// 上升线段计算模式
if (pIn[i] == 1)
{
// 计算上升线段斜率
pOut[i] = (pHigh[i] - pLow[nPrevBot]) / pLow[nPrevBot] * 100;
}
// 下降线段计算模式
else if (pIn[i] == -1)
{
// 计算上升线段斜率
pOut[i] = (pLow[i] - pHigh[nPrevTop]) / pHigh[nPrevTop] * 100;
}
}
}
//=============================================================================
// 输出函数8号:线段斜率分析指标
//=============================================================================
void Func8(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
int nPrevTop = 0, nPrevBot = 0;
for (int i = 0; i < nCount; i++)
{
// 遇到线段高点
if (pIn[i-1] == 1)
{
// 标记高点位置
nPrevTop = i - 1;
}
// 遇到线段低点
else if (pIn[i-1] == -1)
{
// 标记低点位置
nPrevBot = i - 1;
}
// 上升线段计算模式
if (pIn[i] == 1)
{
// 计算上升线段斜率
pOut[i] = (pHigh[i] - pLow[nPrevBot]) / (i - nPrevBot);
}
// 下降线段计算模式
else if (pIn[i] == -1)
{
// 计算上升线段斜率
pOut[i] = (pLow[i] - pHigh[nPrevTop]) / (i - nPrevTop);
}
}
}
static PluginTCalcFuncInfo Info[] =
{
{1, &Func1},
{2, &Func2},
{3, &Func3},
{4, &Func4},
{5, &Func5},
{6, &Func6},
{7, &Func7},
{8, &Func8},
{0, NULL},
};
BOOL RegisterTdxFunc(PluginTCalcFuncInfo **pInfo)
{
if (*pInfo == NULL)
{
*pInfo = Info;
return TRUE;
}
return FALSE;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/xiaolang1/Indicator.git
git@gitee.com:xiaolang1/Indicator.git
xiaolang1
Indicator
Indicator
master

搜索帮助