예스스탁
예스스탁 답변
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)