[암호화폐] 스팀엔진 토큰 거래 내역 조회하기

in #sct5 years ago

스팀엔진 재미있는 토큰을 많이 사게 되는군요. 거래도 많이 하게 되고요. 그런데 얼마나 수익이 났는지 궁금한데, 정확한 거래 금액을 알기 어렵습니다. 특히나 이번에 SSC 토큰을 청산하면서 매매가 있었던 홀더 분들의 거래 가격을 정확하게 파악하기가 상당히 힘들었습니다.

그래서 스팀엔진 토큰들의 거래 내역을 확인해보고자 합니다.

뭔가를 해 보려면 github에 가서 먼저하신 분들의 소스를 찾게 되면 시간을 많이 줄일 수 있겠죠. github에서 steem-engine과 관련된 코드를 찾아봅니다.

이번에도 holgern이 관련 파이썬 코드를 올려놓았군요. 이 분이 scotbot을 만들고 계시죠.
https://github.com/holgern/steemengine

이 코드를 다운 받아서 돌려봅니다. steem-engine에 있는 거래 내역을 한 줄로 받을 수 있습니다.

rets = api.get_history("tradingideas", "ENG")

참 쉽죠잉. 다 끝난줄 알았습니다.

그런데 이게 시작이더군요.

steem-engine의 거래 내역이 아주 특이하게 저장되어 있었습니다. DB 를 효율적으로 사용하기 위하여 이렇게 설계한 것 같은데, 익숙하지가 않군요.

우선 가장 큰 문제는 market price로 거래를 한 사람 기준으로 거래가 기록되어 있습니다. 매수 주문의 경우에는 위 함수를 이용하여 확인이 가능합니다. 그런데 매도 주문의 경우에는 확인이 불가합니다.

그래서 일단 모든 주문을 list-up하는 코드를 만들어서 excel로 보낸 후 매도가 된 주문과 그렇지 않은 주문을 구분하는 작업을 해야 정확한 손익을 분석할 수 있습니다. 이렇게 말이죠. 최근에 ENG가 폭락한 것이 abide가 팔아서 이렇게 된 것이군요. 천천히 팔면 본인도 비싸게 팔고, 시장 가격도 교란하지 않을텐데, 기다릴 줄을 모르는 구요.

image.png

손익분석을 위하여 order 북에 있는 매도 주문은 현재가로 변경하고 홀딩하고 있는 것도 현재가로 변경해서 계산을 해 보았습니다. 다행히 약간의 이익이군요. 이거 한 번은 이렇게 해 보겠지만 두 번은 못하겠습니다.

좀더 편리하게 한다면 매도 주문 중 현재 order 북에 없는 것은 매도가 되었다고 가정하고 처리할 수 있습니다. 물론 cancel 한 주문은 빼야겠죠. 이런 저런 경우를 생각하다가 그냥 포기합니다.


이번 거래 내역을 작업하면서 한가지 문제점을 또 발견했습니다. 혹시 정확한 거래 내역을 꼭 확인해보고 싶으신 분이 계실까봐 저의 경험을 공유합니다.

한 명이 다량의 주문을 내면 여러 명이 매수를 하게 됩니다. 이때 나의 주문이 하나 이상 동일한 매도 주문에 체결이 되면 위 함수에서 두 번 등록이 되어 있습니다. 따라서 동일한 Txid로 등록이 되어있으면 무시를 하셔야 합니다.

물론 첫 번째 매도 주문이 왔을 때 events에 있는 모든 항목에 대하여 본인의 거래를 찾아서 매수한 것으로 처리하여야 합니다. 정작 거래는 sell 인데 본인 관점에서는 매수가 되는 것이고, 한 txid에 여러 건의 본인 매수가 있을 수 있습니다.
image.png

    elif ( tx['action'] == 'sell' ):  # sender가 내가 아니면 난 산 거임
        log = json.loads(tx['logs'])
        tr_info = json.loads(tx['payload'])

        fr = log['events'][0]['data']['from']
        to = 'market'
        price = tr_info ['price']
        qty = log['events'][0]['data']['quantity']
        symbol = tr_info ['symbol']
        if (symbol != targetSymbol ) :
            return
        if ( len(log['events']) > 1 ) : # market에 내는 주문
            # sender간 나이면 난 판사람
            if ( tx['sender'] == me ) :
                pass
            else : # # sender간 남이면 난 산 사람
                gotIt = 0
                for event in log['events'] :
                    if(gotIt) : # price 계산
                        gotIt = 0
                        steempQty = event['data']['quantity']
                        price = float(steempQty)/float(tokenQty)
                        qtyInt = int(float(tokenQty))
                        print(ts, "[",symbol,"] buy    : ", fr, me, "%0.4f"%price, qtyInt )  
                    if ( event['data']['to'] == me) :
                        # price도 여기에서 수정
                        tokenQty = event['data']['quantity']
                        gotIt = 1
        else:
                minusQty = "-" + qty
                # 그냥 매도 주문, 이후에 취소하지 않았으면 체결로 간주
                print(ts, "[",symbol,"] sell   : ", me, "market", price, minusQty )  

Sort:  

하~~ 이게 뭔가요? 이런쪽은 아는게 하나도 없어서... 패쓰~ ㅋ
오늘도 수고하셨습니다!

안녕하세요 tradingideas님

랜덤 보팅!!

소소하게 보팅하고 가요

Turtle-lv1.gif

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 63402.76
ETH 2554.52
USDT 1.00
SBD 2.66