You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pine脚本导入CSV多交易对历史交易数据并在图表评估?

把多交易对CSV交易记录导入Pine脚本并可视化评估的方案

Pine脚本本身无法直接读取本地CSV,得先把数据转成它能识别的格式,以下是实操步骤:

一、预处理CSV数据

先对CSV做精简和格式转换:

  • 保留核心字段:时间(转成UTC时区的Unix时间戳/YYYY-MM-DD HH:MM:SS格式)、交易对、类型(买入/卖出)、价格、数量。
  • 按交易对分组:TradingView单图表默认只显示一个交易对的数据,要么给每个交易对单独做图表,要么后续在脚本里跨对拉取数据。

二、两种导入方式

1. 硬编码到脚本(适合小数据量)

把CSV里的交易逐条转成Pine的数组/结构体,直接写进脚本:

//@version=5
indicator("自定义交易记录可视化", overlay=true)

// 定义交易结构体
struct Trade
    int timestamp
    string pair
    string type
    float price
    float quantity
end

// 初始化交易数组
var array<Trade> trades = array.new<Trade>()

// 从CSV转来的交易数据(替换成你的实际数据)
array.push(trades, Trade.new(1690000000, "BTCUSDT", "买入", 30000, 0.01))
array.push(trades, Trade.new(1690100000, "BTCUSDT", "卖出", 31000, 0.01))
array.push(trades, Trade.new(1690200000, "ETHUSDT", "买入", 1800, 0.1))

// 匹配当前图表的交易对
currentPair = syminfo.tickerid

// 遍历交易,标记信号
for i = 0 to array.size(trades) - 1
    trade = array.get(trades, i)
    if trade.pair == currentPair and time == timestamp(trade.timestamp)
        // 画买入信号
        if trade.type == "买入"
            plotshape(series=true, title="买入", location=location.belowbar, color=color.green, style=shape.labelup, text="买入\n价:" + str.tostring(trade.price) + "\n量:" + str.tostring(trade.quantity))
        // 画卖出信号
        else if trade.type == "卖出"
            plotshape(series=true, title="卖出", location=location.abovebar, color=color.red, style=shape.labeldown, text="卖出\n价:" + str.tostring(trade.price) + "\n量:" + str.tostring(trade.quantity))

2. 用TradingView自定义数据导入(适合大数据量)

  • 把CSV转成TradingView支持的格式:第一列必须是UTC时间(格式YYYY-MM-DD HH:MM:SS),后续列可设为交易对、类型、价格、数量。
  • 导入路径:TradingView顶部导航 → 数据 → 导入自定义数据,按提示上传CSV并配置字段映射。
  • 在脚本里调用自定义数据:
//@version=5
indicator("导入的交易记录可视化", overlay=true)

// 引用自定义数据系列(替换成你导入的数据集名称和对应字段)
tradePair = request.security("MyTrades", timeframe.period, close[0]) // 对应交易对字段
tradeType = request.security("MyTrades", timeframe.period, open[0]) // 对应类型字段
tradePrice = request.security("MyTrades", timeframe.period, high[0]) // 对应价格字段

// 匹配当前交易对并标记信号
if tradePair == syminfo.tickerid
    if tradeType == "买入"
        plotshape(series=true, location=location.belowbar, color=color.green, style=shape.arrowup)
    else if tradeType == "卖出"
        plotshape(series=true, location=location.abovebar, color=color.red, style=shape.arrowdown)

三、交易评估可视化

  1. 单交易对盈亏计算:在脚本里跟踪持仓状态,每次卖出时计算盈亏,用label显示在对应K线:
var float positionQty = 0.0
var float avgEntryPrice = 0.0

for i = 0 to array.size(trades) - 1
    trade = array.get(trades, i)
    if trade.pair == currentPair and time == timestamp(trade.timestamp)
        if trade.type == "买入"
            positionQty := positionQty + trade.quantity
            avgEntryPrice := (avgEntryPrice * (positionQty - trade.quantity) + trade.price * trade.quantity) / positionQty
        else if trade.type == "卖出"
            profit = (trade.price - avgEntryPrice) * trade.quantity
            label.new(bar_index, high, str.tostring(profit) + " USDT", color=profit>0?color.green:color.red)
            positionQty := positionQty - trade.quantity
  1. 多交易对整体收益曲线:把所有交易的盈亏转换成基准货币(比如USDT),累加后用plot()画出资金曲线:
var float totalEquity = 10000.0 // 初始资金

for i = 0 to array.size(trades) - 1
    trade = array.get(trades, i)
    if trade.type == "卖出"
        // 假设买入用USDT,卖出换回USDT计算盈亏
        profit = (trade.price - avgEntryPrice) * trade.quantity
        totalEquity := totalEquity + profit

plot(totalEquity, title="总资金曲线", color=color.blue)

注意事项

  • 时间戳必须是UTC时区,否则会和图表时间轴不匹配。
  • 跨交易对展示时,用request.security()拉取其他交易对数据,但要注意脚本性能,避免过多请求。
  • 自定义数据导入时,确保字段映射正确,TradingView会自动识别时间列。

内容的提问来源于stack exchange,提问作者gudé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:16:11