안녕하세요 racoonee입니다.
오늘은 MACD와 지수 이동평균을 활용한 전략을 작성해 보도록 하겠습니다.
이번 전략도 중복 진입을 활용하게 되므로 주문 설정도 같이 안내해 드리도록 하겠습니다.
성과분석을 먼저 보고 시작하시겠습니다.
차트 데이터는 키움 나스닥 2분봉으로 조회 봉수는 25000으로 해서 긴 기간 동안에 성과를 보도록 하겠습니다.
많은 수의 데이터에서 성과를 보고 싶다는 분들이 계셔서 평소보다 많은 차트 데이터를 활용해 보겠습니다.


- 시뮬레이션
- 수수료 : 편도 3.2$
- 슬리피지 편도 5 Tick

(개인적으로 사용하고 있는 전략은 수수료는 설정을 안 하고 슬리피지는 편도 0.1% 또는 0.2%를 사용하여 만들어서 사용하고 있습니다.)
추가 설정으로
설정 > 주문 설정 > 가격/수량 화면에서 오른쪽 하단에 중복 진입 설정을 해주셔야 합니다.
모든 진입 신호 허용으로 해주시고 완료해 주시면 됩니다.

여기까지 설정은 다 끝났으니 신호 내역을 확인해 보겠습니다.

전체 신호는 다음과 같이 물타기와 불타기를 하면서 진행을 하고 있습니다.
MACD를 통해 진입 시점을 확인하고 지수 이동평균을 통해 추세를 확인하면서 매매를 하는 전략입니다. 매수와 매도의 진입 조건을 확인해 보도록 하겠습니다.
지표 및 필요 설정 작성
조건 작성 전 전략에 사용할 지표들을 작성해 보도록 하겠습니다.

이번 전략에 사용할 MACD와 Signal 계산과 지수 이동평균선, 그리고 캔들의 중앙값을 계산한 cdl, 포지션을 확인할 marketposition의 변수인 mp를 준비하겠습니다.

그리고 10, 11 줄에 작성된 조건은 각 포지션이 첫 진입이 되기 이전에 주가가 지수 이동평균을 상향 돌파 하향 돌파를 진행 이후에
캔들의 중심이 지수 이동평균의 위에 위치해있으면 v1에 횟수 카운트,
캔들의 중심이 지수 이동평균의 아래에 위치해있으면 v2에 횟수 카운트.
13, 14 줄에 작성된 조건은 포지션이 진입된 이후에 주가가 지수 이동평균을 상향 돌파 하향 돌파를 진행 이후에
캔들의 중심이 지수 이동평균의 위에 위치해있으면 v88에 횟수 카운트,
캔들의 중심이 지수 이동평균의 아래에 위치해있으면 v99에 횟수 카운트.
다음을 준비하고 진입 신호를 작성해 보도록 하겠습니다.
매수 신호

매수 진입 후 익절을 하고 있는 신호입니다. 중간에 매도도 한번 진입 후에 익절을 한 모습이 확인됩니다.
매수 신호들을 보게 되면 진입 이후 상승을 하다가 추가 진입 조건을 만족하여 수익 중에 불타기를 하는 모습을 보실 수 있습니다.
진입 시점들을 확대하여 지표와 같이 보시면서 조건을 작성해 보도록 하겠습니다.


위에 지표를 보시면 차트와 같이 그려진 흰색 지표가 200지수 이동평균선입니다. 하단에 있는 지표 중 주황색 지표는 MACD, 파란색 지표는 Signal, 흰색 지표는 기준선 0을 그리고 있습니다.
- 매수 진입
- v1의 조건을 3번 이상 만족할 때(지표 작성 부분에 조건 설명) : v1>= 3
- 캔들의 중간값이 지수 이동평균보다 클 때 : cdl > oEma
- MACD와 Signal 이 0 보다 작을 때 : oMACD < 0 and Signal < 0
- MACD가 Signal을 상향 돌파했을 때 : CrossUP(oMACD, Signal)
- 첫 진입만 동작하기 위해 조건에 v11 = 0을 설정한 후, Buy와 v11 = 1을 동시에 작성을 진행
- 한번 진입을 하게 되면 v11이 1로 변경이 되기 때문에 B의 진입명을 갖는 매수는 v11이 0이 되기 전까지 이후에 신호 발생하지 않음
- 첫 진입을 한 봉을 기준으로 2개 이전의 봉에 매수가 진입이 돼있지 않는다면 현재봉을 제외한 이전 10개의 저가 중 가장 작은 값을 b_loss에 저장
- 매수 손절 가격을 지정하는 과정
- 매수 추가 조건
- 중복 진입 중 첫 진입을 한 이후 : v11 = 1
- 나머지 조건들은 기존 매수 조건과 같음
- 진입명은 B2로 설정
- 매수 손절가는 첫 진입한 봉 기준으로 설정을 하기 위해 매수 추가 조건에 실행문 부분에는 손절가 계산 수식 작성하지 않음
다음 조건을 만족한 시점에 첫 매수 진입이 된 것을 확인할 수 있습니다. 특징을 보시면 변곡이 된 이후 이전에 하락이 시작된 가격 근처에서 진입을 한 것을 보실 수 있습니다.
추가 진입 신호를 확인해 보도록 하겠습니다.

첫 진입인 B가 진입한 이후에 B2가 연속적으로 진입을 한 것을 보실 수 있습니다. 다음은 추세를 잘 타면서 진입을 했기 때문에 상승 후 횡보를 할 때 MACD 골든크로스 시점에 맞춰서 추가 진입을 하고 있는 것이 확인됩니다.
한 계약을 진입을 할 때보다 추가 진입으로 불타기를 진입해 많은 수익을 낼 수 있음을 확인했습니다.
매도 신호

지수 이동평균선을 중심으로 횡보를 할 때 진입을 하다가 캔들이 지수 이동평균선 아래로 움직이기 시작할 때 추가적으로 불타기를 하고 있는 것을 보실 수 있습니다.
진입 신호 위치를 지표와 함께 보면서 조건을 작성해 보도록 하겠습니다.


- 매도 진입
- v2의 조건을 3번 이상 만족할 때(지표 작성 부분에 조건 설명) : v2>= 3
- 캔들의 중간값이 지수 이동평균보다 작을 때 : cdl < oEma
- MACD와 Signal 이 0 보다 클 때 : oMACD > 0 and Signal > 0
- MACD가 Signal을 하향 돌파했을 때 : CrossDown(oMACD, Signal)
- 첫 진입만 동작하기 위해 조건에 v11 = 0을 설정한 후, Sell과 v11 = -1을 동시에 작성을 진행
- 한번 진입을 하게 되면 v11이 -1로 변경이 되기 때문에 S의 진입명을 갖는 매도는 v11이 0이 되기 전까지 이후에 신호 발생하지 않음
- 첫 진입을 한 봉을 기준으로 2개 이전의 봉에 매도가 진입이 돼있지 않는다면 현재봉을 제외한 이전 10개의 고가 중 가장 큰 값을 s_loss에 저장
- 매도 손절 가격을 지정하는 과정
- 매도 추가 조건
- 중복 진입 중 첫 진입을 한 이후 : v11 = -1
- 나머지 조건들은 기존 매도 조건과 같음
- 진입명은 S2로 설정
- 매도 손절가는 첫 진입한 봉 기준으로 설정을 하기 위해 매도 추가 조건에 실행문 부분에는 손절가 계산 수식 작성하지 않음
매도 첫 진입 신호를 보게 되면 지수 이평을 따라 횡보 중에 MACD가 0 위에서 데드크로스가 진행되었을 때 진입된 것 보실 수 있습니다.
그 이후 하락을 하면서 추가 매도를 하게 되는데 다음 부분은 추가 진입 이미지를 보면서 확인해 보겠습니다.

추가 매도 진입 역시 조건에 맞춰서 올바르게 들어간 것을 보실 수 있습니다. 하락을 일정하게 하는 것이 아니라 하락 후 횡보 하락 후 횡보를 반복을 하는데 추세가 하락으로 잡히기 이전에 진입을 하게 되어 약간이 이익이 되는 진입을 하고 있습니다.
청산 및 변수 초기화
오늘은 평소와 다르게 변수를 초기화 시점 및 코딩 방법을 같이 설명을 드리겠습니다.
변수 초기화를 하지 않는다면 이전의 상태가 유지가 되기 때문에 이번 전략과 같이 중복 진입을 하는 전략과 같은 경우에는 한봉에서 여러 번의 신호가 발생을 하거나 연속된 봉에서 계속 진입을 해버리는 현상이 발생합니다.
그래서 기본적은 방법은 진입 이후 청산이 되었을 때 유지시킨 변수를 초기화 시켜 조건을 다시 확인하도록 하는 것이 좋습니다. 변수를 초기화하는 방법은 여러 가지가 있지만 가장 기본적인 방법을 사용해 보도록 하겠습니다.

- 매수 손절 청산
- b_loss보다 0.2% 하락한 가격 : b_loss*(100-0.2)/100
- 지정한 매수 손절가를 하향 돌파할 때 : CrossDown(C, b_loss*(100-0.2)/100)
- 청산 신호와 동시에 첫 진입만 하기 위해 설정한 v11 값, 첫 진입 전 조건 카운트를 진행한 v1과 v2, 추가 진입을 위해 카운트를 진행한 v88과 v99 0값으로 초기화
- 매도 손절 청산
- s_loss보다 1.3% 상승한 가격 : s_loss*(100+1.3)/100
- 지정한 매도 손절가를 상향 돌파할 때 : CrossUp(C, s_loss*(100+1.3)/100)
- 청산 신호와 동시에 첫 진입만 하기 위해 설정한 v11 값, 첫 진입 전 조건 카운트를 진행한 v1과 v2, 추가 진입을 위해 카운트를 진행한 v88과 v99 0값으로 초기화
- 추가 변수 초기화
- 이전봉과 현재봉의 포지션이 다를 때 : mp[1] <> mp
- 현재봉의 포지션이 없을 때 : mp = 0
- v11, v1, v2, v88, v99 값 0으로 초기화
중복 진입 및 2계약 이상 강제 청산 시 조건 아래와 같이 currentcontracts를 사용하지 않으면 올바르게 나오지 않을 수 있습니다.
- 강제 청산
- 매수 익절 : 진입한 포지션이 2.4% 수익이면 청산
- 매도 익절 : 진입한 포지션이 2.2% 수익이면 청산
- 매수와 매도가 아지면 강제 청산 다시 초기화
이전에 말씀드렸던 내용을 다시 말씀드리면 상승추세와 하락 추세의 변동성 및 움직임의 속도가 차이가 있기 때문에 청산 기준가에 차이를 두었습니다.
다음 가격들은 수정하여 사용하실 수 있도록 했으니 좋은 비율을 찾아서 진행해 보시면 좋을 것 같습니다.
완성된 스크립트 확인 해보겠습니다.

이번 전략은 데이트레이딩 전략이 아니기 때문에 장을 마감 한 이후에도 포지션을 보유하고 있을 때 전략 재실행시 포지션을 맞춰주시거나 데이터를 이전에 매매했던 데이터에서 이어서 불러오셔서 신호를 유지시켜주셔야 합니다.
그렇지 않으면 데이트레이딩에서 사용한 청산 조건을 넣어 당일 청산을 무조건 진행한 이후에 수식을 수정하여 사용해 보셔도 좋습니다.
여러 가지 방법이 있으니 다양한 전략을 만들어 보시기 바랍니다.
전략은 많이 가지고 있을수록 좋습니다. 특정 추세나 환경에 따라 맞춰서 매매를 하기 위해서는 많은 전략을 가지고 선택하여 매매를 진행하거나 동시에 여러 전략을 구동하여 햇징을 할 수 있게 하는 방법 등 여러 가지로 사용할 수 있기 때문에 많은 전략을 보유하고 만들어 보시는 게 좋습니다.
다음 시간에 더 좋은 전략을 만들어 가져오도록 하겠습니다.
모두 부자가 됩시다!
※참고. 주기 및 기준값들은 변경하고 사용하셔도 됩니다.
(질문이나 전략 코딩 및 구매 관련 문의가 있으시면 이메일이나 댓글 남겨 주시기 바랍니다.)
'스크립트 작성 > signalmaker' 카테고리의 다른 글
[시그널메이커] 사용자 함수 만들기_대칭 가중 이동평균(SWMA) (0) | 2024.08.07 |
---|---|
[시그널메이커] MACD_스토캐스틱 전략 (2) | 2024.08.07 |
[시그널메이커] 지수 이동평균 추세 전략_데이트레이딩 (1) | 2024.08.07 |
[시그널메이커] HLC_이동평균(지수, 단순)_ADX (0) | 2024.08.07 |
[시그널메이커] 지수이평_ADX_CCI_캔들 전략 (1) | 2024.08.07 |