커뮤니티

예스랭귀지 Q&A

글쓰기
답변완료

시간기준 손절 관련

안녕하세요. 아래 수식에서 첫번째 줄은 달러 기준 손절로 정상적으로 손절이 되는데 두번째 시간 기준 손절의 경우, 일정 봉 이후, 손실이 있을 경우에만 청산을 하고자 하며, 이익이 있을 경우, 손절을 하지 않고자 하는데 아래처럼 수식을 작성하면 손실 여부와 상관없이 청산이 되는 것 같습니다. 의도하는 바처럼 손실 중인 경우에만, 시간 기준 손절로 작동하게 하려면 수식을 어떻게 바꾸어야 할까요? //달러기준 손절 If SL1 > 0 Then setstoploss((SL1/BigPointValue),PointStop); //시간기준 손절 input: FF(0); if FF > 0 and BarsSinceEntry > FF and SL1 > 0 Then { ExitLong("",Atmarket); ExitShort("",Atmarket); }
프로필 이미지
강우
2025-08-10
132
글번호 193119
시스템
답변완료

부틱드립니다

수고하십니다 트레이딩 뷰 수식입니다. 예스로적용가능하도록 부탁 드립니다. //@version=3 study(title = "Open Close Cross Strategy R5.1 revised by JustUncleL", shorttitle = "OCC Strategy R5.1", overlay = true) // === INPUTS === useRes = input(defval = true, title = "Use Alternate Resolution?") intRes = input(defval = 3, title = "Multiplier for Alernate Resolution") stratRes = ismonthly? tostring(interval*intRes,"###M") : isweekly? tostring(interval*intRes,"###W") : isdaily? tostring(interval*intRes,"###D") : isintraday ? tostring(interval*intRes,"####") : '60' basisType = input(defval = "SMMA", title = "MA Type: ", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"]) basisLen = input(defval = 8, title = "MA Period", minval = 1) offsetSigma = input(defval = 6, title = "Offset for LSMA / Sigma for ALMA", minval = 0) offsetALMA = input(defval = 0.85, title = "Offset for ALMA", minval = 0, step = 0.01) scolor = input(false, title="Show coloured Bars to indicate Trend?") delayOffset = input(defval = 0, title = "Delay Open/Close MA (Forces Non-Repainting)", minval = 0, step = 1) tradeType = input("BOTH", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"]) // === /INPUTS === // Constants colours that include fully non-transparent option. green100 = #008000FF lime100 = #00FF00FF red100 = #FF0000FF blue100 = #0000FFFF aqua100 = #00FFFFFF darkred100 = #8B0000FF gray100 = #808080FF // === BASE FUNCTIONS === // Returns MA input SEECTion variant, default to SMA if blank or typo. variant(type, src, len, offSig, offALMA) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v3 = 2 * v2 - ema(v2, len) // Double Exponential v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len) // Triple Exponential v5 = wma(src, len) // Weighted v6 = vwma(src, len) // Volume Weighted v7 = 0.0 v7 := na(v7[1]) ? sma(src, len) : (v7[1] * (len - 1) + src) / len // Smoothed v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) // Hull v9 = linreg(src, len, offSig) // Least Squares v10 = alma(src, len, offALMA, offSig) // Arnaud Legoux v11 = sma(v1,len) // Triangular (extreme smooth) // SuperSmoother filter // &#169; 2013 John F. Ehlers a1 = exp(-1.414*3.14159 / len) b1 = 2*a1*cos(1.414*3.14159 / len) c2 = b1 c3 = (-a1)*a1 c1 = 1 - c2 - c3 v12 = 0.0 v12 := c1*(src + nz(src[1])) / 2 + c2*nz(v12[1]) + c3*nz(v12[2]) type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 : type=="SMMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : type=="ALMA"?v10 : type=="TMA"?v11: type=="SSMA"?v12: v1 // security wrapper for repeat calls reso(exp, use, res) => use ? security(tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on) : exp // === /BASE FUNCTIONS === // === SERIES SETUP === closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA) openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA) // === /SERIES === // === PLOTTING === // Get Alternate resolution Series if SEECTed. closeSeriesAlt = reso(closeSeries, useRes, stratRes) openSeriesAlt = reso(openSeries, useRes, stratRes) // trendColour = (closeSeriesAlt > openSeriesAlt) ? green : red bcolour = (closeSeries > openSeriesAlt) ? lime100 : red100 barcolor(scolor?bcolour:na, title = "Bar Colours") closeP=plot(closeSeriesAlt, title = "Close Series", color = trendColour, linewidth = 2, style = line, transp = 20) openP=plot(openSeriesAlt, title = "Open Series", color = trendColour, linewidth = 2, style = line, transp = 20) fill(closeP,openP,color=trendColour,transp=80) // === /PLOTTING === // // // === ALERT conditions xlong = crossover(closeSeriesAlt, openSeriesAlt) alertcondition(xlong, title="xlong signal", message="xlong Alert") xshort = crossunder(closeSeriesAlt, openSeriesAlt) alertcondition(xshort, title="xshort signal", message="xshort Alert") longCond = xlong // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open alertcondition(longCond, title="Go LONG signal", message="go long") shortCond = xshort // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open alertcondition(shortCond, title="Go SHORT", message="Go Short") // === /ALERT conditions. // === STRATEGY === // stop loss slPoints = input(defval = 0, title = "Initial Stop Loss Points (zero to disable)", minval = 0) tpPoints = input(defval = 0, title = "Initial Target Profit Points (zero for disable)", minval = 0) // Include bar limiting algorithm ebar = input(defval = 10000, title="Number of Bars for Back Testing", minval=0) dummy = input(false, title="- SET to ZERO for Daily or Longer Timeframes" ) // // Calculate how many mars since last bar tdays = (timenow-time)/60000.0 // number of minutes since last bar tdays := ismonthly? tdays/1440.0/5.0/4.3/interval : isweekly? tdays/1440.0/5.0/interval : isdaily? tdays/1440.0/interval : tdays/interval // number of bars since last bar // //set up exit parameters TP = tpPoints>0?tpPoints:na SL = slPoints>0?slPoints:na
프로필 이미지
파생돌이
2025-08-11
195
글번호 193118
지표
답변완료

로직 검토 요청

다음 종목검색 전체 로직입니다. Input : 기간(20), R(2), 기준선(55), 허용갭(0.03); Var : TOP(0), LO(0), DOUBLE(0), BARSSINCE(0), BOX1(False); Var : var1(0), Var2(0); Var : 전일근접(False); // 최고가, 최저가 계산 TOP = Highest(High, 기간); LO = Lowest(Low, 기간); // BOX1 조건: 최근 (기간-2)봉 최고가 < (기간-1)봉 최고가 BOX1 = Highest(High, 기간 - 2) < Highest(High, 기간 - 1); // 최고가 갱신 및 BARSSINCE 계산 If High > TOP[1] Then Begin DOUBLE = High; BARSSINCE = 0; End Else Begin If DOUBLE > 0 Then Begin BARSSINCE = BARSSINCE + 1; If (BARSSINCE = 기간 - R) and BOX1 Then Begin var1 = DOUBLE; Var2 = LO; End; End; End; // 전일 종가가 var1 (다박스박스) 돌파 전 3% 이내에 위치했는지 확인 If var1 > 0 Then Begin If (Close[1] >= var1 * (1 - 허용갭)) and (Close[1] <= var1) Then 전일근접 = True Else 전일근접 = False; End Else 전일근접 = False; // 매수 조건 If (var1 > 0) and (전일근접 = True) Then Begin If CrossUp(Close, var1) Then Begin Find(1); End; End; ========================================================= 위 로직 중에서 다음 로직이 계속 오류가 있다고 하는데... 검토 부탁드립니다. // 전일 종가가 var1 (다박스박스) 돌파 전 3% 이내에 위치했는지 확인 If var1 > 0 Then Begin If (Close[1] >= var1 * (1 - 허용갭)) and (Close[1] <= var1) Then 전일근접 = True Else 전일근접 = False; End Else 전일근접 = False; ==================================================================
프로필 이미지
saeroi
2025-08-10
166
글번호 193117
종목검색
답변완료

예스트레이더 종목검색으로 요청합니다^^*

(조건) 주가상한가 이후 캔들이 조정하여 마이너스(-)5%(상단)에서 마이너스(-)10%(하단)밴드라고 할때 캔들이 마이너스(-)5%상단하고 마이너스(-)10%하단사이를 터치 또는 관통하는 양봉 캔들을 찾고 싶습니다.. 조건은 30분봉 입니다... 부탁드립니다..
프로필 이미지
서민순
2025-08-10
141
글번호 193116
종목검색
답변완료

문의드립니다.

안녕하세요 아래 TS에서 사용하는 함수를 예스에서 적용가능하게 부탁드립니다 . $ATRChander라는 함수입니다 . Inputs: Multi(numeric), period(numeric); Var: loss(0), trail(0); loss = AvgTrueRange(Period) * Multi; Value1 = $ATRChandelier(Multi,period)[1]; if C > Value1 then trail = Close[0] - loss; if C < Value1 then trail = Close[0] + loss; if C > Value1 AND C[1] > Value1 then trail = MaxList(Value1,Close[0] - loss); if C < Value1 AND C[1] < Value1 then trail = MinList(Value1, Close[0] + loss); $ATRChandelier=trail;
프로필 이미지
소드노
2025-08-10
140
글번호 193115
사용자 함수
답변완료

백테스트에서 미국 서머타임 적용하는 좋은 방법 추천해주세요.

미국 CME 선물시장의 주간 개장시간을 기준을 잡고 싶습니다. 그런데 미국은 서머타임 때문에 한국시간 22:30 일 때도 있고, 23:30 일때도 있습니다. 올 해 2025년을 위한 코드에는 2025-03-09 ~ 2025-11-02 사이에 있으면 서머타임을 적용하는 식으로 날짜를 하드코딩하면 되겠습니다만, 과거 백테스트를 위해서는 어떻게 하는게 효율적일까요? 미국 서머타임은 3월 두 번째 일요일 오전 2시, 그리고 11월 첫 일요일 오전 2시에 변한다는 규칙이 있습니다. 이 규칙을 사용하려면 주어진 년도의 3월 2번째 일요일의 날짜와 11월 첫번째 일요일 날짜를 구해야 합니다. 이런 함수가 예스랭귀지에 있나요? 혹시 시간을 그 종목의 현지 시간(예를 들면 미국 뉴옥시간)으로 설정해서 예스트레이더가 작동되게 하는 방법도 있을까요? 감사합니다.
프로필 이미지
알이랑
2025-08-10
139
글번호 193114
시스템
답변완료

예스로 부탁합니다.

트뷰에서 알게된 지표인데 예스 수식으로 부탁합니다. 미리감사드립니다. //version=5 //author: mladen //rebound arrows and TMA angle caution: Ale //rewritten from MQL5 to Pine: Brylator indicator("TMA Centered Bands Indicator", "TMA v1.0 Gaga", overlay = true, max_lines_count = 500, max_labels_count = 500) //INPUTS var GRP1 = "Parameters" HalfLength = input.int(44, "Centered TMA half period", group = GRP1) string PriceType = input.string("Weighted", "Price to use", options = ["Close", "Open", "High", "Low", "Median", "Typical", "Weighted", "Average"], group = GRP1) AtrPeriod = input.int(120, "Average true range period", group = GRP1) AtrMultiplier = input.float(2, "Average true range multiplier", group = GRP1) TMAangle = input.int(4, "Centered TMA angle caution", group = GRP1) // APPEARANCE (&#3648;&#3614;&#3636;&#3656;&#3617;&#3605;&#3633;&#3623;&#3648;&#3621;&#3639;&#3629;&#3585;&#3586;&#3609;&#3634;&#3604;&#3649;&#3621;&#3632;&#3586;&#3657;&#3629;&#3588;&#3623;&#3634;&#3617; BUY/SELL) var GRP4 = "Appearance" arrowSizeOpt = input.string("Large", "Arrow size", options = ["Tiny", "Small", "Normal", "Large", "Huge"], group = GRP4) showBuySellText = input.bool(true, "Show BUY/SELL text on arrows", group = GRP4) buyText = input.string("BUY", "Buy text", inline = "txt", group = GRP4) sellText = input.string("SELL", "Sell text", inline = "txt", group = GRP4) // map &#3586;&#3609;&#3634;&#3604; arrowSize = switch arrowSizeOpt "Tiny" => size.tiny "Small" => size.small "Normal" => size.normal "Large" => size.large => size.huge //VARIABLES float tmac = na float tmau = na float tmad = na var float pastTmac = na //from the previous candle var float pastTmau = na var float pastTmad = na float tmau_temp = na //before looping float tmac_temp = na float tmad_temp = na float point = syminfo.pointvalue //NEEDS MORE TESTS bool last = false //checks if a loop is needed var string alertSignal = "EMPTY" //needed for alarms to avoid repetition //COLORS var GRP2 = "Colors" var color colorBuffer = na color colorDOWN = input.color(color.new(color.red, 0), "Bear", inline = "5", group = GRP2) color colorUP = input.color(color.new(color.green, 0), "Bull", inline = "5", group = GRP2) color colorBands = input.color(color.new(#b2b5be, 0), "Bands", inline = "5", group = GRP2) bool cautionInput = input.bool(true, "Caution label", inline = "6", group = GRP2) //ALERTS var GRP3 = "Alerts (Needs to create alert manually after every change)" bool crossUpInput = input.bool(false, "Crossing up", inline = "7", group = GRP3) bool crossDownInput = input.bool(false, "Crossing down", inline = "7", group = GRP3) bool comingBackInput = input.bool(false, "Coming back", inline = "7", group = GRP3) bool onArrowDownInput = input.bool(false, "On arrow down", inline = "8", group = GRP3) bool onArrowUpInput = input.bool(false, "On arrow up", inline = "8", group = GRP3) //CLEAR LINES a_allLines = line.all if array.size(a_allLines) > 0 for p = 0 to array.size(a_allLines) - 1 line.delete(array.get(a_allLines, p)) //GET PRICE Price(x) => float price = switch PriceType "Close" => close[x] "Open" => open[x] "High" => high[x] "Low" => low[x] "Median" => (high[x] + low[x]) / 2 "Typical" => (high[x] + low[x] + close[x]) / 3 "Weighted" => (high[x] + low[x] + close[x] + close[x]) / 4 "Average" => (high[x] + low[x] + close[x] + open[x])/ 4 price //MAIN for i = HalfLength to 0 //ATR atr = 0.0 for j = 0 to AtrPeriod - 1 atr += math.max(high[i + j + 10], close[i + j + 11]) - math.min(low[i + j + 10], close[i + j + 11]) atr /= AtrPeriod //BANDS sum = (HalfLength + 1) * Price(i) sumw = (HalfLength + 1) k = HalfLength for j = 1 to HalfLength sum += k * Price(i + j) sumw += k if (j <= i) sum += k * Price(i - j) sumw += k k -= 1 tmac := sum/sumw tmau := tmac+AtrMultiplier*atr tmad := tmac-AtrMultiplier*atr //ALERTS if i == 0 //Only on a real candle if (high > tmau and alertSignal != "UP") //crossing up band if crossUpInput == true //checks if activated alert("Crossing up Band") //calling alert alertSignal := "UP" //to avoid repeating else if (low < tmad and alertSignal != "DOWN") //crossing down band if crossDownInput == true alert("Crossing down Band") alertSignal := "DOWN" else if (alertSignal == "DOWN" and high >= tmad and alertSignal != "EMPTY") //back from the down band if comingBackInput == true alert("Coming back") alertSignal := "EMPTY" else if (alertSignal == "UP" and low <= tmau and alertSignal != "EMPTY") //back from the up band if comingBackInput == true alert("Coming back") alertSignal := "EMPTY" //CHANGE TREND COLOR if pastTmac != 0.0 if tmac > pastTmac colorBuffer := colorUP if tmac < pastTmac colorBuffer := colorDOWN //SIGNALS reboundD = 0.0 reboundU = 0.0 caution = 0.0 if pastTmac != 0.0 if (high[i + 1] > pastTmau and close[i + 1] > open[i + 1] and close < open) reboundD := high + AtrMultiplier * atr / 2 if (tmac - pastTmac > TMAangle * point) caution := reboundD + 10 * point if (low[i + 1] < pastTmad and close[i + 1] < open[i + 1] and close > open) reboundU := low - AtrMultiplier * atr / 2 if (pastTmac - tmac > TMAangle * point) caution := reboundU - 10 * point //LAST REAL if barstate.islast and i == HalfLength last := true tmau_temp := tmau tmac_temp := tmac tmad_temp := tmad //DRAW HANDICAPPED BANDS if barstate.islast and i < HalfLength line.new(bar_index - (i + 1), pastTmau, bar_index - (i), tmau, width = 2, style = line.style_dotted, color = colorBands) line.new(bar_index - (i + 1), pastTmac, bar_index - (i), tmac, width = 2, style = line.style_dotted, color = colorBuffer) line.new(bar_index - (i + 1), pastTmad, bar_index - (i), tmad, width = 2, style = line.style_dotted, color = colorBands) //DRAW SIGNALS (&#3621;&#3641;&#3585;&#3624;&#3619;&#3651;&#3627;&#3597;&#3656;&#3586;&#3638;&#3657;&#3609; + &#3617;&#3637;&#3588;&#3635;&#3623;&#3656;&#3634; SELL/BUY) if reboundD != 0 txtDown = showBuySellText ? "▼₩n" + sellText : "▼" label.new(bar_index - (i), reboundD, txtDown, color = na, style = label.style_label_center, textcolor = colorDOWN, size = arrowSize, textalign = text.align_center) if i == 0 and onArrowDownInput == true //alert alert("Down arrow") if caution != 0 and cautionInput == true label.new(bar_index - (i), reboundD, color = colorUP, style = label.style_xcross, size = size.tiny, textcolor = na) if reboundU != 0 txtUp = showBuySellText ? "▲₩n" + buyText : "▲" label.new(bar_index - (i), reboundU, txtUp, color = na, style = label.style_label_center, textcolor = colorUP, size = arrowSize, textalign = text.align_center) if i == 0 and onArrowUpInput == true //alert alert("UP arrow") if caution != 0 and cautionInput == true label.new(bar_index - (i), reboundU, color = colorDOWN, style = label.style_xcross, size = size.tiny, textcolor = na) //SAVE HISTORY pastTmac := tmac pastTmau := tmau pastTmad := tmad //LOOP IS ONLY FOR HANDICAPPED if barstate.islast != true break //DRAW REAL BANDS plot(last ? tmau_temp : tmau, title = "TMA Up", color = colorBands, linewidth=1, style = plot.style_line, offset = -HalfLength) plot(last ? tmac_temp : tmac, title = "TMA Mid", color = colorBuffer, linewidth=1, style = plot.style_line, offset = -HalfLength) plot(last ? tmad_temp : tmad, title = "TMA Down", color = colorBands, linewidth=1, style = plot.style_line, offset = -HalfLength)
프로필 이미지
as8282
2025-08-10
192
글번호 193113
지표
답변완료

종목검색식 부탁드립니다

1. 일봉기준 차트에서, 주봉 20 이평선 (단순) 을 표시하여 (그어서) 일봉 캔들이 양봉으로 주봉 20이평선을 몸통으로 관통(종가로 돌파)하는 종목검색식 부탁드립니다.
프로필 이미지
일지매7
2025-08-10
158
글번호 193112
종목검색
답변완료

분봉상거래대금

수고 많으십니다. 분봉상 1분봉상 거래대금이 1억원 이상 20봉 영봉까지 아예 없었던 종목을 검색하고 싶습니다. input을 사용하여 20(기간)을 조정 가능하게 부탁드립니다. 감사합니다.
프로필 이미지
제시립뭐
2025-08-10
148
글번호 193111
종목검색
답변완료

수식전환

수고많으십니다 아래 타사수식 예스로 전환 부탁드립니다 분봉챠트에서 cnt=countsince (date==date(1)&& date==date(2)&& date!=date(3),C>Dayopen()&& C(1)<Dayopen()); S=countsince(date!=date(1),C<Dayopen()); cnt==1&&cnt(1)==0&&S>1
프로필 이미지
트라이
2025-08-10
151
글번호 193110
종목검색