[개발이야기] GOPAX에서 자동 매매하기[2]

in #kr6 years ago

지난 1편에서 기술한 대로 gopax에서 자동매매하기 프로그램을 완성하였다.
GOPAX에서 자동 매매하기

이 중 주문현황 기능은 적용하지 않고, 그냥 매수가 되면 매도 주문을, 매도가 되면 매수 주문을 넣었다. test 용으로 +-50원 정도에 자동 주문이 들어가도록 설정한 후 아침부터 돌려보고 있다. 점심 먹고 와서 확인해 보니 아래 사진과 같이 156회 정도 매매를 하고 있다.
ing.jpg

개발 과정에 대하여 좀 더 자세하게 기술한다.

자동 매매 프로그램 흐름도

첫 글에서 적은 대략적인 자동 매매 흐름도이다.

for(영원히) {
   if (체결) {   # 1번 API 
         현재 주문현황을 가져온다.  # 2번 API
         매수 전략대로 매수 가격을 결정하고 체결된 수량만큼 매수 주문을 낸다.  # 3번 API
   }       
    wait(30초)
}

일단 주문과 체결내역을 가져오는 부분을 함수화하였다.

def getTrade() :
def order(cnt, amount, price, side, tradingPair) :

그리고 전체적인 흐름은 아래와 같이 약간은 복잡해졌다.

    while(1) :
        tradings = getTrade() # 새로운 체결 내역을 가져온다.
        if ( 새로운 체결내역이 있으면) :
            for i in range(len(tradings)):  #체결내역을 하나씩 본다.
                if ( 이전에 처리한 체결보다 새로운 체결이 있으면 ) : 
                   if ( "EOS-KRW이 아니거나  체결수량이 1보다 적으면 ):  # 0.xx로 주문이 쪼개지는 것 방지
                       무시

                if (더 이상 새로운 체결이 없으면) :
                   break

                if ( '매도' 주문이면) :  # 매도한 수량만큼 정해진 가격에 다시 매수 주문
                     amount = tradings[i]['baseAmount']       # 매도한 수량만큼
                     price = tradings[i]['price'] - 50       # 판 가격에서 -50원
                     side = 'buy'
                else :                                 # 매수한 수량만큼 정해진 가격에 다시 매도 주문
                     amount = tradings[i]['baseAmount']       # 매수한 수량만큼
                     price = tradings[i]['price'] + 50       # 산 가격에서 +50
                     side = 'sell'

                위에서 정의한 내용으로 주문을 한다.

        # 신규 체결된 주문에 대하여 매수/매도 주문이 끝났으므로 10초간 휴식
        time.sleep(10)  # 10초간 휴식

자동 매매 프로그램 동작시킨 후 발견한 문제점들

막상 자동주문 프로그램을 돌려보니 아래와 같은 문제가 나타난다.

  1. 체결되는 주문의 양이 쪼개어져서 주문 수량이 1주로 수렴을 한다.
    사거나 파는 사람이 수량을 맞추어서 주문하지 않기 때문에 10주 주문을 내어도 0.45주, 5주, 4.45주 이런식으로 분할 매도가 된다. 매도 후 그 수량만큼 매수를 하므로 주문이 자꾸만 쪼개어져서 1주, 2주 이런 식으로 주문이 들어간다.
    대안) order id를 확인하여 원래 주문한 수량이 다 들어왔는지 확인한 후 다시 주문을 넣는다.

  2. 주문체결 확인 후 다시 주문을 넣는데 약 9초 정도 걸린다. 그동안 호가가 변경될 수 있으므로, 좁은 범위의 주문은 수수료가 발생할 수 있다.
    대안) 좀 더 넓은 범위로 자동 매매를 한다.


자동 매매 프로그램 개발 소감

수수료 캐쉬백 덕분에 자동매매의 가장 큰 걸림돌이던 슬리피지를 해소할 수 있어서 매매할수록 이익(?)이 나는 구조이다. 반면에 고팍스는 호가 공백이 너무 크고 매수/매도 수량이 적기 때문에 원하는 전략으로 사고팔 수가 없어서 어떤 전략을 적용하기는 어렵다.

이런 현 상황에서 가장 좋은 전략은 자동 박스권 매매이다.

본인이 예상하는 박스권을 설정한 후 매매를 시작하면 된다.

예를 들어 아래와 같은 단순한 전략을 적용하기에는 좋다.

  • 매수 가격대비 +1000원에 매도하겠다.
  • 매도가 되면 매도 가격에서 -1000원 가격에 매수 주문을 하겠다.

자동매매 프로그램이 돌고 있으니 또 다른 생각이 든다.

과연 수수료 이익(0.025%)을 보고 매매를 해도 되나?

즉 매수한 암호화폐 가격이 내려가면 큰 손해를 볼 수밖에 없다. 이 전략을 적용할 수 있는 암호화폐는 아래와 같은 움직임을 보여야 한다.

  1. 비교적 큰 박스권 움직임을 자주 보인다.
  2. 시간이 지나면 오른다.

1번 조건은 대부분의 암호화폐가 만족할 것 같다. 그런데 문제는 2번 조건이다. 과연 시간이 지나면 오르는 암호화폐가 있을까? 만약 그런 암호화폐가 있다면 그냥 사서 장기보유하면 된다. 골치 아프게 사고팔 이유가 하나도 없다.

음..

여기까지 작성하고 든 생각.

그럼 난 왜 이 작업을 한 걸까?

나도 모르겠다.

EOS에 대한 쓸데없는 믿음이랄까? 일단 믿고 EOS를 대상으로 자동매매 돌려본다.

이번 주말 동안 자동매매 프로그램 테스트를 더 해 본 후 +-1000원 전략을 적용해서 쭉 돌려놓을 예정이다.

Sort:  

헉 트레이딩봇이네요 !
이걸 직접 만드시다니 대단하시네요 ㄷㄷ
수익률은 어떤편인가요 :)

아! 추가로 @tradingideas님께
임대받은 스파 만료일이 다가오는데
연장하고 싶습니다 :)

스팀챗으로 연락드리면 될까요?

아직 수익률을 계산할 단계는 아니고요. 개발할 것이 조금 더 남았어요. 주말 동안 마무리하고 일주일 정도 돌려봐야 수익률 계산이 가능할 듯 합니다. 지금 같이 EOS 등락이 크면 수익률이 잘 나올 듯 합니다.

스파 임대 건은 스달 입금해주시면 자동 연장되십니다.

패턴은 따로 분석하신건가요? :)
보통 트레이딩봇 잘 짜신분들보면
아무 걱정 없이 20~30%의 수익률이 나오시더라구요
부럽습니다 ㅠ ㅠ

아! 그리고 이번달에는
현재 임대받고 있는 1500 스파에
1000스파를 추가해서 2500스파를
임대받고 싶은데 가능할까요? :)

아무 걱정없이라는 말은 조금 과장된 것 같습니다. 설마 손실이 나지 않는 방법이 있겠습니까?

임대와 관련해서는 추가로 더 해드리기는 어려울 것 같습니다.

써놓고 보니 말씀하신것처럼
과장된것 같네요 ㅎ

보통 고정적인 수익률을 올리시는 분들을 보면
시장상황에 능동적으로 대처할 수 있는 패턴을 가지고 계시더라구요 :)

그래서 손실이나도 어마어마한
타격을 입을정도는 아닌...
그런 말씀을 드리고싶었는데 ㅎ

임대와 관련해서는
연장만하는것으로 신청하고
6월이되기전 송금해드리도록 하겠습니다 ㅎ

시장상황에 능동적으로 대처한다는 것이 손절을 잘 한다는 것 같습니다. 손절만 잘하면 크게 손해볼 일은 없을 것 같기는 합니다.

gopax가 API를 지원하네요...
저기에다 머신러닝 붙여서 AI 붙은 자동 매매 도전해불까?

안됩니다. 호가 공백이 너무 커서 고팍스는 적절하지 않습니다. 지금 업비트가 API 오픈할려고 베타테스터 모집했거든요. 조금만 있으면 업비트 API 열릴 겁니다. 업비트에서 하셔야 할 듯 합니다.

👍👍👍👍

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

앗. 파이썬이군요. 저도 이거 만드려고 작년여름부터 파이썬 공부 중입니다. 반갑습니다. ^^*

좋은 결과 있으시기를 기원합니다. 궁금한 사항 있으시면 질문하세요. 아는 한도에서 답변드릴께요.

Coin Marketplace

STEEM 0.19
TRX 0.17
JST 0.030
BTC 79570.19
ETH 3203.15
USDT 1.00
SBD 2.70