예스스탁
예스스탁 답변
2025-02-24 10:15:36
안녕하세요
예스스탁입니다.
input : lengthLong(100);
input : lengthShort(200);
var : tickSize(0),tickOffset(0),tp_sl_ticks(0);
var : ma100(0),ma200(0);
var : prevOpen(0),shortPrevOpen(0),longEntryPrice(0),shortEntryPrice(0);
var : B(0),S(0);
tickSize = PriceScale;
tickOffset = 100 * tickSize;
tp_sl_ticks = 100 * tickSize;
// 이동평균선 계산
ma100 = ma(close, lengthLong);
ma200 = ma(close, lengthShort);
if B <= 0 and CrossUp(close, ma100) Then
{
B = 1;
prevOpen = open;
longEntryPrice = prevOpen + tickOffset;
if C >= longEntryPrice Then
B = 2;
}
if B >= 0 and CrossDown(close, ma100) Then
B = -1;
if S <= 0 and CrossUp(close, ma200) Then
S = 1;
if S >= 0 and CrossDown(close, ma200) Then
{
S = -1;
shortPrevOpen = open;
shortEntryPrice = shortPrevOpen - tickOffset;
if C <= shortEntryPrice Then
S = -2;
}
if MarketPosition == 0 Then
{
if B == 1 Then
Buy("Long1",AtStop,longEntryPrice);
if B == 2 Then
Buy("Long2",AtLimit,longEntryPrice);
}
if MarketPosition == 1 Then
{
ExitLong("Long TP",AtLimit,longEntryPrice + tp_sl_ticks);
ExitLong("Long SL",AtLimit,longEntryPrice - tp_sl_ticks);
}
if MarketPosition == 0 then
{
if S == -1 Then
Sell("Short1",AtStop,shortEntryPrice);
if S == -2 Then
Sell("Short2",AtLimit,shortEntryPrice);
}
if MarketPosition == -1 Then
{
ExitShort("Short TP",AtLimit,shortEntryPrice - tp_sl_ticks);
ExitShort("Short SL",AtLimit,shortEntryPrice + tp_sl_ticks);
}
즐거운 하루되세요
> codeblue 님이 쓴 글입니다.
> 제목 : 시스템 트레이딩 수식 변환 부탁드립니다
> 지난번에 문의를 드렸지만 제대로 구현이 되지 않아서 전략을 설명하는 이미지와 전략을 구현한 파인스크립트 소스를 첨부드립니다. 또한 덧붙인 추가적인 예외 상황까지 참고하시어 예스랭기지로 변환 부탁드리겠습니다.
①롱 진입 : 100일 이평선을 상향 돌파 마감한 캔들의 시초가를 기준점으로 설정, 다음 캔들부터 +100틱에서 롱 포지션 진입.(그림1)
②숏 진입 : 200일 이평선을 하향 돌파 마감한 캔들의 시초가를 기준점으로 설정, 다음 캔들부터 -100틱에서 숏 포지션 진입.(그림2)
③기존 포지션이 있을 경우, 진입 조건을 만족해도 추가로 진입하지 않음.
④익절과 손절은 각각 100틱
⑤나스닥 100 선물 1계약
[추가 상황] 기준 이평선 돌파 캔들(X)의 시가와 종가의 갭이 +-100틱을 넘어설 경우, X 캔들의 다음 캔들(X+1)부터 X 캔들의 시초가 +-100틱 지점을 지정가로 포지션 진입.
-롱 : A 캔들이 100일 이평 상향 돌파 마감. A캔들 시초가 10,000, 종가 10,100 가정했을 때, A+1 캔들부터 +100틱인 10,025에서 지정가로 포지션 진입(그림3)
-숏 : B 캔들이 200일 이평 하향 돌파 마감. B캔들 시초가 10,000, 종가 9,000 가정했을 때, B+1 캔들부터 -100틱인 9,975에서 지정가로 포지션 진입(그림4)
//@version=5
strategy("Auto Trading", overlay=true)
// 설정 변수
lengthLong = 100
lengthShort = 200
tickSize = syminfo.mintick
tickOffset = 100 * tickSize
tp_sl_ticks = 100 * tickSize
// 이동평균선 계산
ma100 = ta.sma(close, lengthLong)
ma200 = ta.sma(close, lengthShort)
// 캔들 정보
prevOpen = ta.valuewhen(close > ma100 and ta.crossover(close, ma100), open, 0)
shortPrevOpen = ta.valuewhen(close < ma200 and ta.crossunder(close, ma200), open, 0)
// 진입 가격 계산
longEntryPrice = prevOpen + tickOffset
shortEntryPrice = shortPrevOpen - tickOffset
// 포지션 보유 여부 확인
hasPosition = strategy.position_size != 0
// 롱 진입 조건 (기존 포지션 없고, 조건 충족 시)
longCondition = not hasPosition and ta.crossover(close, ma100)
if (longCondition)
strategy.entry("Long", strategy.long, qty=1, stop=longEntryPrice)
strategy.exit("Long TP/SL", from_entry="Long", limit=longEntryPrice + tp_sl_ticks, stop=longEntryPrice - tp_sl_ticks)
// 숏 진입 조건 (기존 포지션 없고, 조건 충족 시)
shortCondition = not hasPosition and ta.crossunder(close, ma200)
if (shortCondition)
strategy.entry("Short", strategy.short, qty=1, stop=shortEntryPrice)
strategy.exit("Short TP/SL", from_entry="Short", limit=shortEntryPrice - tp_sl_ticks, stop=shortEntryPrice + tp_sl_ticks)