커뮤니티

시스템 트레이딩 수식 변환 부탁드립니다

프로필 이미지
codeblue
2025-02-24 09:59:25
414
글번호 188443
답변완료

첨부 이미지

지난번에 문의를 드렸지만 제대로 구현이 되지 않아서 전략을 설명하는 이미지와 전략을 구현한 파인스크립트 소스를 첨부드립니다. 또한 덧붙인 추가적인 예외 상황까지 참고하시어 예스랭기지로 변환 부탁드리겠습니다. ①롱 진입 : 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)
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

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)