예스스탁
예스스탁 답변
2025-07-11 10:18:20
안녕하세요
예스스탁입니다.
1
시뮬레이션 차트는 변수 최적화기능이 있어 모든 input변수가 숫자변수이어야 합니다.
UseHeikinAshi변수를 0 또는 1로 지정하게 변경해 드립니다.
false면 0, true면 1로 지정하시면 됩니다.
2
UseHeikinAshi가 1로 지정되면 하켄아쉬 종가를 사용하게 추가해 드립니다.
3
Input:
Key_Value(1), // Key Vaule. 'This changes the sensitivity'
ATR_Period(10), // ATR Period
UseHeikinAshi(0);#0:False, 1:true // Signals from Heikin Ashi Candles (이 기능은 예스트레이더에서 별도 구현 필요)
Var:
xATR(0), // ATR 값
nLoss(0), // 손실 한도
xATRTrailingStop(0),// 트레일링 스톱 값
pos(0), // 추세 방향 (1:상승, -1:하락, 0:중립)
src(0), // 계산에 사용될 가격 데이터 (종가 또는 Heikin Ashi 종가)
ema(0), // EMA 값
above(False), // 상향 돌파 여부
below(False), // 하향 돌파 여부
BuySignal(False), // 매수 신호 발생 여부
SellSignal(False); // 매도 신호 발생 여부
var : xClose(0),xOpen(0),xHigh(0),xLow(0);
// 모든 변수를 수식 시작점에서 명확하게 초기화합니다.
// 이렇게 하면 컴파일러가 변수들이 사용되기 전에 항상 초기화되었다고 인식할 수 있습니다.
xATR = 0;
nLoss = 0;
xATRTrailingStop = 0;
pos = 0;
src = Close; // 기본적으로 현재 봉의 종가로 초기화
ema = 0;
above = False;
below = False;
BuySignal = False;
SellSignal = False;
#Heiken Ashi 시고저종
if index == 0 then
{
xClose = (O+H+L+C)/4;
xOpen = open;
xHigh = MaxList( high, xOpen, xClose);
xLow = MinList( low, xOpen,xClose);
}
else
{
xClose = (O+H+L+C)/4;
xOpen = (xOpen [1] + xClose [1])/2 ;
xHigh = MaxList(High, xOpen, xClose) ;
xLow = MinList(Low, xOpen, xClose) ;
}
// Heikin Ashi 캔들 사용 여부에 따라 src 값 결정
// 예스트레이더에서 Heikin Ashi 캔들 데이터를 직접 가져오는 기능이 없으므로,
// 이 부분은 일반 종가(Close)를 사용하거나, Heikin Ashi 캔들 계산 로직을 별도로 구현해야 합니다.
If UseHeikinAshi == 1 Then Begin
// Heikin Ashi 캔들 데이터 가져오기 (예스트레이더에서 직접 지원하지 않음, 별도 구현 필요)
// 예시: src = HAKENASHI_CLOSE(); 또는 Heikin Ashi 계산 로직 삽입
src = xClose; // UseHeikinAshi가 True여도 일단 Close를 사용합니다. (이 부분은 사용자 정의 함수로 대체되어야 합니다.)
End Else Begin
src = Close; // UseHeikinAshi가 False이면 현재 봉의 종가 사용
End;
// ATR 계산
xATR = ATR(ATR_Period);
nLoss = Key_Value * xATR;
// xATRTrailingStop 계산
// 첫 봉에서는 xATRTrailingStop[1] 값이 없으므로 초기값을 설정해야 합니다.
If CurrentBar == 1 Then Begin
xATRTrailingStop = src - nLoss; // 첫 봉 초기값 설정
End Else Begin
If src > xATRTrailingStop[1] And src[1] > xATRTrailingStop[1] Then Begin
xATRTrailingStop = Max(xATRTrailingStop[1], src - nLoss);
End Else If src < xATRTrailingStop[1] And src[1] < xATRTrailingStop[1] Then Begin
xATRTrailingStop = Min(xATRTrailingStop[1], src + nLoss);
End Else If src > xATRTrailingStop[1] Then Begin
xATRTrailingStop = src - nLoss;
End Else Begin
xATRTrailingStop = src + nLoss;
End;
End;
// pos (추세 방향) 계산
If CurrentBar == 1 Then Begin
pos = 0; // 첫 봉 초기값
End Else Begin
If src[1] < xATRTrailingStop[1] And src > xATRTrailingStop[1] Then Begin
pos = 1; // 상승 추세 전환
End Else If src[1] > xATRTrailingStop[1] And src < xATRTrailingStop[1] Then Begin
pos = -1; // 하락 추세 전환
End Else Begin
pos = pos[1]; // 이전 추세 유지
End;
End;
// EMA (period 1은 사실상 src와 동일)
ema = src; // EMA(src, 1)은 src와 동일합니다.
// 교차 신호
// 'Cross' 대신 'CrossUp'과 'CrossDown' 함수를 사용합니다.
// 라인 81: ema가 xATRTrailingStop을 상향 돌파
above = CrossUp(ema, xATRTrailingStop);
// 라인 82: xATRTrailingStop이 ema를 상향 돌파 == ema가 xATRTrailingStop을 하향 돌파
below = CrossDown(ema, xATRTrailingStop);
// 매수/매도 신호 조건
BuySignal = (src > xATRTrailingStop) And above;
SellSignal = (src < xATRTrailingStop) And below;
// 매수/매도 명령
If BuySignal Then Begin
Buy("UT_Buy");
End;
If SellSignal Then Begin
Sell("UT_Sell");
End;
즐거운 하루되세요
> 장보고153 님이 쓴 글입니다.
> 제목 : 수식 수정을 부탁드립니다
> 트레이딩뷰의 UT BOT 지표를 시스템용 매수 매도로 전환한 식입니다 검증 결과 이상이 없다고 확인되는데 구동하면 논리값이나 논리표현이 와야 한다는 메세지가 뜹니다
늘 건강하세요.
Input:
Key_Value(1), // Key Vaule. 'This changes the sensitivity'
ATR_Period(10), // ATR Period
UseHeikinAshi(False); // Signals from Heikin Ashi Candles (이 기능은 예스트레이더에서 별도 구현 필요)
Var:
xATR(0), // ATR 값
nLoss(0), // 손실 한도
xATRTrailingStop(0),// 트레일링 스톱 값
pos(0), // 추세 방향 (1:상승, -1:하락, 0:중립)
src(0), // 계산에 사용될 가격 데이터 (종가 또는 Heikin Ashi 종가)
ema(0), // EMA 값
above(False), // 상향 돌파 여부
below(False), // 하향 돌파 여부
BuySignal(False), // 매수 신호 발생 여부
SellSignal(False); // 매도 신호 발생 여부
// 모든 변수를 수식 시작점에서 명확하게 초기화합니다.
// 이렇게 하면 컴파일러가 변수들이 사용되기 전에 항상 초기화되었다고 인식할 수 있습니다.
xATR = 0;
nLoss = 0;
xATRTrailingStop = 0;
pos = 0;
src = Close; // 기본적으로 현재 봉의 종가로 초기화
ema = 0;
above = False;
below = False;
BuySignal = False;
SellSignal = False;
// Heikin Ashi 캔들 사용 여부에 따라 src 값 결정
// 예스트레이더에서 Heikin Ashi 캔들 데이터를 직접 가져오는 기능이 없으므로,
// 이 부분은 일반 종가(Close)를 사용하거나, Heikin Ashi 캔들 계산 로직을 별도로 구현해야 합니다.
If UseHeikinAshi Then Begin
// Heikin Ashi 캔들 데이터 가져오기 (예스트레이더에서 직접 지원하지 않음, 별도 구현 필요)
// 예시: src = HAKENASHI_CLOSE(); 또는 Heikin Ashi 계산 로직 삽입
src = Close; // UseHeikinAshi가 True여도 일단 Close를 사용합니다. (이 부분은 사용자 정의 함수로 대체되어야 합니다.)
End Else Begin
src = Close; // UseHeikinAshi가 False이면 현재 봉의 종가 사용
End;
// ATR 계산
xATR = ATR(ATR_Period);
nLoss = Key_Value * xATR;
// xATRTrailingStop 계산
// 첫 봉에서는 xATRTrailingStop[1] 값이 없으므로 초기값을 설정해야 합니다.
If CurrentBar == 1 Then Begin
xATRTrailingStop = src - nLoss; // 첫 봉 초기값 설정
End Else Begin
If src > xATRTrailingStop[1] And src[1] > xATRTrailingStop[1] Then Begin
xATRTrailingStop = Max(xATRTrailingStop[1], src - nLoss);
End Else If src < xATRTrailingStop[1] And src[1] < xATRTrailingStop[1] Then Begin
xATRTrailingStop = Min(xATRTrailingStop[1], src + nLoss);
End Else If src > xATRTrailingStop[1] Then Begin
xATRTrailingStop = src - nLoss;
End Else Begin
xATRTrailingStop = src + nLoss;
End;
End;
// pos (추세 방향) 계산
If CurrentBar == 1 Then Begin
pos = 0; // 첫 봉 초기값
End Else Begin
If src[1] < xATRTrailingStop[1] And src > xATRTrailingStop[1] Then Begin
pos = 1; // 상승 추세 전환
End Else If src[1] > xATRTrailingStop[1] And src < xATRTrailingStop[1] Then Begin
pos = -1; // 하락 추세 전환
End Else Begin
pos = pos[1]; // 이전 추세 유지
End;
End;
// EMA (period 1은 사실상 src와 동일)
ema = src; // EMA(src, 1)은 src와 동일합니다.
// 교차 신호
// 'Cross' 대신 'CrossUp'과 'CrossDown' 함수를 사용합니다.
// 라인 81: ema가 xATRTrailingStop을 상향 돌파
above = CrossUp(ema, xATRTrailingStop);
// 라인 82: xATRTrailingStop이 ema를 상향 돌파 == ema가 xATRTrailingStop을 하향 돌파
below = CrossDown(ema, xATRTrailingStop);
// 매수/매도 신호 조건
BuySignal = (src > xATRTrailingStop) And above;
SellSignal = (src < xATRTrailingStop) And below;
// 매수/매도 명령
If BuySignal Then Begin
Buy("UT_Buy");
End;
If SellSignal Then Begin
Sell("UT_Sell");
End;