예스스탁
예스스탁 답변
2021-06-28 11:33:09
안녕하세요
예스스탁입니다.
Input:ChgRate(0.25),굵기(1),수치표시(1),추세선(1),크기(11);
Var:TL1(0),TL2(0),TL3(0),TL4(0),TL2_exist(0),color(0),
종가사용여부(0), // 종가로 계산하려면 1로 설정한다.
TL_NewBit(0), // 1:NewLine 2:SetEndLine
slope(0),mid_idx(0),mid_val(0),
j(0),k(0),q(0);
Array:고[10,4](0),저[10,4](0); // 1:가격,2:Index,3:sDate,4:sTime
#==========================================#
Value1 = ChgRateZigZag(ChgRate,종가사용여부,고,저,TL_NewBit);
If Value1 == 1 Then { // 고점
If TL_NewBit == 1 Then { // 신규
If 고[2,1] < 고[1,1] Then {
slope = (고[1,1] - 저[1,1]) / (고[1,2] - 저[1,2]);
mid_idx = Floor((고[2,1] - 저[1,1]) / slope);
mid_val = slope * mid_idx + 저[1,1];
Var1 = Index - (저[1,2] + mid_idx);
TL1 = TL_New(저[1,3],저[1,4],저[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,고[1,3],고[1,4],고[1,1]);
Var2 = Index - 저[1,2];
TL_SetColor(TL1,color[Var2]);
color = RED;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
If TL_NewBit == 2 Then { // 연장
TL_Delete(TL1);
If TL2_exist == 1 Then TL_Delete(TL2);
If 고[2,1] < 고[1,1] Then {
slope = (고[1,1] - 저[1,1]) / (고[1,2] - 저[1,2]);
mid_idx = Floor((고[2,1] - 저[1,1]) / slope);
mid_val = slope * mid_idx + 저[1,1];
Var1 = Index - (저[1,2] + mid_idx);
TL1 = TL_New(저[1,3],저[1,4],저[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,고[1,3],고[1,4],고[1,1]);
Var2 = Index - 저[1,2];
TL_SetColor(TL1,color[Var2]);
color = RED;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
} Else If Value1 == -1 Then { // 저점
If TL_NewBit == 1 Then { // 신규
If 저[2,1] > 저[1,1] Then {
slope = (저[1,1] - 고[1,1]) / (저[1,2] - 고[1,2]);
mid_idx = Floor((저[2,1] - 고[1,1]) / slope);
mid_val = slope * mid_idx + 고[1,1];
Var1 = Index - (고[1,2] + mid_idx);
TL1 = TL_New(고[1,3],고[1,4],고[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,저[1,3],저[1,4],저[1,1]);
Var2 = Index - 고[1,2];
TL_SetColor(TL1,color[Var2]);
color = BLUE;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
If TL_NewBit == 2 Then { // 연장
TL_Delete(TL1);
If TL2_exist == 1 Then TL_Delete(TL2);
If 저[2,1] > 저[1,1] Then {
slope = (저[1,1] - 고[1,1]) / (저[1,2] - 고[1,2]);
mid_idx = Floor((저[2,1] - 고[1,1]) / slope);
mid_val = slope * mid_idx + 고[1,1];
Var1 = Index - (고[1,2] + mid_idx);
TL1 = TL_New(고[1,3],고[1,4],고[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,저[1,3],저[1,4],저[1,1]);
Var2 = Index - 고[1,2];
TL_SetColor(TL1,color[Var2]);
color = BLUE;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
}
TL_SetSize(TL1,굵기);
TL_SetSize(TL2,굵기);
//
if 추세선 == 1 Then {
If Value1 == 1 Then { // 고점
If TL_NewBit == 1 Then { // 신규 고점
k = 0;
For j = 2 To 10 {
If 저[1,1] > 저[j,1] and 저[j,1] > 0 Then { // 전저점보다 낮은 이전 전저점 찾는다
k = j;
j = 10; // exit loop
}
}
If k > 1 Then { // 낮은 전저점이 찾아졌다면
TL3 = TL_New(저[k,3],저[k,4],저[k,1],sDate,sTime,(저[1,1]-저[k,1])/(저[1,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
TL_SetColor(TL3,rgb(255,187,0));
}
q = q + 1; // 고점이 새로 추가되었으므로 1 증가
If q > 2 and q <= 10 Then { // 1 증가했으니 2보다 커야 하고 배열 크기가 10이므로 10 이내
TL_SetEnd(TL4,sDate,sTime,(고[2,1]-고[q,1])/(고[2,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
} Else { // 신규 고점이 아니면 기존 추세선만 연장
If k > 1 Then {
TL_SetEnd(TL3,sDate,sTime,(저[1,1]-저[k,1])/(저[1,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
If q > 2 and q <= 10 Then {
TL_SetEnd(TL4,sDate,sTime,(고[2,1]-고[q,1])/(고[2,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
}
} Else If Value1 == -1 Then { // 저점
If TL_NewBit == 1 Then { // 신규 저점
k = k + 1; // 저점이 새로 추가되었으므로 1 증가
If k > 2 and k <= 10 Then { // 1 증가했으니 2보다 커야 하고 배열의 크기가 10이므로 10 이내
TL_SetEnd(TL3,sDate,sTime,(저[2,1]-저[k,1])/(저[2,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
q = 0;
For j = 2 To 10 {
If 고[1,1] < 고[j,1] Then { // 전고점보다 높은 이전 전고점을 찾는다
q = j;
j = 10; // exit loop
}
}
If q > 1 Then { // 높은 전고점이 찾아졌다면
TL4 = TL_New(고[q,3],고[q,4],고[q,1],sDate,sTime,(고[1,1]-고[q,1])/(고[1,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
TL_SetColor(TL4,cyan);
}
} Else { // 신규 저점이 아니면 기존 추세선만 연장
If k > 2 and k <= 10 Then {
TL_SetEnd(TL3,sDate,sTime,(저[2,1]-저[k,1])/(저[2,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
If q > 1 Then {
TL_SetEnd(TL4,sDate,sTime,(고[1,1]-고[q,1])/(고[1,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
}
}
}
//======================================================================//
var : Tx(0);
var : UPR(false),UPH(0),UPCnt(0),tx1(0);
var : DNR(false),DNL(0),DNCnt(0),tx2(0);
if color == RED Then
{
if color[1] != color Then
{
UPCnt = 1;
UPH = 고[1,1];
UPR = true;
tx1 = Text_New(고[1,3],고[1,4],UPH,NumToStr(UPCnt,0)+NewLine);
Text_SetStyle(tx1,2,1);
Text_SetColor(tx1,RED);
}
Else
{
if value1 == 1 and value1 != value1[1] Then
{
UPR = False;
}
if UPR == False and 고[1,1] > UPH Then
{
UPR = true;
UPCnt = UPCnt+2;
tx1 = Text_New(고[1,3],고[1,4],UPH,NumToStr(UPCnt,0)+NewLine);
Text_SetStyle(tx1,2,1);
Text_SetColor(tx1,RED);
}
if UPR == true Then
{
UPH = 고[1,1];
Text_SetLocation(tx1,고[1,3],고[1,4],UPH);
}
}
}
if color == BLUE Then
{
if color[1] != color Then
{
DNCnt = 1;
DNL = 저[1,1];
DNR = true;
tx2 = Text_New(저[1,3],저[1,4],DNL,NewLine+NumToStr(DNCnt,0));
Text_SetStyle(tx2,2,0);
Text_SetColor(tx2,BLUE);
}
Else
{
if value1 == 1 and value1 != value1[1] Then
{
DNR = False;
}
if DNR == False and 저[1,1] < DNL Then
{
DNR = true;
DNCnt = DNCnt+2;
tx2 = Text_New(저[1,3],저[1,4],DNL,NewLine+NumToStr(DNCnt,0));
Text_SetStyle(tx2,2,0);
Text_SetColor(tx2,BLUE);
}
if DNR == true Then
{
DNL = 저[1,1];
Text_SetLocation(tx2,저[1,3],저[1,4],DNL);
}
}
}
if 수치표시 == 1 Then
{
if value1 == 1 Then
{
if value1[1] == -1 Then
{
Tx = Text_New(고[1,3],고[1,4],고[1,1],NumToStr(고[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[2,1]-저[1,1])*100,0)+"%"+")");
Text_SetStyle(tx,2,1);
}
Else
{
Text_SetString(tx,NumToStr(고[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[2,1]-저[1,1])*100,0)+"%"+")");
Text_SetLocation(tx,고[1,3],고[1,4],고[1,1]);
}
}
if value1 == -1 Then
{
if value1[1] == 1 Then
{
Tx = Text_New(저[1,3],저[1,4],저[1,1],NumToStr(저[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[1,1]-저[2,1])*100,0)+"%"+")");
Text_SetStyle(tx,2,0);
}
Else
{
Text_SetString(tx,NumToStr(저[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[1,1]-저[2,1])*100,0)+"%"+")");
Text_SetLocation(tx,저[1,3],저[1,4],저[1,1]);
}
}
Text_SetSize(Tx,크기);
Text_SetColor(tx,white);
}
즐거운 하루되세요
> 당일선물 님이 쓴 글입니다.
> 제목 : 수식도움 부탁드립니다.
>
아래의 수식에서
직전고점을 돌파한 상승파동(빨간색 파동선)의 신규고점을 카운팅하여 숫자를 빨간색으로
직전저점을 돌파한 하락파동(파란색 파동선)의 신규저점을 카운팅하여 숫자를 파란색으로
파란색파동의 고점에는 카운팅이 필요없습니다.
파란색파동에서는 직전저점을 돌파한 저점만 카운팅 1,3,5,7,9...
빨간색 파동의 저점에는 카운팅이 필요없습니다.
빨간색 파동에서는 직전고점을 돌파한 고점만 카운팅 1,3,5,7,9,..
텍스트 출력하는 수식보완 도움부탁드립니다.
그림참조부탁드립니다.
아래수식...
//===================================//
Input:ChgRate(0.25),굵기(1),수치표시(1),추세선(1),크기(11);
Var:TL1(0),TL2(0),TL3(0),TL4(0),TL2_exist(0),color(0),
종가사용여부(0), // 종가로 계산하려면 1로 설정한다.
TL_NewBit(0), // 1:NewLine 2:SetEndLine
slope(0),mid_idx(0),mid_val(0),
j(0),k(0),q(0);
Array:고[10,4](0),저[10,4](0); // 1:가격,2:Index,3:sDate,4:sTime
#==========================================#
Value1 = ChgRateZigZag(ChgRate,종가사용여부,고,저,TL_NewBit);
If Value1 == 1 Then { // 고점
If TL_NewBit == 1 Then { // 신규
If 고[2,1] < 고[1,1] Then {
slope = (고[1,1] - 저[1,1]) / (고[1,2] - 저[1,2]);
mid_idx = Floor((고[2,1] - 저[1,1]) / slope);
mid_val = slope * mid_idx + 저[1,1];
Var1 = Index - (저[1,2] + mid_idx);
TL1 = TL_New(저[1,3],저[1,4],저[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,고[1,3],고[1,4],고[1,1]);
Var2 = Index - 저[1,2];
TL_SetColor(TL1,color[Var2]);
color = RED;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
If TL_NewBit == 2 Then { // 연장
TL_Delete(TL1);
If TL2_exist == 1 Then TL_Delete(TL2);
If 고[2,1] < 고[1,1] Then {
slope = (고[1,1] - 저[1,1]) / (고[1,2] - 저[1,2]);
mid_idx = Floor((고[2,1] - 저[1,1]) / slope);
mid_val = slope * mid_idx + 저[1,1];
Var1 = Index - (저[1,2] + mid_idx);
TL1 = TL_New(저[1,3],저[1,4],저[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,고[1,3],고[1,4],고[1,1]);
Var2 = Index - 저[1,2];
TL_SetColor(TL1,color[Var2]);
color = RED;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(저[1,3],저[1,4],저[1,1],고[1,3],고[1,4],고[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
} Else If Value1 == -1 Then { // 저점
If TL_NewBit == 1 Then { // 신규
If 저[2,1] > 저[1,1] Then {
slope = (저[1,1] - 고[1,1]) / (저[1,2] - 고[1,2]);
mid_idx = Floor((저[2,1] - 고[1,1]) / slope);
mid_val = slope * mid_idx + 고[1,1];
Var1 = Index - (고[1,2] + mid_idx);
TL1 = TL_New(고[1,3],고[1,4],고[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,저[1,3],저[1,4],저[1,1]);
Var2 = Index - 고[1,2];
TL_SetColor(TL1,color[Var2]);
color = BLUE;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
If TL_NewBit == 2 Then { // 연장
TL_Delete(TL1);
If TL2_exist == 1 Then TL_Delete(TL2);
If 저[2,1] > 저[1,1] Then {
slope = (저[1,1] - 고[1,1]) / (저[1,2] - 고[1,2]);
mid_idx = Floor((저[2,1] - 고[1,1]) / slope);
mid_val = slope * mid_idx + 고[1,1];
Var1 = Index - (고[1,2] + mid_idx);
TL1 = TL_New(고[1,3],고[1,4],고[1,1],sDate[Var1],sTime[Var1],mid_val);
TL2 = TL_New(sDate[Var1],sTime[Var1],mid_val,저[1,3],저[1,4],저[1,1]);
Var2 = Index - 고[1,2];
TL_SetColor(TL1,color[Var2]);
color = BLUE;
TL_SetColor(TL2,color);
TL2_exist = 1;
} Else {
TL1 = TL_New(고[1,3],고[1,4],고[1,1],저[1,3],저[1,4],저[1,1]);
TL_SetColor(TL1,color);
TL2_exist = 0;
}
}
}
TL_SetSize(TL1,굵기);
TL_SetSize(TL2,굵기);
//
if 추세선 == 1 Then {
If Value1 == 1 Then { // 고점
If TL_NewBit == 1 Then { // 신규 고점
k = 0;
For j = 2 To 10 {
If 저[1,1] > 저[j,1] and 저[j,1] > 0 Then { // 전저점보다 낮은 이전 전저점 찾는다
k = j;
j = 10; // exit loop
}
}
If k > 1 Then { // 낮은 전저점이 찾아졌다면
TL3 = TL_New(저[k,3],저[k,4],저[k,1],sDate,sTime,(저[1,1]-저[k,1])/(저[1,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
TL_SetColor(TL3,rgb(255,187,0));
}
q = q + 1; // 고점이 새로 추가되었으므로 1 증가
If q > 2 and q <= 10 Then { // 1 증가했으니 2보다 커야 하고 배열 크기가 10이므로 10 이내
TL_SetEnd(TL4,sDate,sTime,(고[2,1]-고[q,1])/(고[2,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
} Else { // 신규 고점이 아니면 기존 추세선만 연장
If k > 1 Then {
TL_SetEnd(TL3,sDate,sTime,(저[1,1]-저[k,1])/(저[1,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
If q > 2 and q <= 10 Then {
TL_SetEnd(TL4,sDate,sTime,(고[2,1]-고[q,1])/(고[2,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
}
} Else If Value1 == -1 Then { // 저점
If TL_NewBit == 1 Then { // 신규 저점
k = k + 1; // 저점이 새로 추가되었으므로 1 증가
If k > 2 and k <= 10 Then { // 1 증가했으니 2보다 커야 하고 배열의 크기가 10이므로 10 이내
TL_SetEnd(TL3,sDate,sTime,(저[2,1]-저[k,1])/(저[2,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
q = 0;
For j = 2 To 10 {
If 고[1,1] < 고[j,1] Then { // 전고점보다 높은 이전 전고점을 찾는다
q = j;
j = 10; // exit loop
}
}
If q > 1 Then { // 높은 전고점이 찾아졌다면
TL4 = TL_New(고[q,3],고[q,4],고[q,1],sDate,sTime,(고[1,1]-고[q,1])/(고[1,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
TL_SetColor(TL4,cyan);
}
} Else { // 신규 저점이 아니면 기존 추세선만 연장
If k > 2 and k <= 10 Then {
TL_SetEnd(TL3,sDate,sTime,(저[2,1]-저[k,1])/(저[2,2]-저[k,2])*(Index-저[k,2])+저[k,1]);
}
If q > 1 Then {
TL_SetEnd(TL4,sDate,sTime,(고[1,1]-고[q,1])/(고[1,2]-고[q,2])*(Index-고[q,2])+고[q,1]);
}
}
}
}
//======================================================================//
var : Tx(0);
if 수치표시 == 1 Then {
if value1 == 1 Then
{
if value1[1] == -1 Then
{
Tx = Text_New(고[1,3],고[1,4],고[1,1],NumToStr(고[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[2,1]-저[1,1])*100,0)+"%"+")");
Text_SetStyle(tx,2,1);
}
Else
{
Text_SetString(tx,NumToStr(고[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[2,1]-저[1,1])*100,0)+"%"+")");
Text_SetLocation(tx,고[1,3],고[1,4],고[1,1]);
}
}
if value1 == -1 Then
{
if value1[1] == 1 Then
{
Tx = Text_New(저[1,3],저[1,4],저[1,1],NumToStr(저[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[1,1]-저[2,1])*100,0)+"%"+")");
Text_SetStyle(tx,2,0);
}
Else
{
Text_SetString(tx,NumToStr(저[1,1],2)+"("+NumToStr(고[1,1]-저[1,1],2)+", "
+NumToStr((고[1,1]-저[1,1])/(고[1,1]-저[2,1])*100,0)+"%"+")");
Text_SetLocation(tx,저[1,3],저[1,4],저[1,1]);
}
}
Text_SetSize(Tx,크기);
Text_SetColor(tx,white);
}