예스스탁
예스스탁 답변
2023-08-28 10:10:00
안녕하세요
예스스탁입니다.
input : ntime(140800), xtime(150600);
input : line_num(5), tick_size(12);
var : Tcond(False), oo(0), k(0), j(0);
array : flag[3](0);
array : up[2](0), middle[2](0), down[2](0);
array : up_TL[2](0), middle_TL[2](0), down_TL[2](0);
array : up_cnt[2](0), middle_cnt[2](0), down_cnt[2](0);
array : up_text[2](0), middle_text[2](0), down_text[2](0);
if (sdate != sdate[1] and stime >= xtime) or
(sdate == sdate[1] and stime >= xtime and stime[1] < xtime) Then
Tcond = False;
if (sdate != sdate[1] and stime >= ntime) or
(sdate == sdate[1] and stime >= ntime and stime[1] < ntime) Then
{
// 변수들 초기화 해주기
Tcond = true;
oo = o;
For k=1 to 3
{
flag[k] = 0;
}
For j=1 to 2
{
up[j] = 0;
middle[j] = 0;
down[j] = 0;
up_cnt[j] = 0;
middle_cnt[j] = 0;
down_cnt[j] = 0;
}
up[2] = oo + PriceScale*30;
up[1] = oo + PriceScale*20;
middle[2] = oo + PriceScale*10;
middle[1] = oo + PriceScale;
down[2] = oo - PriceScale*10;
down[1] = oo - PriceScale*20;
// 선그리기
up_TL[2] = TL_New(sDate,sTime,up[2],NextBarSdate,NextBarStime,up[2]); // 선긋기
up_TL[1] = TL_New(sDate,sTime,up[1],NextBarSdate,NextBarStime,up[1]); // 선긋기
middle_TL[2] = TL_New(sDate,sTime,middle[2],NextBarSdate,NextBarStime,middle[2]); // 선긋기
middle_TL[1] = TL_New(sDate,sTime,middle[1],NextBarSdate,NextBarStime,middle[1]); // 선긋기
down_TL[2] = TL_New(sDate,sTime,down[2],NextBarSdate,NextBarStime,down[2]); // 선긋기
down_TL[1] = TL_New(sDate,sTime,down[1],NextBarSdate,NextBarStime,down[1]); // 선긋기
// 조건문으로 터치 카운트 하기
// up
if H >= up[2] Then
{
flag[3] = 1;
up_cnt[2] = up_cnt[2] + 1;
}
if L <= up[1] Then
{
flag[3] = -1;
up_cnt[1] = up_cnt[1] + 1;
}
// middle
if H >= middle[2] Then
{
flag[2] = 1;
middle_cnt[2] = middle_cnt[2] + 1;
}
if L <= middle[1] Then
{
flag[2] = -1;
middle_cnt[1] = middle_cnt[1] + 1;
}
// down
if H >= down[2] Then
{
flag[1] = 1;
down_cnt[2] = down_cnt[2] + 1;
}
if L <= down[1] Then
{
flag[1] = -1;
down_cnt[1] = down_cnt[1] + 1;
}
// 터치 횟수 출력
up_text[2] = Text_New(NextBarSdate,NextBarStime,up[2],NumToStr(up_cnt[2],0));
up_text[1] = Text_New(NextBarSdate,NextBarStime,up[1],NumToStr(up_cnt[1],0));
middle_text[2] = Text_New(NextBarSdate,NextBarStime,middle[2],NumToStr(middle_cnt[2],0));
middle_text[1] = Text_New(NextBarSdate,NextBarStime,middle[1],NumToStr(middle_cnt[1],0));
down_text[2] = Text_New(NextBarSdate,NextBarStime,down[2],NumToStr(down_cnt[2],0));
down_text[1] = Text_New(NextBarSdate,NextBarStime,down[1],NumToStr(down_cnt[1],0));
}
Else
{
if Tcond == true Then
{
// up쪽 카운트 갱신하기
if flag[3] <= 0 and H >= up[2] and H[1] < up[2] Then
{
flag[3] = 1;
up_cnt[2] = up_cnt[2] + 1;
Text_SetString(up_text[2],NumToStr(up_cnt[2],0));
}
if flag[3] >= 0 and H >= up[1] and H[1] < up[1] Then
{
flag[3] = -1;
up_cnt[1] = up_cnt[1] + 1;
Text_SetString(up_text[1],NumToStr(up_cnt[1],0));
}
// middle쪽 카운트 갱신하기
if flag[2] <= 0 and H >= middle[2] and H[1] < middle[2] Then
{
flag[2] = 1;
middle_cnt[2] = middle_cnt[2] + 1;
Text_SetString(middle_text[2],NumToStr(middle_cnt[2],0));
}
if flag[2] >= 0 and H >= middle[1] and H[1] < middle[1] Then
{
flag[2] = -1;
middle_cnt[1] = middle_cnt[1] + 1;
Text_SetString(middle_text[1],NumToStr(middle_cnt[1],0));
}
// down쪽 카운트 갱신하기
if flag[1] <= 0 and H >= down[2] and H[1] < down[2] Then
{
flag[1] = 1;
down_cnt[2] = down_cnt[2] + 1;
Text_SetString(down_text[2],NumToStr(down_cnt[2],0));
}
if flag[1] >= 0 and H >= down[1] and H[1] < down[1] Then
{
flag[1] = -1;
down_cnt[1] = down_cnt[1] + 1;
Text_SetString(down_text[1],NumToStr(down_cnt[1],0));
}
// 선긋기 연장해줌
TL_SetEnd(up_TL[2],NextBarSdate,NextBarStime,up[2]); // 선 긋기 연장해줌
TL_SetEnd(up_TL[1],NextBarSdate,NextBarStime,up[1]); // 선 긋기 연장해줌
TL_SetColor(up_TL[2], Red);
TL_SetColor(up_TL[1], Red);
TL_SetEnd(middle_TL[2],NextBarSdate,NextBarStime,middle[2]); // 선 긋기 연장해줌
TL_SetEnd(middle_TL[1],NextBarSdate,NextBarStime,middle[1]); // 선 긋기 연장해줌
TL_SetColor(middle_TL[2], Black);
TL_SetColor(middle_TL[1], Black);
TL_SetEnd(down_TL[2],NextBarSdate,NextBarStime,down[2]); // 선 긋기 연장해줌
TL_SetEnd(down_TL[1],NextBarSdate,NextBarStime,down[1]); // 선 긋기 연장해줌
TL_SetColor(down_TL[2], Blue);
TL_SetColor(down_TL[1], Blue);
// 텍스트 출력 끝으로 몰아줌
Text_SetLocation(up_text[2],NextBarSdate,NextBarStime,up[2]);
Text_SetLocation(up_text[1],NextBarSdate,NextBarStime,up[1]);
Text_SetLocation(middle_text[2],NextBarSdate,NextBarStime,middle[2]);
Text_SetLocation(middle_text[1],NextBarSdate,NextBarStime,middle[1]);
Text_SetLocation(down_text[2],NextBarSdate,NextBarStime,down[2]);
Text_SetLocation(down_text[1],NextBarSdate,NextBarStime,down[1]);
}
}
var : t(0);
if (sdate != sdate[1] and stime >= ntime) or
(sdate == sdate[1] and stime >= ntime and stime[1] < ntime) Then
{
T = 0;
}
if Tcond == true Then
{
if T == 0 Then
{
if up_cnt[1] >= 6 or up_cnt[2] >= 6 Then
T = 1;
if up_cnt[1] >= 6 or up_cnt[2] >= 6 Then
T = 2;
if up_cnt[1] >= 6 or up_cnt[2] >= 6 Then
T = 3;
}
if T == 1 Then
{
if MarketPosition <= 0 and CrossUp(C,up[2]) Then
Buy("b1");
if MarketPosition >= 0 and CrossDown(C,up[1]) Then
Sell("s1");
if MarketPosition == 1 Then
ExitLong("Bp1",AtLimit,up[2]+(up[2]-up[1])*3);
if MarketPosition == -1 Then
ExitLong("sp1",AtLimit,up[1]-(up[2]-up[1])*3);
}
if T == 2 Then
{
if MarketPosition <= 0 and CrossUp(C,middle[2]) Then
Buy("b2");
if MarketPosition >= 0 and CrossDown(C,middle[1]) Then
Sell("s2");
if MarketPosition == 1 Then
ExitLong("Bp2",AtLimit,middle[2]+(middle[2]-middle[1])*3);
if MarketPosition == -1 Then
ExitLong("sp2",AtLimit,middle[1]-(middle[2]-middle[1])*3);
}
if T == 3 Then
{
if MarketPosition <= 0 and CrossUp(C,down[2]) Then
Buy("b3");
if MarketPosition >= 0 and CrossDown(C,down[1]) Then
Sell("s3");
if MarketPosition == 1 Then
ExitLong("Bp3",AtLimit,down[2]+(down[2]-down[1])*3);
if MarketPosition == -1 Then
ExitLong("sp3",AtLimit,down[1]-(down[2]-down[1])*3);
}
}
즐거운 하루되세요
> 예스쟁이 님이 쓴 글입니다.
> 제목 : 여러개 중에 먼저 조건이 달성하는 것만 진입하는 수식을 작성하고 싶습니다.
> 항상 도움에 감사드립니다.
아래의 코드를 실행하면
첫번째 이미지와 같은 지표가 그려지는데요.
------------------------------------------
input : ntime(140800), xtime(150600);
input : line_num(5), tick_size(12);
var : Tcond(False), oo(0), k(0), j(0);
array : flag[3](0);
array : up[2](0), middle[2](0), down[2](0);
array : up_TL[2](0), middle_TL[2](0), down_TL[2](0);
array : up_cnt[2](0), middle_cnt[2](0), down_cnt[2](0);
array : up_text[2](0), middle_text[2](0), down_text[2](0);
if (sdate != sdate[1] and stime >= xtime) or
(sdate == sdate[1] and stime >= xtime and stime[1] < xtime) Then
Tcond = False;
if (sdate != sdate[1] and stime >= ntime) or
(sdate == sdate[1] and stime >= ntime and stime[1] < ntime) Then
{
// 변수들 초기화 해주기
Tcond = true;
oo = o;
For k=1 to 3
{
flag[k] = 0;
}
For j=1 to 2
{
up[k] = 0;
middle[k] = 0;
down[k] = 0;
up_cnt[k] = 0;
middle_cnt[k] = 0;
down_cnt[k] = 0;
}
up[2] = oo + PriceScale*30;
up[1] = oo + PriceScale*20;
middle[2] = oo + PriceScale*10;
middle[1] = oo + PriceScale;
down[2] = oo - PriceScale*10;
down[1] = oo - PriceScale*20;
// 선그리기
up_TL[2] = TL_New(sDate,sTime,up[2],NextBarSdate,NextBarStime,up[2]); // 선긋기
up_TL[1] = TL_New(sDate,sTime,up[1],NextBarSdate,NextBarStime,up[1]); // 선긋기
middle_TL[2] = TL_New(sDate,sTime,middle[2],NextBarSdate,NextBarStime,middle[2]); // 선긋기
middle_TL[1] = TL_New(sDate,sTime,middle[1],NextBarSdate,NextBarStime,middle[1]); // 선긋기
down_TL[2] = TL_New(sDate,sTime,down[2],NextBarSdate,NextBarStime,down[2]); // 선긋기
down_TL[1] = TL_New(sDate,sTime,down[1],NextBarSdate,NextBarStime,down[1]); // 선긋기
// 조건문으로 터치 카운트 하기
// up
if H >= up[2] Then
{
flag[3] = 1;
up_cnt[2] = up_cnt[2] + 1;
}
if L <= up[1] Then
{
flag[3] = -1;
up_cnt[1] = up_cnt[1] + 1;
}
// middle
if H >= middle[2] Then
{
flag[2] = 1;
middle_cnt[2] = middle_cnt[2] + 1;
}
if L <= middle[1] Then
{
flag[2] = -1;
middle_cnt[1] = middle_cnt[1] + 1;
}
// down
if H >= down[2] Then
{
flag[1] = 1;
down_cnt[2] = down_cnt[2] + 1;
}
if L <= down[1] Then
{
flag[1] = -1;
down_cnt[1] = down_cnt[1] + 1;
}
// 터치 횟수 출력
up_text[2] = Text_New(NextBarSdate,NextBarStime,up[2],NumToStr(up_cnt[2],0));
up_text[1] = Text_New(NextBarSdate,NextBarStime,up[1],NumToStr(up_cnt[1],0));
middle_text[2] = Text_New(NextBarSdate,NextBarStime,middle[2],NumToStr(middle_cnt[2],0));
middle_text[1] = Text_New(NextBarSdate,NextBarStime,middle[1],NumToStr(middle_cnt[1],0));
down_text[2] = Text_New(NextBarSdate,NextBarStime,down[2],NumToStr(down_cnt[2],0));
down_text[1] = Text_New(NextBarSdate,NextBarStime,down[1],NumToStr(down_cnt[1],0));
}
Else
{
if Tcond == true Then
{
// up쪽 카운트 갱신하기
if flag[3] <= 0 and H >= up[2] and H[1] < up[2] Then
{
flag[3] = 1;
up_cnt[2] = up_cnt[2] + 1;
Text_SetString(up_text[2],NumToStr(up_cnt[2],0));
}
if flag[3] >= 0 and H >= up[1] and H[1] < up[1] Then
{
flag[3] = -1;
up_cnt[1] = up_cnt[1] + 1;
Text_SetString(up_text[1],NumToStr(up_cnt[1],0));
}
// middle쪽 카운트 갱신하기
if flag[2] <= 0 and H >= middle[2] and H[1] < middle[2] Then
{
flag[2] = 1;
middle_cnt[2] = middle_cnt[2] + 1;
Text_SetString(middle_text[2],NumToStr(middle_cnt[2],0));
}
if flag[2] >= 0 and H >= middle[1] and H[1] < middle[1] Then
{
flag[2] = -1;
middle_cnt[1] = middle_cnt[1] + 1;
Text_SetString(middle_text[1],NumToStr(middle_cnt[1],0));
}
// down쪽 카운트 갱신하기
if flag[1] <= 0 and H >= down[2] and H[1] < down[2] Then
{
flag[1] = 1;
down_cnt[2] = down_cnt[2] + 1;
Text_SetString(down_text[2],NumToStr(down_cnt[2],0));
}
if flag[1] >= 0 and H >= down[1] and H[1] < down[1] Then
{
flag[1] = -1;
down_cnt[1] = down_cnt[1] + 1;
Text_SetString(down_text[1],NumToStr(down_cnt[1],0));
}
// 선긋기 연장해줌
TL_SetEnd(up_TL[2],NextBarSdate,NextBarStime,up[2]); // 선 긋기 연장해줌
TL_SetEnd(up_TL[1],NextBarSdate,NextBarStime,up[1]); // 선 긋기 연장해줌
TL_SetColor(up_TL[2], Red);
TL_SetColor(up_TL[1], Red);
TL_SetEnd(middle_TL[2],NextBarSdate,NextBarStime,middle[2]); // 선 긋기 연장해줌
TL_SetEnd(middle_TL[1],NextBarSdate,NextBarStime,middle[1]); // 선 긋기 연장해줌
TL_SetColor(middle_TL[2], Black);
TL_SetColor(middle_TL[1], Black);
TL_SetEnd(down_TL[2],NextBarSdate,NextBarStime,down[2]); // 선 긋기 연장해줌
TL_SetEnd(down_TL[1],NextBarSdate,NextBarStime,down[1]); // 선 긋기 연장해줌
TL_SetColor(down_TL[2], Blue);
TL_SetColor(down_TL[1], Blue);
// 텍스트 출력 끝으로 몰아줌
Text_SetLocation(up_text[2],NextBarSdate,NextBarStime,up[2]);
Text_SetLocation(up_text[1],NextBarSdate,NextBarStime,up[1]);
Text_SetLocation(middle_text[2],NextBarSdate,NextBarStime,middle[2]);
Text_SetLocation(middle_text[1],NextBarSdate,NextBarStime,middle[1]);
Text_SetLocation(down_text[2],NextBarSdate,NextBarStime,down[2]);
Text_SetLocation(down_text[1],NextBarSdate,NextBarStime,down[1]);
}
}
--------------------------------------------------------------------------------
빨간색 박스권 그룹
검은색 박스권 그룹
파란색 박스권 그룹
이렇게 세개의 박스권 그룹이 있어서
가격이 각각의 박스권 사이를 몇 번 터치하는지
출력이 되게 만들었습니다.
이미지를 보면
검은색 박스권 사이에서의 터치가 6번 먼저 도달했는데요.
이럴경우
검은색선의 상단을 돌파시 매수 진입하고,
검은색선의 하단을 이탈하면 매도 진입하는 매매식을 만들고 싶습니다.
검은색선 하단쪽에서 먼저 매도를 진입한다면 손절은 상단 가격이고
검은색선 상단쪽에서 먼저 매수를 진입한다면 손절은 하단 가격으로 만들고,
익절은 상단과 하단 폭 x 3배 입니다.
그리고 빨간색 박스권 그룹, 파란색 박스권 그룹에서는 진입 기능이 정지가 되어야 합니다.
(이후에 빨간색 박스권 터치가 6번이 되어도 진입 안됨)
마찬가지로, 빨간색선 박스권 그룹에서 먼저 6번 터치가 발생한다면
빨간색선의 상단을 돌파시 매수 진입하고,
빨간색선의 하단을 이탈하면 매도 진입합니다.
빨간색선 하단쪽에서 먼저 매도를 진입한다면 손절은 상단 가격이고
빨간색선 상단쪽에서 먼저 매수를 진입한다면 손절은 하단 가격으로 만들고,
익절은 상단과 하단 폭 x 3배 입니다.
그리고 검은색 박스권 그룹, 파란색 박스권 그룹에서는 진입 기능이 정지가 되어야 합니다.
(이후에 검은색 박스권 터치가 6번이 되어도 진입 안됨)
마찬가지로, 파란색선 박스권 그룹에서 먼저 6번 터치가 발생한다면
위와 같은 조건으로 매매가 되도록 하고 싶습니다.
수식 부탁드립니다.