美文网首页
K线图TradingView自定义DataFeed小例子

K线图TradingView自定义DataFeed小例子

作者: 小明_2009 | 来源:发表于2019-02-27 10:57 被阅读0次

效果展示

1.官方申请源码。

https://cn.tradingview.com/HTML5-stock-forex-bitcoin-charting-library/

2.自定义datafeed.js,数据采用了ajax请求后台接口(交易所websocket接口国内无法访问)。

var detafeed_historyTime = 0

var detafeed_lastResolution = null

var detafeed_lastSymbol = null

var t_init = null

function FeedBase() {}

FeedBase.prototype.onReady = function(callback) {

  callback(this._configuration)

}

FeedBase.prototype.getSendSymbolName = function(symbolName) {

  var name = symbolName.split('/')

  return (name[0] + name[1]).toLocaleUpperCase()

}

FeedBase.prototype.resolveSymbol = function(symbolName, onResolve, onError) {

  onResolve({

    'name': symbolName,

    'timezone': 'Asia/Shanghai',

    'pricescale': 100,

    'minmov': 1,

    'minmov2': 0,

    'ticker': symbolName,

    'description': '',

    'session': '24x7',

    'type': 'bitcoin',

    'volume_precision': 10,

    'has_intraday': true,

    'intraday_multipliers': ['3', '5', '15', '60', '240', '1D'],

    'has_weekly_and_monthly': false,

    'has_no_volume': false,

    'regular_session': '24x7'

  })

}

FeedBase.prototype.getApiTime = function(resolution) {

  switch (resolution) {

    case '3':

      return '3m'

    case '5':

      return '5m'

    case '15':

      return '15m'

    case '60':

      return '1h'

    case '240':

      return '4h'

    case '1D':

      return '1d'

    default:

      return '15m'

  }

}

FeedBase.prototype.getBars = function(symbolInfo, resolution, rangeStartDate, rangeEndDate, onResult, onError) {

  if (!detafeed_historyTime || (resolution !== detafeed_lastResolution) || detafeed_lastSymbol !== symbolInfo.name) {

    // 储存请求过的产品

    detafeed_lastSymbol = symbolInfo.name

    // 记录目前时间搓,就用目前的目前时间搓往前请求历史数据

    detafeed_historyTime = Date.now()

  }

  clearInterval(t_init)

  const e_time = Number((Date.now() + '').substr(0, 9) + '0000')

  const r_data = {

    interval: this.getApiTime(resolution),

    symbol: this.getSendSymbolName(symbolInfo.name),

    startTime: '',

    limit: 500,

    endTime: e_time

  }

  $.ajax({

    type: 'POST',

    url: 'http://atoken-api.netmi.com.cn/wallet/bian/kline',

    contentType: 'application/json; charset=utf-8',

    data: JSON.stringify(r_data),

    dataType: 'json',

    success: function(data) {

      if (data.data.list && Array.isArray(data.data.list)) {

        // 记录这次请求的时间周期

        const k_list = data.data.list

        detafeed_lastResolution = resolution

        var meta = { noData: false }

        var bars = []

        if (k_list.length) {

          console.log(1)

          localStorage.setItem('k_open', Number(k_list[k_list.length - 1].open).toFixed(2))

          localStorage.setItem('k_high', Number(k_list[k_list.length - 1].high).toFixed(2))

          localStorage.setItem('k_low', Number(k_list[k_list.length - 1].low).toFixed(2))

          localStorage.setItem('k_close', Number(k_list[k_list.length - 1].close).toFixed(2))

          localStorage.setItem('k_volume', Number(k_list[k_list.length - 1].baseVolume).toFixed(2))

          detafeed_historyTime = e_time

          for (var i = 0; i < k_list.length; i += 1) {

            bars.push({

              time: k_list[i].openTime,

              close: k_list[i].close,

              open: k_list[i].open,

              high: k_list[i].high,

              low: k_list[i].low,

              volume: k_list[i].baseVolume

            })

          }

        } else {

          meta = { noData: true }

        }

        onResult(bars, meta)

      }

    },

    error: function(message) {

      console.log(message)

    }

  })

}

FeedBase.prototype.subscribeBars = function(symbolInfo, resolution, onTick, listenerGuid, onResetCacheNeededCallback) {

  const self = this

  t_init = setInterval(function() {

    const e_time = Number((Date.now() + '').substr(0, 9) + '0000')

    const r_data = {

      interval: self.getApiTime(resolution),

      symbol: self.getSendSymbolName(symbolInfo.name),

      startTime: detafeed_historyTime,

      limit: 200,

      endTime: e_time

    }

    $.ajax({

      type: 'POST',

      url: 'http://atoken-api.netmi.com.cn/wallet/bian/kline',

      contentType: 'application/json; charset=utf-8',

      data: JSON.stringify(r_data),

      dataType: 'json',

      success: function(data) {

        if (data.data.list && Array.isArray(data.data.list)) {

          const k_list = data.data.list

          if (k_list.length) {

            localStorage.setItem('k_open', Number(k_list[k_list.length - 1].open).toFixed(2))

            localStorage.setItem('k_high', Number(k_list[k_list.length - 1].high).toFixed(2))

            localStorage.setItem('k_low', Number(k_list[k_list.length - 1].low).toFixed(2))

            localStorage.setItem('k_close', Number(k_list[k_list.length - 1].close).toFixed(2))

            localStorage.setItem('k_volume', Number(k_list[k_list.length - 1].baseVolume).toFixed(2))

            detafeed_historyTime = e_time

            for (var i = 0; i < k_list.length; i += 1) {

              onTick({

                time: k_list[i].openTime,

                close: k_list[i].close,

                open: k_list[i].open,

                high: k_list[i].high,

                low: k_list[i].low,

                volume: k_list[i].baseVolume

              })

            }

          }

        }

      },

      error: function(message) {

        console.log(message)

      }

    })

  }, 6000)

}

FeedBase.prototype.unsubscribeBars = function(listenerGuid) {

  // 取消订阅产品的callback

}

相关文章

网友评论

      本文标题:K线图TradingView自定义DataFeed小例子

      本文链接:https://www.haomeiwen.com/subject/hijxuqtx.html