Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

부드러운 감자 이야기

파인 스크립트로 나만의 전략 만들기 (이동 평균선 만들기 2) 본문

매매전략 코딩일지

파인 스크립트로 나만의 전략 만들기 (이동 평균선 만들기 2)

softpotato 2021. 7. 20. 00:17

안녕하세요 감자입니다.

오늘은 지난번 이동평균선을 만드는 방법에 대해 배워 보았으니,

여러 개의 다양한 이동평균선, 크로스 전략을 만들어 보도록 하겠습니다.

 

먼저, 트레이딩 뷰 파인 에디터 이하 스크립트를 눌러 주시고,

지난번에 배웠던 스크립트를 이어서 진행하는 식으로 하도록 하겠습니다.

지난번 포스팅에 만든 이동평균선 코드

지난번 포스팅에서 만들 음식이 있다면 레시피가 필요하듯이

두 가지 재료, 주가의 소스와 기간을 sma( )라는 함수에 잘 넣어서 plot이라는 접시에 이동 평균선을 만들었습니다.

 

이 방법을 응용해서 만들면 끝, 어렵지 않습니다.

먼저 지난번 만든 코드에 여러 개의 이동 평균선 코드가 들어가므로 보기 좋게 숫자로 만들어 보았습니다.

방식은 동일하며, 자신이 만들고 싶은 이동평균선 개수만큼 코드를 작성해 주시면 됩니다.

저의 경우는 3개의 이동평균선, 20,50,100으로 작성 했습니다.

 

src1      = close
length1  = input(defval=20,minval=1,title="길이 1")
ma1      = sma(src1,length1)
plot(ma1,color=color.red)

src2    = close
length2 = input(defval=50,minval=1,title="길이 2")
ma2     = sma(src2,length2)
plot(ma2,color=color.orange)

src3    = close
length3 = input(defval=100,minval=1,title="길이 3")
ma3     = sma(src3,length3)
plot(ma3,color=color.yellow)

 

위의 코드는 제가 작성한 예시이며, 복사에서 붙여 넣으셔도 됩니다.

여기서 코드를 보시면 이동평균선의 공식이 보입니다.

이동평균선 = sma( 주가의 소스(close) , 주가의 기간(length) )

따라서, 코드의 변수(재료의 이름)를 다르게 하고, 동일한 코드를 활용 가능합니다.

이제, 새롭게 보이는 "color" 라는 것이 있는데 말 그대로 색상을 뜻하며, plot이라는 출력 함수에

색상을 묻는 것이라고 생각하시면 됩니다. 예시에서는 빨강, 주황, 노랑으로 각각 출력해 달라고 작성한 것입니다.

 

위의 코드를 적용한 이동평균선

또한, 주가의 소스를 보시면 각 변수들이 동일한 값을 쓰는 것을 보실 수 있는데

정석으로는 저런 식으로 작성하는 것이 맞지만, 효율적으로 코드를 만들기 위해, 하나의 변수로 각각 적용하여,

깔끔하게 만들 수도 있습니다. (솔직히 많은 코드들을 작성하려면 귀찮기도 하겠죠)

 

src      = close
length1  = input(defval=20,minval=1,title="길이 1")
ma1      = sma(src,length1)
plot(ma1,color=color.red)

//src2    = close
length2 = input(defval=50,minval=1,title="길이 2")
ma2     = sma(src,length2)
plot(ma2,color=color.orange)

//src3    = close
length3 = input(defval=100,minval=1,title="길이 3")
ma3     = sma(src,length3)
plot(ma3,color=color.yellow)

 

코드 중 // 는 코드가 적용되지 않는 주석처리라고 생각하시면 됩니다 따라서 지우셔도 문제없습니다 =)

 

이런 식으로도 표현이 가능합니다. 

자, 이동평균선을 만드는 것은 위의 방법으로 활용해 보시면 좋을 것 같고,

다음으로, 크로스 전략을 시작해 보겠습니다.

 

우선적으로, 먼저 코드 중 100일 기간의 이동평균선은 주석 처리하겠습니다.

크로스 전략에 있어서 직관적으로 확인하기 위함입니다.

 

src      = close
length1  = input(defval=20,minval=1,title="길이 1")
ma1      = sma(src,length1)
plot(ma1,color=color.red)

length2 = input(defval=50,minval=1,title="길이 2")
ma2     = sma(src,length2)
plot(ma2,color=color.orange)

//length3 = input(defval=100,minval=1,title="길이 3")
//ma3     = sma(src,length3)
//plot(ma3,color=color.yellow)

 

위의 코드대로 진행한 후, 연산 작업에 필요한 변수를 하나 만들겠습니다.

 

각각, 상승과 하락에 대한 변수 이름인 upcross와 dncross라는 변수를 만들고

골든 크로스를 만들 crossover( ) 와 데드 크로스를 만들 crossunder( )를 활용하여 코드를 작성합니다.

 

* 골든크로스 = 단기 이평선이 장기 이평선을 돌파하는 시점

* 데드크로스 = 단기 이평선이 장기 이평선을 이탈하는 시점

 

upcross = crossover(ma1,ma2)
dncross = crossunder(ma1,ma2)

 

그리고, 이것을 바로 plot에 넣게 된다면 에러가 발생하므로 조건을 넣어야 합니다.

따라서, 조건을 넣을 변수도 작성합니다.

 

longsignal = upcross ? ma1 : na
shortsignal = dncross ? ma1 : na

 

여기서, ? 란 if ~ else, 개발 쪽을 배우신 분들이라면 뭔가 익숙한 것이 보이실 것입니다.

bool이라는 조건식으로 쓰이며, A ? ture : false 즉, 참, 거짓을 나타냅니다.

 

파인 스크립트가 완전 새로운 코드들로 구성된 것은 아니고 코딩 배울 때 알던 것들도 비슷하게 쓰입니다.

저기 보이는 "na"의 의미는 아무것도 없음 빈 상자 같은 것이라고 생각하시면 됩니다.

 

따라서,

 

쉽게 생각하자면,

longsignal이라는 애한테 지금 상승(upcross)이야 맞으면 ma1(20일 이동평균선)에 넣고 아니면 냅둬(na) 

shortsignal이라는 애한테 지금 하락(dncross)이야 맞으면 ma1(20일 이동평균선)에 넣고 아니면 냅둬(na) 이런 느낌(?)

 

자 거의 다 되었습니다.

 

마지막으로, plotshape( )라는 함수에 출력해 주도록 하겠습니다.

 

 

plotshape(longsignal,style=shape.circle,location=location.absolute,size=size.tiny,color=color.green)
plotshape(shortsignal,style=shape.circle,location=location.absolute,size=size.tiny,color=color.red)

 

 

plotshape( )란 plot과 기능이 비슷한 형제 같은 존재로써, 주로 저 같은 경우 시그널을 표시할 때 많이 씁니다.

plotshape(시그널 변수 이름 , 모양/스타일 , 위치 , 크기 , 색상) 으로 구성하였고,

시그널변수이름 = longsignal / shortsignal

모양/스타일 = shape.circle

[plotshape함수의 속성 중 하나로써, style = shape.(     )로 표현, circle,triangleup,triangledown,labelup,labeldown...등

의 스타일을 활용]

위치 = location.absolute

[plotshape함수의 속성 중 하나로써, location = location.(      )로 표현, 캔들 아래인 belowbar, 캔들 위인 abovebar,

특정 위치인 absolute가 있다] 

크기 = size.tiny

[plotshape함수의 속성 중 하나로써, size = size.(    )로 표현, 작은 순으로부터 size.tiny , size.small , size.normal , size.large , size.huge 등이 있다]

색상 = color

[plotshape함수의 속성 중 하나로써, color=color.( 색상 )으로 표현]

 

크로스 시그널 출력화면

plotshape 출력 함수에 특정 위치 값인 20일 이동평균선에 absolute로 시그널이 잘 들어가 있는 것을 확인할 수 있고,

골든 크로스, 데드 크로스가 잘 나왔다는 것을 확인 할 수 있습니다.

 

혹여나, 따라오신 분들 고생 많으셨습니다.

이만, 포스팅을 마치도록 하겠습니다.

 

다음 포스팅으로는, 함수로 만들어 보는 볼린저 밴드와 변동폭이 좁을 때 나타나는 스퀴즈를 표시하는 방법에 대해 

포스팅하도록 하겠습니다 =) 

 

감사합니다.

Comments