1 Star 0 Fork 39

caiyeahku/ChanlunX

forked from rubikplanet/ChanlunX 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Main.cpp 25.45 KB
一键复制 编辑 原始数据 按行查看 历史
devdevdevdeep 提交于 2019-03-31 10:56 . save
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
#include "Main.h"
#include <iostream>
#include <fstream>
using namespace std;
//定义DLL程序的入口函数
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//=============================================================================
// 输出函数1号:输出简笔顶底端点
//=============================================================================
void Func1(int nCount, float *pOut, float *pHigh, float *pLow, float *pIgnore)
{
Bi1(nCount, pOut, pHigh, pLow, pIgnore);
}
//=============================================================================
// 输出函数2号:输出标准笔顶底端点
//=============================================================================
void Func2(int nCount, float *pOut, float *pHigh, float *pLow, float *pIgnore)
{
Bi2(nCount, pOut, pHigh, pLow, pIgnore);
}
//=============================================================================
// 输出函数3号:输出段的端点标准画法
//=============================================================================
void Func3(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
Duan1(nCount, pOut, pIn, pHigh, pLow);
}
//=============================================================================
// 输出函数4号:输出段的端点1+1终结画法
//=============================================================================
void Func4(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
Duan2(nCount, pOut, pIn, pHigh, pLow);
}
//=============================================================================
// 输出函数5号:中枢高点数据
//=============================================================================
void Func5(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
ZhongShu ZhongShuOne;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
// 遇到线段高点,推入中枢算法
if (ZhongShuOne.PushHigh(i, pHigh[i]))
{
bool bValid = true;
float fHighValue;
int nHignIndex;
int nLowIndex;
int nLowIndexTemp;
int nHighCount = 0;
if (ZhongShuOne.nDirection == 1 && ZhongShuOne.nTerminate == -1) // 向上中枢被向下终结
{
bValid = false;
for (int x = ZhongShuOne.nStart; x <= ZhongShuOne.nEnd; x++)
{
if (pIn[x] == 1)
{
if (nHighCount == 0)
{
nHighCount++;
fHighValue = pHigh[x];
nHignIndex = x;
}
else
{
nHighCount++;
if (pHigh[x] >= fHighValue)
{
if (nHighCount > 2)
{
bValid = true;
}
fHighValue = pHigh[x];
nHignIndex = x;
nLowIndex = nLowIndexTemp;
}
}
}
else if (pIn[x] == -1)
{
nLowIndexTemp = x;
}
}
if (bValid)
{
ZhongShuOne.nEnd = nLowIndex; // 中枢结束点移到最高点的前一个低点。
}
i = nHignIndex - 1;
}
else
{
i = ZhongShuOne.nEnd - 1;
}
if (bValid)
{
// 区段内更新算得的中枢高数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = ZhongShuOne.fHigh;
}
}
ZhongShuOne.Reset();
}
}
else if (pIn[i] == -1)
{
// 遇到线段低点,推入中枢算法
if (ZhongShuOne.PushLow(i, pLow[i]))
{
bool bValid = true;
float fLowValue;
int nLowIndex;
int nHighIndex;
int nHighIndexTemp;
int nLowCount = 0;
if (ZhongShuOne.nDirection == -1 && ZhongShuOne.nTerminate == 1) // 向下中枢被向上终结
{
bValid = false;
for (int x = ZhongShuOne.nStart; x <= ZhongShuOne.nEnd; x++)
{
if (pIn[x] == -1)
{
if (nLowCount == 0)
{
nLowCount++;
fLowValue = pLow[x];
nLowIndex = x;
}
else
{
nLowCount++;
if (pLow[x] <= fLowValue)
{
if (nLowCount > 2)
{
bValid = true;
}
fLowValue = pLow[x];
nLowIndex = x;
nHighIndex = nHighIndexTemp;
}
}
}
else if (pIn[x] == 1)
{
nHighIndexTemp = x;
}
}
if (bValid)
{
ZhongShuOne.nEnd = nHighIndex; // 中枢结束点移到最高点的前一个低点。
}
i = nLowIndex - 1;
}
else
{
i = ZhongShuOne.nEnd - 1;
}
if (bValid)
{
// 区段内更新算得的中枢高数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = ZhongShuOne.fHigh;
}
}
ZhongShuOne.Reset();
}
}
}
if (ZhongShuOne.bValid) // 最后一个还没有被终结的中枢。
{
// 区段内更新算得的中枢高数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = ZhongShuOne.fHigh;
}
}
}
//=============================================================================
// 输出函数6号:中枢低点数据
//=============================================================================
void Func6(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
ZhongShu ZhongShuOne;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
// 遇到线段高点,推入中枢算法
if (ZhongShuOne.PushHigh(i, pHigh[i]))
{
bool bValid = true;
float fHighValue;
int nHignIndex;
int nLowIndex;
int nLowIndexTemp;
int nHighCount = 0;
if (ZhongShuOne.nDirection == 1 && ZhongShuOne.nTerminate == -1) // 向上中枢被向下终结
{
bValid = false;
for (int x = ZhongShuOne.nStart; x <= ZhongShuOne.nEnd; x++)
{
if (pIn[x] == 1)
{
if (nHighCount == 0)
{
nHighCount++;
fHighValue = pHigh[x];
nHignIndex = x;
}
else
{
nHighCount++;
if (pHigh[x] >= fHighValue)
{
if (nHighCount > 2)
{
bValid = true;
}
fHighValue = pHigh[x];
nHignIndex = x;
nLowIndex = nLowIndexTemp;
}
}
}
else if (pIn[x] == -1)
{
nLowIndexTemp = x;
}
}
if (bValid)
{
ZhongShuOne.nEnd = nLowIndex; // 中枢结束点移到最高点的前一个低点。
}
i = nHignIndex - 1;
}
else
{
i = ZhongShuOne.nEnd - 1;
}
if (bValid)
{
// 区段内更新算得的中枢低数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = ZhongShuOne.fLow;
}
}
ZhongShuOne.Reset();
}
}
else if (pIn[i] == -1)
{
// 遇到线段低点,推入中枢算法
if (ZhongShuOne.PushLow(i, pLow[i]))
{
bool bValid = true;
float fLowValue;
int nLowIndex;
int nHighIndex;
int nHighIndexTemp;
int nLowCount = 0;
if (ZhongShuOne.nDirection == -1 && ZhongShuOne.nTerminate == 1) // 向下中枢被向上终结
{
bValid = false;
for (int x = ZhongShuOne.nStart; x <= ZhongShuOne.nEnd; x++)
{
if (pIn[x] == -1)
{
if (nLowCount == 0)
{
nLowCount++;
fLowValue = pLow[x];
nLowIndex = x;
}
else
{
nLowCount++;
if (pLow[x] <= fLowValue)
{
if (nLowCount > 2)
{
bValid = true;
}
fLowValue = pLow[x];
nLowIndex = x;
nHighIndex = nHighIndexTemp;
}
}
}
else if (pIn[x] == 1)
{
nHighIndexTemp = x;
}
}
if (bValid)
{
ZhongShuOne.nEnd = nHighIndex; // 中枢结束点移到最高点的前一个低点。
}
i = nLowIndex - 1;
}
else
{
i = ZhongShuOne.nEnd - 1;
}
if (bValid)
{
// 区段内更新算得的中枢低数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = ZhongShuOne.fLow;
}
}
ZhongShuOne.Reset();
}
}
}
if (ZhongShuOne.bValid)
{
// 区段内更新算得的中枢低数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = ZhongShuOne.fLow;
}
}
}
//=============================================================================
// 输出函数7号:中枢起点、终点信号
//=============================================================================
void Func7(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
//std::ofstream fout;
//fout.open("D:\\CHANLUN.TXT", std::ofstream::out);
ZhongShu ZhongShuOne;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
// 遇到线段高点,推入中枢算法
if (ZhongShuOne.PushHigh(i, pHigh[i]))
{
//fout<<"中枢终结"<<pHigh[i]<<endl;
bool bValid = true;
float fHighValue;
int nHignIndex;
int nLowIndex;
int nLowIndexTemp;
int nHighCount = 0;
if (ZhongShuOne.nDirection == 1 && ZhongShuOne.nTerminate == -1) // 向上中枢被向下终结
{
//fout<<"向上中枢被向下终结"<<endl;
bValid = false;
for (int x = ZhongShuOne.nStart; x <= ZhongShuOne.nEnd; x++)
{
if (pIn[x] == 1)
{
if (nHighCount == 0)
{
nHighCount++;
fHighValue = pHigh[x];
nHignIndex = x;
}
else
{
nHighCount++;
if (pHigh[x] >= fHighValue)
{
if (nHighCount > 2)
{
bValid = true;
}
fHighValue = pHigh[x];
nHignIndex = x;
nLowIndex = nLowIndexTemp;
}
}
}
else if (pIn[x] == -1)
{
nLowIndexTemp = x;
}
}
if (bValid)
{
//fout<<"同级别分解保留最后中枢"<<endl;
//fout<<"中枢结束点移到"<<pLow[nLowIndex]<<endl;
ZhongShuOne.nEnd = nLowIndex; // 中枢结束点移到最高点的前一个低点。
}
else
{
//fout<<"同级别分解最后中枢无效"<<endl;
}
i = nHignIndex - 1;
}
else
{
//fout<<"向下中枢被向下终结"<<endl;
i = ZhongShuOne.nEnd - 1;
}
if (bValid)
{
// 进行标记
pOut[ZhongShuOne.nStart + 1] = 1;
pOut[ZhongShuOne.nEnd - 1] = 2;
}
ZhongShuOne.Reset();
}
}
else if (pIn[i] == -1)
{
// 遇到线段低点,推入中枢算法
if (ZhongShuOne.PushLow(i, pLow[i]))
{
//fout<<"中枢终结"<<pHigh[i]<<endl;
bool bValid = true;
float fLowValue;
int nLowIndex;
int nHighIndex;
int nHighIndexTemp;
int nLowCount = 0;
if (ZhongShuOne.nDirection == -1 && ZhongShuOne.nTerminate == 1) // 向下中枢被向上终结
{
//fout<<"向下中枢被向上终结"<<endl;
bValid = false;
for (int x = ZhongShuOne.nStart; x <= ZhongShuOne.nEnd; x++)
{
if (pIn[x] == -1)
{
if (nLowCount == 0)
{
nLowCount++;
fLowValue = pLow[x];
nLowIndex = x;
}
else
{
nLowCount++;
if (pLow[x] <= fLowValue)
{
if (nLowCount > 2)
{
bValid = true;
}
fLowValue = pLow[x];
nLowIndex = x;
nHighIndex = nHighIndexTemp;
}
}
//fout<<"低点数量"<<nLowCount<<endl;
}
else if (pIn[x] == 1)
{
nHighIndexTemp = x;
}
}
if (bValid)
{
//fout<<"同级别分解保留最后中枢"<<endl;
//fout<<"中枢结束点移到"<<pHigh[nHighIndex]<<endl;
ZhongShuOne.nEnd = nHighIndex; // 中枢结束点移到最高点的前一个低点。
}
else
{
//fout<<"同级别分解最后中枢无效"<<endl;
}
i = nLowIndex - 1;
}
else
{
//fout<<"向上中枢被向上终结"<<endl;
i = ZhongShuOne.nEnd - 1;
}
if (bValid)
{
// 进行标记
pOut[ZhongShuOne.nStart + 1] = 1;
pOut[ZhongShuOne.nEnd - 1] = 2;
}
ZhongShuOne.Reset();
}
}
}
if (ZhongShuOne.bValid)
{
// 进行标记
pOut[ZhongShuOne.nStart + 1] = 1;
pOut[ZhongShuOne.nEnd - 1] = 2;
}
//fout.close();
}
//=============================================================================
// 输出函数8号:中枢方向数据
//=============================================================================
void Func8(int nCount, float *pOut, float *pIn, float *pHigh, float *pLow)
{
ZhongShu ZhongShuOne;
for (int i = 0; i < nCount; i++)
{
if (pIn[i] == 1)
{
// 遇到线段高点,推入中枢算法
if (ZhongShuOne.PushHigh(i, pHigh[i]))
{
bool bValid = true;
float fHighValue;
int nHignIndex;
int nLowIndex;
int nLowIndexTemp;
int nHighCount = 0;
if (ZhongShuOne.nDirection == 1 && ZhongShuOne.nTerminate == -1) // 向上中枢被向下终结
{
bValid = false;
for (int x = ZhongShuOne.nStart; x <= ZhongShuOne.nEnd; x++)
{
if (pIn[x] == 1)
{
if (nHighCount == 0)
{
nHighCount++;
fHighValue = pHigh[x];
nHignIndex = x;
}
else
{
nHighCount++;
if (pHigh[x] >= fHighValue)
{
if (nHighCount > 2)
{
bValid = true;
}
fHighValue = pHigh[x];
nHignIndex = x;
nLowIndex = nLowIndexTemp;
}
}
}
else if (pIn[x] == -1)
{
nLowIndexTemp = x;
}
}
if (bValid)
{
ZhongShuOne.nEnd = nLowIndex; // 中枢结束点移到最高点的前一个低点。
}
i = nHignIndex - 1;
}
else
{
i = ZhongShuOne.nEnd - 1;
}
if (bValid)
{
// 区段内更新算得的中枢方向数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = (float) ZhongShuOne.nDirection;
}
}
ZhongShuOne.Reset();
}
}
else if (pIn[i] == -1)
{
// 遇到线段低点,推入中枢算法
if (ZhongShuOne.PushLow(i, pLow[i]))
{
bool bValid = true;
float fLowValue;
int nLowIndex;
int nHighIndex;
int nHighIndexTemp;
int nLowCount = 0;
if (ZhongShuOne.nDirection == -1 && ZhongShuOne.nTerminate == 1) // 向下中枢被向上终结
{
bValid = false;
for (int x = ZhongShuOne.nStart; x <= ZhongShuOne.nEnd; x++)
{
if (pIn[x] == -1)
{
if (nLowCount == 0)
{
nLowCount++;
fLowValue = pLow[x];
nLowIndex = x;
}
else
{
nLowCount++;
if (pLow[x] <= fLowValue)
{
if (nLowCount > 2)
{
bValid = true;
}
fLowValue = pLow[x];
nLowIndex = x;
nHighIndex = nHighIndexTemp;
}
}
}
else if (pIn[x] == 1)
{
nHighIndexTemp = x;
}
}
if (bValid)
{
ZhongShuOne.nEnd = nHighIndex; // 中枢结束点移到最高点的前一个低点。
}
i = nLowIndex - 1;
}
else
{
i = ZhongShuOne.nEnd - 1;
}
if (bValid)
{
// 区段内更新算得的中枢方向数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = (float) ZhongShuOne.nDirection;
}
}
ZhongShuOne.Reset();
}
}
}
if (ZhongShuOne.bValid)
{
// 区段内更新算得的中枢方向数据
for (int j = ZhongShuOne.nStart + 1; j <= ZhongShuOne.nEnd - 1; j++)
{
pOut[j] = (float) ZhongShuOne.nDirection;
}
}
}
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;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/caiyeahku/ChanlunX.git
git@gitee.com:caiyeahku/ChanlunX.git
caiyeahku
ChanlunX
ChanlunX
master

搜索帮助