커뮤니티

트뷰에서 사용중인 로직 변환 요청드려봅니다.

프로필 이미지
또미빠덜
2025-02-19 11:16:33
480
글번호 188315
답변완료
트뷰에서 활용하고 있는 전략으로 손매매를 하고 있는데 이걸 자동으로 구현했고 혹시나 해당 플랫폼에서 사용할 수 있다면 자동매매로 전환하고 싶어서 문의드립니다. 트레이딩뷰 전략을 끌어와서 자동매매를 시작해보려고 합니다. 변환 부탁드립니다. //@version=4 strategy(shorttitle = "SQZMOM_LB", title="Squeeze Momentum Indicator [LazyBear]", overlay=true) length = input(20, title="BB Length") mult = input(2.0, title="BB MultFactor") lengthKC = input(20, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool) trailTrigger = input(50, title="트레일링 스탑 활성화 포인트") // 50포 상승 이후 트레일링 스탑 활성화 trailPercent = input(50, title="트레일링 되돌림 비율 (%)") / 100 // 50% 되돌림 시 익절 stopLossPercent = input(0.8, title="손절 비율 (%)") / 100 // 손절 비율 설정 // Calculate BB source = close basis = sma(source, length) dev = multKC * stdev(source, length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(source, lengthKC) range = useTrueRange ? tr : (high - low) rangema = sma(range, lengthKC) upperKC = ma + rangema * multKC lowerKC = ma - rangema * multKC sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC) sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC) noSqz = (sqzOn == false) and (sqzOff == false) val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)), sma(close, lengthKC)), lengthKC, 0) bcolor = val > 0 ? (val > nz(val[1]) ? color.green : color.green) : (val < nz(val[1]) ? color.red : color.red) scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray plot(val, color=bcolor, linewidth=2) plot(0, color=scolor, style=plot.style_cross, linewidth=2) startHour = 15 startMinute = 0 startTimestamp = timestamp("GMT+9", year, month, dayofmonth, startHour, startMinute) isAfterStartTime = (time >= startTimestamp) // 거래량 조건 추가: 최근 20기간의 평균 거래량 volumeAvg = sma(volume, 20) volumeMultiplier = input(1.3, title="Volume Multiplier for Entry") // 거래량이 평균보다 몇 배 이상일 때 진입할지 설정 longCondition = (bcolor == color.green) and (bcolor[1] != color.green) and isAfterStartTime and (volume > volumeAvg * volumeMultiplier) // 숏 포지션을 더 엄격하게 진입: 강한 하락 신호 추가 (50일 이동평균선 아래에서만) strongDownSignal = (bcolor == color.red) and (bcolor[1] != color.red) and (close < sma(close, 50)) // 50일 이동평균선 아래에서 하락 shortCondition = strongDownSignal and isAfterStartTime and (volume > volumeAvg * volumeMultiplier) var float maxProfitLong = na var float maxProfitShort = na if (longCondition) strategy.entry("Long", strategy.long) maxProfitLong := close // 롱 포지션 진입 시 초기화 if (shortCondition) strategy.entry("Short", strategy.short) maxProfitShort := close // 숏 포지션 진입 시 초기화 // 롱 포지션 트레일링 스탑 로직 if (strategy.position_size > 0) maxProfitLong := max(maxProfitLong, close) // 최고 수익 갱신 trailStopLong = maxProfitLong - (maxProfitLong - strategy.position_avg_price) * trailPercent // 50% 되돌림 계산 stopLossLong = strategy.position_avg_price - (strategy.position_avg_price * stopLossPercent) // 손절 가격 계산 if (close <= trailStopLong and (maxProfitLong - strategy.position_avg_price) >= trailTrigger) strategy.close("Long") if (close <= stopLossLong) strategy.close("Long") // 손절 // 숏 포지션 트레일링 스탑 로직 if (strategy.position_size < 0) maxProfitShort := min(maxProfitShort, close) // 최저 수익 갱신 trailStopShort = maxProfitShort + (strategy.position_avg_price - maxProfitShort) * trailPercent // 50% 되돌림 계산 stopLossShort = strategy.position_avg_price + (strategy.position_avg_price * stopLossPercent) // 손절 가격 계산 if (close >= trailStopShort and (strategy.position_avg_price - maxProfitShort) >= trailTrigger) strategy.close("Short") if (close >= stopLossShort) strategy.close("Short") // 손절 // 기본적인 색상 변화에 따른 청산 로직 strategy.close("Long", when=bcolor == color.red) strategy.close("Short", when=bcolor == color.green)
사용자 함수
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-02-19 14:58:42

안녕하세요 예스스탁입니다. 1 지표 input : length(20); input : mult(2.0); input : lengthKC(20); input : multKC(1.5); input : useTrueRange(true); input : trailTrigger(50); // 50포 상승 이후 트레일링 스탑 활성화 input : trailPercent(50); #/ 100 // 50% 되돌림 시 익절 input : stopLossPercent(0.8); #/ 100 // 손절 비율 설정 var : source(0),basis(0),dev(0),upperBB(0),lowerBB(0); var : mav(0),Range(0),rangema(0),upperKC(0),lowerKC(0); var : sqzOn(False),sqzOff(False),noSqz(False),val(0); var : bcolor(0),scolor(0); source = close; basis = ma(source, length); dev = multKC * std(source, length); upperBB = basis + dev; lowerBB = basis - dev; mav = ma(source, lengthKC); range = iff(useTrueRange, TrueRange , (high - low)); rangema = ma(range, lengthKC); upperKC = mav + rangema * multKC; lowerKC = mav - rangema * multKC; sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC); sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC); noSqz = (sqzOn == false) and (sqzOff == false); val = LRL(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)), ma(close, lengthKC)), lengthKC); bcolor = iff(val > 0 , IFf((val > iff(IsNaN(val[1]) == true,0,val[1])), green , green) , IFf((val < iff(IsNaN(val[1]) == true,0,val[1])), red , red)); scolor = iff(noSqz ,blue , iff(sqzOn , black , gray)); plot1(val,"val", bcolor); PlotBaseLine1(0,"0",scolor); 2 시스템 input : length(20); input : mult(2.0); input : lengthKC(20); input : multKC(1.5); input : useTrueRange(true); input : trailTrigger(50);#50포 상승 이후 트레일링 스탑 활성화 input : trailPercent(50);#50% 되돌림 시 익절 input : stopLossPercent(0.8); #손절 비율 설정 var : source(0),basis(0),dev(0),upperBB(0),lowerBB(0); var : mav(0),Range(0),rangema(0),upperKC(0),lowerKC(0); var : sqzOn(False),sqzOff(False),noSqz(False),val(0); var : bcolor(0),scolor(0); source = close; basis = ma(source, length); dev = multKC * std(source, length); upperBB = basis + dev; lowerBB = basis - dev; mav = ma(source, lengthKC); range = iff(useTrueRange, TrueRange , (high - low)); rangema = ma(range, lengthKC); upperKC = mav + rangema * multKC; lowerKC = mav - rangema * multKC; sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC); sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC); noSqz = (sqzOn == false) and (sqzOff == false); val = LRL(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)), ma(close, lengthKC)), lengthKC); bcolor = iff(val > 0 , IFf((val > iff(IsNaN(val[1]) == true,0,val[1])), green , green) , IFf((val < iff(IsNaN(val[1]) == true,0,val[1])), red , red)); scolor = iff(noSqz ,blue , iff(sqzOn , black , gray)); input : volumeMultiplier(1.3); var : volumeAvg(0),longCondition(False),strongDownSignal(False),shortCondition(False); var : maxProfitLong(0),maxProfitShort(0); var : trailStopLong(0),stopLossLong(0); var : trailStopShort(0),stopLossShort(0); volumeAvg = ma(volume, 20); longCondition = (bcolor == green) and (bcolor[1] != green) and (volume > volumeAvg * volumeMultiplier); strongDownSignal = (bcolor == red) and (bcolor[1] != red) and (close < ma(close, 50)); shortCondition = strongDownSignal and (volume > volumeAvg * volumeMultiplier); if (longCondition) Then { Buy("long"); maxProfitLong = close; } if (shortCondition) Then { Sell("short"); maxProfitShort = close; } // 롱 포지션 트레일링 스탑 로직 if (MarketPosition == 1 ) Then { maxProfitLong = max(maxProfitLong, close); // 최고 수익 갱신 trailStopLong = maxProfitLong - (maxProfitLong - EntryPrice) * (trailPercent/100); // 50% 되돌림 계산 stopLossLong = EntryPrice - (1-stopLossPercent/100); // 손절 가격 계산 if (close <= trailStopLong and (maxProfitLong - EntryPrice) >= trailTrigger) Then ExitLong("Lx1"); if (close <= stopLossLong) Then ExitLong("Lx2") ; if bcolor == red Then ExitLong("Lx3"); } // 숏 포지션 트레일링 스탑 로직 if (MarketPosition == -1) Then { maxProfitShort = min(maxProfitShort, close); // 최저 수익 갱신 trailStopShort = maxProfitShort + (EntryPrice - maxProfitShort) * (trailPercent/100); // 50% 되돌림 계산 stopLossShort = EntryPrice + (1+stopLossPercent/100); // 손절 가격 계산 if (close >= trailStopShort and (EntryPrice - maxProfitShort) >= trailTrigger) Then ExitShort("Sx1"); if (close >= stopLossShort) Then ExitShort("Sx2"); if bcolor == green Then ExitShort("Sx3"); } 즐거운 하루되세요 > 또미빠덜 님이 쓴 글입니다. > 제목 : 트뷰에서 사용중인 로직 변환 요청드려봅니다. > 트뷰에서 활용하고 있는 전략으로 손매매를 하고 있는데 이걸 자동으로 구현했고 혹시나 해당 플랫폼에서 사용할 수 있다면 자동매매로 전환하고 싶어서 문의드립니다. 트레이딩뷰 전략을 끌어와서 자동매매를 시작해보려고 합니다. 변환 부탁드립니다. //@version=4 strategy(shorttitle = "SQZMOM_LB", title="Squeeze Momentum Indicator [LazyBear]", overlay=true) length = input(20, title="BB Length") mult = input(2.0, title="BB MultFactor") lengthKC = input(20, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool) trailTrigger = input(50, title="트레일링 스탑 활성화 포인트") // 50포 상승 이후 트레일링 스탑 활성화 trailPercent = input(50, title="트레일링 되돌림 비율 (%)") / 100 // 50% 되돌림 시 익절 stopLossPercent = input(0.8, title="손절 비율 (%)") / 100 // 손절 비율 설정 // Calculate BB source = close basis = sma(source, length) dev = multKC * stdev(source, length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(source, lengthKC) range = useTrueRange ? tr : (high - low) rangema = sma(range, lengthKC) upperKC = ma + rangema * multKC lowerKC = ma - rangema * multKC sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC) sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC) noSqz = (sqzOn == false) and (sqzOff == false) val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)), sma(close, lengthKC)), lengthKC, 0) bcolor = val > 0 ? (val > nz(val[1]) ? color.green : color.green) : (val < nz(val[1]) ? color.red : color.red) scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray plot(val, color=bcolor, linewidth=2) plot(0, color=scolor, style=plot.style_cross, linewidth=2) startHour = 15 startMinute = 0 startTimestamp = timestamp("GMT+9", year, month, dayofmonth, startHour, startMinute) isAfterStartTime = (time >= startTimestamp) // 거래량 조건 추가: 최근 20기간의 평균 거래량 volumeAvg = sma(volume, 20) volumeMultiplier = input(1.3, title="Volume Multiplier for Entry") // 거래량이 평균보다 몇 배 이상일 때 진입할지 설정 longCondition = (bcolor == color.green) and (bcolor[1] != color.green) and isAfterStartTime and (volume > volumeAvg * volumeMultiplier) // 숏 포지션을 더 엄격하게 진입: 강한 하락 신호 추가 (50일 이동평균선 아래에서만) strongDownSignal = (bcolor == color.red) and (bcolor[1] != color.red) and (close < sma(close, 50)) // 50일 이동평균선 아래에서 하락 shortCondition = strongDownSignal and isAfterStartTime and (volume > volumeAvg * volumeMultiplier) var float maxProfitLong = na var float maxProfitShort = na if (longCondition) strategy.entry("Long", strategy.long) maxProfitLong := close // 롱 포지션 진입 시 초기화 if (shortCondition) strategy.entry("Short", strategy.short) maxProfitShort := close // 숏 포지션 진입 시 초기화 // 롱 포지션 트레일링 스탑 로직 if (strategy.position_size > 0) maxProfitLong := max(maxProfitLong, close) // 최고 수익 갱신 trailStopLong = maxProfitLong - (maxProfitLong - strategy.position_avg_price) * trailPercent // 50% 되돌림 계산 stopLossLong = strategy.position_avg_price - (strategy.position_avg_price * stopLossPercent) // 손절 가격 계산 if (close <= trailStopLong and (maxProfitLong - strategy.position_avg_price) >= trailTrigger) strategy.close("Long") if (close <= stopLossLong) strategy.close("Long") // 손절 // 숏 포지션 트레일링 스탑 로직 if (strategy.position_size < 0) maxProfitShort := min(maxProfitShort, close) // 최저 수익 갱신 trailStopShort = maxProfitShort + (strategy.position_avg_price - maxProfitShort) * trailPercent // 50% 되돌림 계산 stopLossShort = strategy.position_avg_price + (strategy.position_avg_price * stopLossPercent) // 손절 가격 계산 if (close >= trailStopShort and (strategy.position_avg_price - maxProfitShort) >= trailTrigger) strategy.close("Short") if (close >= stopLossShort) strategy.close("Short") // 손절 // 기본적인 색상 변화에 따른 청산 로직 strategy.close("Long", when=bcolor == color.red) strategy.close("Short", when=bcolor == color.green)