예스스탁
예스스탁 답변
2025-06-10 20:34:56
안녕하세요
예스스탁입니다.
트레이딩뷰는 추세선을 출력하지만 색상을 지정하지 않다가
이후에 출력하면 그때 보이게 되는데 예스랭귀지는 출력한 추세선을 보이지 않게 색상 지정이 되지 않습니다.
적용하시면 검은색선들이 표시되는데 기본적으로 트레이딩뷰에서는 출력은 하지만
보이지 않는 선이라고 보시면 됩니다.
또한 내용 중 set_zone은 제외했습니다.
input : length(14);
input : area(0);#0:Wick only, 1:Full Bar
input : showTop(true);
input : topCss(Red);
input : topAreaCss(Salmon);
input : showBtm(true);
input : btmCss(Green);
input : btmAreaCss(DarkGreen);
input : labelSize(0);#0:Tiny, 1:Small, 2:Normal;
var : n(0);
var : ph(false),ph_top(0),ph_btm(0),ph_vol(0),ph_count(0),ph_x1(0),ph_crossed(False);
var : pl(false),pl_top(0),pl_btm(0),pl_vol(0),pl_count(0),pl_x1(0),pl_crossed(False);
var : ph_xd(0),ph_xt(0),ph_bx(0),pl_xd(0),pl_xt(0),pl_bx(0);
n = index;
ph = SwingHigh(1,h,length,length,length*2+1) != -1;# ta.pivothigh(length, length)
pl = Swinglow(1,l,length,length,length*2+1) != -1;# ta.pivotlow(length, length)
if ph == true Then
{
ph_count = 0;
ph_vol = 0 ;
}
Else
{
ph_vol = ph_vol + iff(low[length] < ph_top and high[length] > ph_btm , volume[length] , 0);
ph_count = ph_count + iff(low[length] < ph_top and high[length] > ph_btm , 1 , 0);
}
if pl == true Then
{
pl_count = 0;
pl_vol = 0 ;
}
Else
{
pl_vol = pl_vol + iff(low[length] < pl_top and high[length] > pl_btm , volume[length] , 0);
pl_count = pl_count + iff(low[length] < pl_top and high[length] > pl_btm , 1 , 0);
}
if ph and showTop then
{
ph_top = high[length];
ph_btm = iff(area==0,max(close[length], open[length]),low[length]);
ph_xd = sDate[length];
ph_xt = sTime[length];
ph_crossed = false;
Box_Delete(ph_bx);
ph_bx = Box_New(ph_xd,ph_xt,ph_top,ph_xd,ph_xt,ph_btm);
Box_SetColor(ph_bx,topAreaCss);
Box_SetFill(ph_bx,true);
}
else
{
if close > ph_top Then
ph_crossed = true;
if ph_crossed == true Then
Box_Delete(ph_bx);
Else
Box_SetEnd(ph_bx,NextBarSdate,NextBarStime,ph_btm);
}
if pl and showBtm Then
{
pl_top = iff(area == 0, min(close[length], open[length]),high[length]);
pl_btm = low[length];
pl_xd = sdate[length];
pl_xt = sTime[length];
pl_crossed = false;
Box_Delete(pl_bx);
pl_bx = Box_New(pl_xd,pl_xt,pl_top,sDate,sTime,pl_btm);
Box_SetColor(pl_bx,btmAreaCss);
Box_SetFill(pl_bx,true);
}
else
{
if close < pl_btm Then
pl_crossed = true;
if pl_crossed == true Then
Box_SetEnd(pl_bx,pl_xd,pl_xt,pl_btm);
Else
Box_SetEnd(pl_bx,NextBarSdate,NextBarStime,pl_btm);
}
var : ph_tx(0),pl_tx(0);
var : ph_ln(0),pl_ln(0);
if CrossUp(ph_count,0) Then
{
ph_tx = Text_New(ph_xd,ph_xt,ph_top,NToStr(ph_vol,0));
Text_SetStyle(ph_tx,2,1);
Text_SetColor(ph_tx,Red);
}
if ph_count > 0 Then
Text_SetString(ph_tx,NToStr(ph_vol,0));
if ph == true Then
{
var1 = ph_top;
if ph_crossed[1] == False Then
TL_SetEnd(ph_ln,ph_xd,ph_xt,var1[1]);
ph_ln = TL_new(ph_xd,ph_xt,var1,ph_xd,ph_xt,var1);
}
Else
{
if ph_crossed[1] == False Then
{
TL_SetEnd(ph_ln,sDate,sTime,var1);
}
if ph_crossed and ph_crossed[1] == False Then
{
TL_SetEnd(ph_ln,sDate,sTime,var1);
TL_SetStyle(ph_ln,3);
}
if ph_count > 0 Then
TL_SetColor(ph_ln, topAreaCss);
}
if CrossUp(pl_count,0) Then
{
pl_tx = Text_New(pl_xd,pl_xt,pl_btm,NToStr(pl_vol,0));
Text_SetStyle(pl_tx,2,0);
Text_SetColor(pl_tx,Green);
}
if pl_count > 0 Then
Text_SetString(pl_tx,NToStr(pl_vol,0));
if pl == true Then
{
var2 = pl_btm;
if pl_crossed[1] == False Then
TL_SetEnd(pl_ln,pl_xd,pl_xt,var2[1]);
pl_ln = TL_new(pl_xd,pl_xt,var2,pl_xd,pl_xt,var2);
}
Else
{
if pl_crossed[1] == False Then
{
TL_SetEnd(pl_ln,sDate,sTime,var2);
}
if pl_crossed and pl_crossed[1] == False Then
{
TL_SetEnd(pl_ln,sDate,sTime,var2);
TL_SetStyle(pl_ln,3);
}
if pl_count > 0 Then
TL_SetColor(pl_ln, btmAreaCss);
}
즐거운 하루되세요
> 주식남 님이 쓴 글입니다.
> 제목 : 변환 부탁드립니다.
> 안녕하세요?
아래 트뷰 지표를 나름 변경해 보았습니다. 예스랭귀지에서 에러는 발생하지 않는데, 화면에 아무것도 안나오네요. 제가 만든 스크립트 무시하더라도 최대한 트뷰와 비슷하게 수정부탁드립니다.
== 변경 ==
Input: left(14), right(14), areaOpt(0);
Input: showTop(True), showBtm(True);
Var: ph(false), pl(false);
Var: ph_top(0), ph_btm(0), ph_vol(0);
Var: pl_top(0), pl_btm(0), pl_vol(0);
Var: i(0);
Var: ph_boxID(0), pl_boxID(0), ph_tlID(0), pl_tlID(0), ph_txtID(0), pl_txtID(0);
ph = swinghigh(1, High, left, right, 0) != -1;
pl = swinglow(1, Low, left, right, 0) != -1;
If ph == True and showTop == True then {
ph_top = High[right];
If areaOpt == 0 then
ph_btm = Max(Close[right], Open[right]);
else
ph_btm = Low[right];
// 거래량 누적(박스범위 내)
ph_vol = 0;
For i = right To left + right - 1 {
If (Low[i] < ph_top and High[i] > ph_btm) then
ph_vol = ph_vol + Volume[i];
}
// 기존 오브젝트 삭제
If ph_boxID != 0 then Box_Delete(ph_boxID);
If ph_tlID != 0 then TL_Delete(ph_tlID);
If ph_txtID != 0 then Text_Delete(ph_txtID);
ph_boxID = Box_New(
sDate[left + right - 1], sTime[left + right - 1], ph_top,
sDate[right], sTime[right], ph_btm
);
Box_SetColor(ph_boxID, rgb(246,79,8));
Box_SetFill(ph_boxID, True, 120, True);
// 수평선(피벗 구간 전체)
ph_tlID = TL_New(sDate[left + right - 1], sTime[left + right - 1], ph_top, sDate[right], sTime[right], ph_top);
TL_SetColor(ph_tlID, rgb(246,79,8));
TL_SetSize(ph_tlID, 2);
// 거래량 라벨(박스 좌상단에 표시)
ph_txtID = Text_New(sDate[left + right - 1], sTime[left + right - 1], ph_top, "V:" + NumToStr(ph_vol, 0));
Text_SetStyle(ph_txtID, 1, rgb(246,79,8));
}
If pl == True and showBtm == True then {
pl_top = Iff(areaOpt == 0, Min(Close[right], Open[right]), High[right]);
pl_btm = Low[right];
pl_vol = 0;
For i = right To left + right - 1 {
If (Low[i] < pl_top and High[i] > pl_btm) then
pl_vol = pl_vol + Volume[i];
}
If pl_boxID != 0 then Box_Delete(pl_boxID);
If pl_tlID != 0 then TL_Delete(pl_tlID);
If pl_txtID != 0 then Text_Delete(pl_txtID);
pl_boxID = Box_New(
sDate[left + right - 1], sTime[left + right - 1], pl_top,
sDate[right], sTime[right], pl_btm
);
Box_SetColor(pl_boxID, rgb(10,139,109));
Box_SetFill(pl_boxID, True, 120, True);
pl_tlID = TL_New(sDate[left + right - 1], sTime[left + right - 1], pl_btm, sDate[right], sTime[right], pl_btm);
TL_SetColor(pl_tlID, rgb(10,139,109));
TL_SetSize(pl_tlID, 2);
pl_txtID = Text_New(sDate[left + right - 1], sTime[left + right - 1], pl_btm, "V:" + NumToStr(pl_vol, 0));
Text_SetStyle(pl_txtID, 1, rgb(10,139,109));
}
== 트뷰 ==
//@version=5
indicator("예시"
, overlay = true
, max_lines_count = 500
, max_labels_count = 500
, max_boxes_count = 500)
//------------------------------------------------------------------------------
//Settings
//-----------------------------------------------------------------------------{
length = input(14, 'Period')
area = input.string('Wick only', 'Swing Range', options = ['Wick only', 'Full Bar'])
//Style
showTop = input(true, '저항', inline = 'top', group = 'Style')
topCss = input(#f64f08, '' , inline = 'top', group = 'Style')
topAreaCss = input(#ff52525c, 'Area', inline = 'top', group = 'Style')
showBtm = input(true, '지지', inline = 'btm', group = 'Style')
btmCss = input(#0a8b6d, '' , inline = 'btm', group = 'Style')
btmAreaCss = input(#00897b53, 'Area', inline = 'btm', group = 'Style')
labelSize = input.string('Tiny', 'Labels Size', options = ['Tiny', 'Small', 'Normal'], group = 'Style')
//-----------------------------------------------------------------------------}
//Functions
//-----------------------------------------------------------------------------{
n = bar_index
get_counts(condition, top, btm)=>
var count = 0
var vol = 0.
if condition
count := 0
vol := 0.
else
vol += low[length] < top and high[length] > btm ? volume[length] : 0
count += low[length] < top and high[length] > btm ? 1 : 0
[count, vol]
set_label(count, vol, x, y, css, lbl_style)=>
var label lbl = na
var label_size = switch labelSize
'Tiny' => size.tiny
'Small' => size.small
'Normal' => size.normal
target = count
if ta.crossover(target, 0)
lbl := label.new(x, y, str.tostring(vol, format.volume)
, style = lbl_style
, size = label_size
, color = #00000000
, textcolor = css)
if target > 0
label.set_text(lbl, str.tostring(vol, format.volume))
set_level(condition, crossed, value, count, vol, css)=>
var line lvl = na
target = count
if condition
if target[1] < 0[1]
line.delete(lvl[1])
else if not crossed[1]
line.set_x2(lvl, n - length)
lvl := line.new(n - length, value, n, value
, color = na)
if not crossed[1]
line.set_x2(lvl, n+3)
if crossed and not crossed[1]
line.set_x2(lvl, n)
line.set_style(lvl, line.style_dashed)
if target > 0
line.set_color(lvl, css)
set_zone(condition, x, top, btm, count, vol, css)=>
var box bx = na
target = count
if ta.crossover(target, 0)
bx := box.new(x, top, x + count, btm
, border_color = na
, bgcolor = css)
if target > 0
box.set_right(bx, x + count)
//-----------------------------------------------------------------------------}
//Global variables
//-----------------------------------------------------------------------------{
//Pivot high
var float ph_top = na
var float ph_btm = na
var bool ph_crossed = na
var ph_x1 = 0
var box ph_bx = box.new(na,na,na,na
, bgcolor = color.new(topAreaCss, 80)
, border_color = na)
//Pivot low
var float pl_top = na
var float pl_btm = na
var bool pl_crossed = na
var pl_x1 = 0
var box pl_bx = box.new(na,na,na,na
, bgcolor = color.new(btmAreaCss, 80)
, border_color = na)
//-----------------------------------------------------------------------------}
//Display pivot high levels/blocks
//-----------------------------------------------------------------------------{
ph = ta.pivothigh(length, length)
//Get ph counts
[ph_count, ph_vol] = get_counts(ph, ph_top, ph_btm)
//Set ph area and level
if ph and showTop
ph_top := high[length]
ph_btm := switch area
'Wick only' => math.max(close[length], open[length])
'Full Bar' => low[length]
ph_x1 := n - length
ph_crossed := false
box.set_lefttop(ph_bx, ph_x1, ph_top)
box.set_rightbottom(ph_bx, ph_x1, ph_btm)
else
ph_crossed := close > ph_top ? true : ph_crossed
if ph_crossed
box.set_right(ph_bx, ph_x1)
else
box.set_right(ph_bx, n+3)
if showTop
//Set ph zone
set_zone(ph, ph_x1, ph_top, ph_btm, ph_count, ph_vol, topAreaCss)
//Set ph level
set_level(ph, ph_crossed, ph_top, ph_count, ph_vol, topCss)
//Set ph label
set_label(ph_count, ph_vol, ph_x1, ph_top, topCss, label.style_label_down)
//-----------------------------------------------------------------------------}
//Display pivot low levels/blocks
//-----------------------------------------------------------------------------{
pl = ta.pivotlow(length, length)
//Get pl counts
[pl_count, pl_vol] = get_counts(pl, pl_top, pl_btm)
//Set pl area and level
if pl and showBtm
pl_top := switch area
'Wick only' => math.min(close[length], open[length])
'Full Bar' => high[length]
pl_btm := low[length]
pl_x1 := n - length
pl_crossed := false
box.set_lefttop(pl_bx, pl_x1, pl_top)
box.set_rightbottom(pl_bx, pl_x1, pl_btm)
else
pl_crossed := close < pl_btm ? true : pl_crossed
if pl_crossed
box.set_right(pl_bx, pl_x1)
else
box.set_right(pl_bx, n+3)
if showBtm
//Set pl zone
set_zone(pl, pl_x1, pl_top, pl_btm, pl_count, pl_vol, btmAreaCss)
//Set pl level
set_level(pl, pl_crossed, pl_btm, pl_count, pl_vol, btmCss)
//Set pl labels
set_label(pl_count, pl_vol, pl_x1, pl_btm, btmCss, label.style_label_up)
//-----------------------------------------------------------------------------}