바이빗에서 선물트레이딩을 하다보면 바이낸스와 다르게 차트에 바로 표시가 안되어서 불편함을 느끼던 도중
직접 만들어보기로 하였다.
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 |
|---|