📄 xxx.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "XXX.h"
#include "jesse.h"
#include "stdlib.h"
#define REF(X,n) X[n]
typedef struct List
{
float hi;
float lo;
TColor color;
int yyyy,mm,dd;
} TrilineList;
struct LList
{
struct List item[3000];
int count;
} trile ;
typedef TrilineList* Trilines;
void initialize();
void add(double,double,TColor,int,int,int);
int count();
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CandleCh"
#pragma link "OHLChart"
#pragma link "BigCandl"
#pragma link "TeeSeriesTextEd"
//#pragma link "TeeURL"
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormActivate(TObject *Sender)
{
float x;
Series1->Clear();
//Series1->FillSampleValues(30);
Chart1->Update();
TDateTime t;
t=TDateTime::CurrentDate();
this->Caption = Form1->Caption;
Triline( Form1->Price[0] );
//因为蜡烛图控件是自己判断阴阳线的,所以不需要分辨颜色
//故而将三线反转算法的高低价格拨乱反正
for(int i=0;i<count();i++)
{
if(trile.item[i].color==clBlack)
{
x = trile.item[i].lo;
trile.item[i].lo=trile.item[i].hi;
trile.item[i].hi=x;
}
}
for(int i=0;i<count();i++)
{
//Series1->UpCloseColor=clWhite;
//Series1->Pen->Color= trile.item[i].color;
Series1->AddCandle(EncodeDate( trile.item[i].yyyy, trile.item[i].mm, trile.item[i].dd),
trile.item[i].lo,
trile.item[i].lo,
trile.item[i].hi,
trile.item[i].hi
);
}
}
//---------------------------------------------------------------------------
void TForm3::Triline( double BASE )
{
initialize();
for(int i=0;i<Form1->nill;i++)
{
/*一、绘制第一根线*/
/*1。法则1如果今日收盘价高于基准价,从基准价到收盘价之间画红线*/
if ( count()==0 )
{
if( Form1->Price[i]>BASE )
{
add(Form1->Price[i],BASE,clRed, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
/*2。法则2如果今日收盘价低于基准价,从基准价到收盘价之间画黑线*/
if( Form1->Price[i]<BASE )
{
add(BASE,Form1->Price[i],clBlack, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
/*3。法则3如果今日收盘价等于基准价,不画线*/
/*二、绘制第二根线*/
/*6。法则6如果今日收盘价在第一根线价格范围内,不画线*/
/*4。法则4如果今日收盘价高于第一根线最高价,在先前高价到收盘价之间画红线*/
if ( count()==1)
{
if( Form1->Price[i] > trile.item[count()-1].hi )
{
add(Form1->Price[i], trile.item[count()-1].hi, clRed, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
/*5。法则5如果今日收盘价低于第一根线最低价,从线前最低价到收盘价之间画黑线*/
if( Form1->Price[i] < trile.item[count()-1].lo )
{
add( trile.item[count()-1].lo,Form1->Price[i], clBlack, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
/*三、绘制第三根线*/
/*9。法则9如果今日收盘价处于先前线形的价格范围之内,不画线*/
/*7。法则7如果今日收盘价高于先前线形最高价,从先前线形最高价到收盘价之间画红线*/
if ( count()==2)
{
if( Form1->Price[i] > trile.item[count()-1].hi )
{
add(Form1->Price[i], trile.item[count()-1].hi, clRed, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
/*8。法则8如果今日收盘价低于先前线形最低价,从先前线形最低价到收盘价之间画黑线*/
if( Form1->Price[i] < trile.item[count()-1].lo )
{
add(trile.item[count()-1].lo, Form1->Price[i], clBlack, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
/*四、连续三红线,或者连续三根黑线之后的绘图方法*/
/*10。法则10如果连续出现3根红线价格继续创新高,则继续从先前线形最高价到收盘价之间画红线*/
if( count()>=3 && trile.item[count()-1].color==clRed && trile.item[count()-2].color==clRed && trile.item[count()-3].color==clRed )
{
if( Form1->Price[i] > trile.item[count()-1].hi)
{
add( Form1->Price[i], trile.item[count()-1].hi, clRed, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
/*11。连续3根红线之后,绘制黑线则必须价格低于前三根红线的最低价,
// 从前一根红线的最低价到收盘价之间画黑线*/
if( count()>=3 && trile.item[count()-1].color==clRed && trile.item[count()-2].color==clRed && trile.item[count()-3].color==clRed )
{
if( Form1->Price[i] < trile.item[count()-3].lo )
{
add( trile.item[count()-1].lo, Form1->Price[i], clBlack, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
/*12。法则12如果连续出现3根黑线价格继续创新低,则继续从先前线形最低价到收盘价之间画黑线*/
if( count()>=3 && trile.item[count()-1].color==clBlack && trile.item[count()-2].color==clBlack && trile.item[count()-3].color==clBlack )
{
if( Form1->Price[i] < trile.item[count()-1].lo )
{
add( trile.item[count()-1].lo, Form1->Price[i], clBlack, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
/*13。连续3根黑线之后,绘制红线则必须价格高于前三根黑线的最高价,
// 从前一根黑线的最高价到收盘价之间画红线*/
if( count()>=3 && trile.item[count()-1].color==clBlack && trile.item[count()-2].color==clBlack && trile.item[count()-3].color==clBlack )
{
if( Form1->Price[i] > trile.item[count()-3].hi )
{
add( Form1->Price[i], trile.item[count()-1].hi, clRed, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
//问题大约出现在这里,拉锯的情况遗漏了,以至于图表不能连续,修改如下,一切就好了
if( count()>=3 && trile.item[count()-1].color==clRed && !(trile.item[count()-2].color==clRed && trile.item[count()-3].color==clRed ))
{
if( Form1->Price[i] > trile.item[count()-1].hi)
{
add( Form1->Price[i], trile.item[count()-1].hi, clRed, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
if( Form1->Price[i] < trile.item[count()-1].lo)
{
add( trile.item[count()-1].lo, Form1->Price[i], clBlack, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
// 问题大约出现在这里,拉锯的情况遗漏了,以至于图表不能连续,修改如下,一切就好了
if( count()>=3 && trile.item[count()-1].color==clBlack && !(trile.item[count()-2].color==clBlack && trile.item[count()-3].color==clBlack))
{
if( Form1->Price[i] < trile.item[count()-1].lo )
{
add( trile.item[count()-1].lo, Form1->Price[i], clBlack, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
if( Form1->Price[i] > trile.item[count()-1].hi )
{
add( Form1->Price[i], trile.item[count()-1].hi, clRed, Form1->YYYY[i], Form1->MM[i], Form1->DD[i]);
continue;
}
}
}
}
void initialize()
{
trile.count=0;
}
void add(double hi, double lo,TColor color, int yyyy, int mm, int dd )
{
trile.item[trile.count].hi=hi;
trile.item[trile.count].lo=lo;
trile.item[trile.count].color=color;
trile.item[trile.count].yyyy=yyyy;
trile.item[trile.count].mm=mm;
trile.item[trile.count].dd=dd;
trile.count++;
}
int count()
{
return trile.count;
}
void __fastcall TForm3::Chart1MouseWheelDown(TObject *Sender,
TShiftState Shift, TPoint &MousePos, bool &Handled)
{
//Series1->ZoomOut();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Chart1MouseWheelUp(TObject *Sender,
TShiftState Shift, TPoint &MousePos, bool &Handled)
{
//Chart1->Zoom(1);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -