본문 바로가기
날것 그대로의 공부기록/pinescript

bybit order history 트레이딩 뷰에 표시하기

by 20j 2023. 4. 24.

바이빗에서 선물트레이딩을 하다보면 바이낸스와 다르게 차트에 바로 표시가 안되어서 불편함을 느끼던 도중

직접 만들어보기로 하였다.

 

pinescript v5 문법에 맞추어서 공부하면서 만들었기에 코드가 별로 예쁘지는 않지만, 작동은 잘 되는듯 하다.

 

주요 기능

 

바이빗에서 Order History - USDT Perpetual 에서 자신의 거래내역을 Export 해서 나온 CSV 파일을

제목부분을 제외하고 "input Bybit trade data"에 입력하면 라벨기능을 이용해서 차트에 표시해준다.

 

기본적으로 Long 은 초록색, Short은 빨간색이며, 포지션 Open은 원, 포지션 Close는 X 표시로 나타내준다.

 

예시화면.

자신이 진입한 포지션의 크기를 텍스트로 나타내줌.

 

<코드>

//@version=5

indicator("Bybit trade log printer",max_labels_count = 500,overlay = true)
dataInput = input.string("none","input Bybit trade data",tooltip = "Derivatives Tradehistory, csv")

getLcolor = input.color(color.green, "Long order color")
getScolor = input.color(color.red, "Short order color")




type bybitLog
    string tradeDate
    string tradeQty
    string orderType
    string fillPrice
    string direction
    string isFill

//for test
//function If you input data, make label and you can see output example
//
method testprinterBybit(array<bybitLog> msg) =>
    label.new(bar_index, low, text=string(msg.get(0).tradeDate), style=label.style_circle)


method testprinterstr(string msg) =>
    label.new(bar_index, low, text=msg, style=label.style_circle)

method transUnix(string msg) =>
    dateTimeArr = str.split(msg," ")
    dateStr = dateTimeArr.get(0)
    timeStr = dateTimeArr.get(1)

    dateArr = str.split(dateStr,"-")
    tradeYear = int(str.tonumber(dateArr.get(0)))
    tradeMonth = int(str.tonumber(dateArr.get(1)))
    tradeDay = int(str.tonumber(dateArr.get(2)))

    timeArr = str.split(timeStr,":")
    tradeHour = int(str.tonumber(timeArr.get(0)))
    tradeMinute = int(str.tonumber(timeArr.get(1)))
    tradeSecond = int(str.tonumber(timeArr.get(2)))
    
    int notTransTime = timestamp(year=tradeYear,month=tradeMonth,day=tradeDay,hour=tradeHour,minute=tradeMinute,second=tradeSecond)

    notTransTime - (notTransTime % 900000)
  



var dataArray = array.new<bybitLog>()

//splitDataInput cheker

// dataArray is empty
var counter = 0
if counter == 0 // Just one time
    splitDataInput = str.split(dataInput,",")
    for i = 0 to array.size(splitDataInput)-1
        if splitDataInput.get(i) == "BTCUSDT" //tradeDate, tradyQty, orderType, fillPrice, direction, isFill
            newBy = bybitLog.new(splitDataInput.get(i+2),splitDataInput.get(i+3),splitDataInput.get(i+4),splitDataInput.get(i+5),splitDataInput.get(i+10),splitDataInput.get(i+11))
            array.push(dataArray,newBy)
        
        else if splitDataInput.get(i) == " BTCUSDT" //bybit csv have " "
            newBy = bybitLog.new(splitDataInput.get(i+2),splitDataInput.get(i+3),splitDataInput.get(i+4),splitDataInput.get(i+5),splitDataInput.get(i+10),splitDataInput.get(i+11))
            array.push(dataArray,newBy)
    
    for i = 0 to array.size(dataArray)-1
    
        if str.tostring(dataArray.get(i).isFill) == "Filled"
            
            if str.tostring(dataArray.get(i).direction) == "Open Long"
                label.new(x = transUnix(str.tostring(dataArray.get(i).tradeDate)),y = str.tonumber(dataArray.get(i).fillPrice),text=str.tostring(str.tostring(dataArray.get(i).tradeQty)),style=label.style_circle,size=size.tiny,color=getLcolor, xloc = xloc.bar_time)
            else if str.tostring(dataArray.get(i).direction) == "Close Long"
                label.new(x = transUnix(str.tostring(dataArray.get(i).tradeDate)),y = str.tonumber(dataArray.get(i).fillPrice),text=str.tostring(str.tostring(dataArray.get(i).tradeQty)),style=label.style_xcross,size=size.tiny,color=getLcolor, xloc = xloc.bar_time)
            else if str.tostring(dataArray.get(i).direction) == "Open Short"
                label.new(x = transUnix(str.tostring(dataArray.get(i).tradeDate)),y = str.tonumber(dataArray.get(i).fillPrice),text=str.tostring(str.tostring(dataArray.get(i).tradeQty)),style=label.style_circle,size=size.tiny,color=getScolor, xloc = xloc.bar_time)
            else if str.tostring(dataArray.get(i).direction) == "Close Short"
                label.new(x = transUnix(str.tostring(dataArray.get(i).tradeDate)),y = str.tonumber(dataArray.get(i).fillPrice),text=str.tostring(str.tostring(dataArray.get(i).tradeQty)),style=label.style_xcross,size=size.tiny,color=getScolor, xloc = xloc.bar_time)    

        
    
    counter += 1

표시되는 라벨의 크기를 바꾸고 싶다면 size=size.tiny 부분을 수정하면 된다.

 

최대 500개의 매매내역까지만 표시해줄 것 같다. (트뷰 제한상)

참고.

 

 

예시

여기서 csv 파일을 받으면

 

Contracts,Order No.,Order Time(UTC+0).,Filled Qty,Order Type,Filled Price,Order Price,Trigger Price,Create Time,Time In Force,Direction,Status
BTCUSDT,-------,2023-04-20 04:28:12,0.037,Market,28932.70,Market,0.00,2023-04-20 04:28:12,ImmediateOrCancel,Close Long,Filled,
BTCUSDT,-------,2023-04-20 03:58:46,0.038,Market,28834.00,Market,0.00,2023-04-20 03:58:46,ImmediateOrCancel,Close Long,Filled,
BTCUSDT,-------,2023-04-20 02:51:42,0.075,Market,28748.10,Market,0.00,2023-04-20 02:51:42,ImmediateOrCancel,Open Long,Filled,
BTCUSDT,-------,2023-04-20 02:47:01,0.078,Market,28750.00,Market,0.00,2023-04-20 02:47:01,ImmediateOrCancel,Close Long,Filled,
BTCUSDT,-------,2023-04-20 02:38:27,0.078,Market,28837.20,Market,0.00,2023-04-20 02:38:27,ImmediateOrCancel,Open Long,Filled,
BTCUSDT,-------,2023-04-20 02:38:19,0.079,Market,28837.20,Market,0.00,2023-04-20 02:38:19,ImmediateOrCancel,Close Short,Filled,

이런 형식의 파일이 나온다.

 

여기서 제일 첫줄 부분을 제외하고 다음부분을 끝까지 복사해서

 

여기 칸에 붙여넣기 하면 완료.

 

다음 글에서는 만드는 과정에서 배운 내용들을 정리해보겠다.

'날것 그대로의 공부기록 > pinescript' 카테고리의 다른 글

pinescript 기본기  (0) 2023.04.24