오늘은 저번에 만든 지표들을 활용하여 전략을 만들고 해당 전략대로 스크립트를 작동시켜 자동으로 선물매매를 하도록 해보겠다.
저번단계까지 과정이다.
1. 내 바이낸스 선물계정과 API연동
2. 지표함수 추가
3. 코인 차트/지표 정보 출력 + 내 지갑 잔고정보 가져오기
< 지난 포스팅 >
https://jayindustry.tistory.com/64
[#1] 바이낸스 API연결부터 차트/지표정보부터 내 잔고가져오기
오늘은 바이낸스 API를 이용해 나의 바이낸스선물 계정과 연동하여 간단한 지표함수들을 가져와서 선물 트레이딩을 직접해보는 과정까지 해보았다. [ 개요 ] 1. 파이썬으로 바이낸스 선물 API 연
jayindustry.tistory.com
< 개요 >
오늘은 저번에 만든 스크립트를 이어, 나의 전략을 만들고 해당 전략대로 롱/숏포지션을 진입하는 스크립트를 만든 후,
반복문을 돌려 일단 서버없이 자동으로 매매할 수 있게 해보려고한다.
추가로 수익조건과 손절조건 또한 만들어서 자동 종료되도록 해보겠다.
1. "전략_1" 구상 및 초기세팅
2. 격리/교차모드, 레버리지 설정 기능
3. "전략_1" 코드구현
4. 수익조건, 손절조건 -> 포지션 종료 기능 추가
5. 결과 및 피드백
1. "전략_1" 구상 및 초기세팅

* 포지션 진입조건
*** 5분봉 기준으로 단타를 친다. ***
1. 가상화폐는 주식과 다르게 일주일 내내 거래가 되므로 이동평균선 MA5,MA15대신 MA7과 MA21을 사용하였다.
이 두 선이 골든크로스할 때 롱진입, 데드크로스할때 숏진입이다.
: 이는 나중에 백테스팅 기능까지 구현되면 실험을 통해 지속적으로 바꿀 예정이다.
2. 그리고 RSI를 사용하여 과매도 혹은 과매수구간에 리스크가 큰 포지션을 진입하지 않도록 하였다.
: 예를들어 RSI가 너무 높은 과매수구간에 롱포지션을 들어가면 리스크가 너무 크다.
3. 수익시 종료와 손절시 종료 조건을 만든다.
* 수익 종료조건
1) 7MA가 꺾이면서 포물선으로 유턴하며 추세가 바뀔때 기존에 진입한 포지션에 같은물량으로 반대포지션을 주어 종료시킨다. 이 때, 무턱대고 종료하면 손해를 볼 수 있기에, 무조건 수익률이 0.2% 이상인 상태여야한다.
2) 혹은 수익률이 1%가 넘어가면 종료하도록 한다.
* 손절 종료조건
1) 레버x1 기준으로 1%가 기존포지션과 반대로 갈때(손해볼때) 시장가로 종료한다.
*** 세팅하기 ***
먼저 정보를 잘 가져오는지 각 지표를 프린트해보고 변수로 저장한다.


실제 바이낸스 거래소와 비교해보니 잘 가져오고 있다..!

내 계좌의 잔고를 기준으로 한 필요한 선물정보들을 변수에 넣는다.
예를들어 현재 진입해있는 포지션의 수량이나 현재 설정되어있는 레버레이지 등등이다.

2. 격리/교차모드, 레버리지 설정 기능
그리고 선물을 할 땐 교차(cross)대신 격리(isolated)를 사용하여 나의 포지션 이외의 나머지 잔고에 피해가 가지 않도록 한다. 또한 레버를 10배로 설정하는 코드도 추가한다.

내가 현재 진입해있는 포지션의 수량과, 진입가, 설정한 레버레지, 미실현수익,
+
내 선물잔고의 테더(USDT)로 내가 정한 타겟코인(비트코인)을 내 레버리지(10배)로 했을 때
몇 개의 수량을 최대로 살 수 있는지 코드도 추가하여 모두 프린트 해보았다.

first_amount는 추후, 분할매수나 물타기를 대비하여 만들어 놓은 변수이다.
이번에는 myusdt_persent = 0.5, first_amount = ... * 100.0으로 지정하여 내 시드의 0.5(50%)를 넣으려고한다.
결과는 다음과 같다.

내 사용가능 시드는 36usdt * 10 (레버레이지)인데
여기서 0.5면 180usdt로 비트코인 구매수량을 구해야한다.
그럼 Max_Amount : 0.05개 (btc0.05개 = 약 180usdt)가 되어야하는데 조금 이상하다.
이 부분은 다음단계에서 원인을 찾아내서 고쳐야겠다..!
3. "전략_1" 포지션진입 +스탑로스 코드구현

위에서 전략을 상세히 설명하였으므로 생략한다.
현재 포지션이 없는 상태라면, 롱/숏 포지션을 진입하도록 구현하였다.
위에서는 롱포지션 진입과 함께 스탑로스함수로 스탑로스까지 설정한 모습이다.
숏 조건은 롱과 부호만 반대이므로 생략한다.
4. 수익조건, 손절조건 일 때, 포지션 종료

위의 코드에서 이미 스탑로스 설정을 하였지만, 혹시 모르니 즉시 손절하는 코드도 추가로 구현하였다.
시장가가 아닌 지정가 주문들이므로 이전에 혹시나 체결이 안된 주문들이 존재할 수 있다.
그래서 매 if문마다 모든 이전주문들을 취소하는 코드를 넣었고,
실행 딜레이를고려하여 최대한 주문지정가를 시장가와 맞추기위해 현재 코인가격(coin_price)변수를 매번 호출하였다.
스탑로스는 모든 주문마다 걸어주었다.
위 코드에서 매 코드마다 주석들을 달아놓았으니 참고하면 좋다!
이제 이 스크립트를 추후 AWS 인스턴스를 이용하여 매번 호출하려고 한다.
지금은 일단 기본적인 구현부터 시켜야하니 while문으로 전체를 감싸서

1분마다 한번씩 전체 스크립트를 호출시킨다.
5. 결과 및 피드백
1) 현재 포지션이 없거나 진입조건이 달성되지 않을 때

2) 포지션진입 + 스탑로스 설정될 때

각각의 사진 속, 맨 하단에 현재 포지션 상태가 출력되어 나온다.
실제 거래소 모습은 다음과 같다.

원하는 조건과 액수(코인갯수)에 잘 진입하였다.
그리고 원하는 수익조건에 맞게 자동으로 익절 및 손절하는 모습도 보였다.
익 절

설명)
0.01개의 비트코인만큼 숏포지션을 잡고, 수익1%를 넘어가고있는 상태가 되면 포지션을 현재가격 기준의 지정가로 종료시킨다. 정확히 말하면 반대포지션인 롱포지션으로 같은 양만큼 포지션을 진입한다.
손 절

설명)
코드에서 설정을 한 최소 진입갯수인 0.003개의 비트를 롱진입하였다. (0.003개 미만의 소액은 거래소 규정상 거래가 안된다.) 그리고 걸어놓은 스탑로스 덕분에 실현수익이 -0.5% * 3(3배율) = -1.5%가 되니 자동손절되었다.
잘 작동하는 것 같으나...
결과물을 보니 허나 몇 가지 허점들이 존재했다.
고쳐야할점)
- Max_Amount 출력결과를 보니 총 구매할 수 있는 수량이 실제와 일치하지 않음.
- 스탑로스 -1%로 했는데 -0.1%로 되어있는 경우도 발견. 레버리지가 적용이 안된 상태로 스탑로스가 걸림.
- 수익날때 바로 종료되도록 수정하기. 포지션자체에 스탑로스처럼 수익또한 지정하려고한다.
이 부분이 안되니까 1프로수익상태가 되어도 다음 스크립트가 실행되기 전까지 포지션 종료가 안됨.
(1분마다 실행시, 수익률이 +1%이상이 되어있어야 포지션종료가 됨)
- 포지션진입시, 터미널출력이 깔끔하지 못함 -> 스탑로스 함수를 수정해야할듯
- 코드가 너무 더러움. 리팩토링 필수!
다음 단계에서는 위에서 잡은 여러 피드백 사항을 적용하여 수정해보도록 하겠다.
'프로젝트 > [퀀트]자동트레이딩' 카테고리의 다른 글
| #4 [바이낸스 선물] 자동트레이딩 봇 코드 개선-2 , 에러처리 (0) | 2023.11.10 |
|---|---|
| #3 [바이낸스 선물] 자동트레이딩 봇 코드 개선-1 (0) | 2023.11.09 |
| #1 [바이낸스 선물] API연결부터 차트/지표정보부터 내 잔고가져오기 (0) | 2023.11.07 |
| [방향성2] 퀀트에 필요한 역량과 프로젝트의 목적 (0) | 2023.10.25 |
| [방향성1] 퀀트의 개념과고찰 (0) | 2023.10.23 |