本教程仅限于实现最基础功能,更详细精进的功能请绕道(ノ≧∀≦)ノ・‥…━━━★ ピキューン!

上一篇教程介绍了如何配置TradingView的图表,这篇教程讲述如何通过UDF实现数据的传输。
UDF接口文档

UDF介绍

Universal Data Feed 通用数据饲料,基于HTTP协议的旨在以简单有效的方式向图表库提供数据。
以上为官方介绍,你只需要根据官方给出的接口文档写一份接口就行了,接口的调用图表自身会去完成。

必须接口

  • GET /config
    返回一个数组对象用于配置图表,详细属性参照文档
public function config()
{
    $config = array(
        'supports_search' => true,
        'supports_group_request' => false,
        'supported_resolutions' => ["1", "5", "15", "30", "60", "1D", "1W"],
        'supports_marks' => false,
        'supports_time' => true,
        "exchanges" => [["value" => "", "name" => "All Exchanges", "desc" => ""]]
    );


    exit(json_encode($config));
}
  • GET /symbols?symbol=<symbol>
    解析某个商品(虚拟币,股票),返回该商品的属性(比如name),返回对象为SymbolInfo
public function symbols()
{
    $input = I('get.');
    $market = strtolower(trim($input['symbol']));

    $data = [];
    if (is_array(C('market')[$market])) {
        $marketData = C('market')[$market];
//            $data['market'] = $marketData;

        $data['description'] = $marketData['title'];
//            $data['exchange-listed'] = '';
//            $data['exchange-traded'] = '';
        $data['has_intraday'] = true;
        $data['has_no_volume'] = false;
        $data['minmov'] = 1;
        $data['minmov2'] = 0;
        // $data['name'] = $marketData['title'];
        $data['name'] = $market;
        $data['pricescale'] = 100;
        $data['session'] = substr(str_replace(':', '', $marketData['begintrade']), 0, 4) . '-' . substr(str_replace(':', '', $marketData['endtrade']), 0, 4) . ':1234567';
        $data['supported_resolutions'] = ["1", "5", "15", "30", "60", "1D", "1W"];
        $data['ticker'] = $market;
        $data['timezone'] = 'Asia/Shanghai';
        $data['type'] = 'stock';
    }

    exit(json_encode($data));
}
  • GET /history?symbol=<ticker_name>&from=<unix_timestamp>&to=<unix_timestamp>&resolution=<resolution>
    最关键的一个接口,通过这个接口获取K线数据,并更新K线数据
    symbol是商品名,fromto是俩时间戳,表示K线的时间段,resolution代表K线刻度
public function history()
{
    $input = I('get.');
    $market = (is_array(C('market')[$input['symbol']]) ? trim($input['symbol']) : C('market_mr'));
    $from = intval($input['from']);
    $to = intval($input['to']);
    $resolution = $input['resolution'];
    $allResolutions = array(
        '1' => 1,
        '5' => 5,
        '15' => 15,
        '30' => 30,
        '60' => 60,
        '1D' => 1440,
        '1W' => 10080,
//            '1M' => 302400,
    );
    $key = $market . $resolution . $from . $to;

    $resolution = key_exists($resolution, $allResolutions) ? $allResolutions[$resolution] : 1;

    $lastUpdateTime = (APP_DEBUG ? null : S('UdfHistoryUpdateTime' . $key));

    if (($lastUpdateTime + 60) < time()) {
        S('UdfHistoryData' . $key, null);
        S('UdfHistoryUpdateTime' . $key, time());
    }

    $tradeJson = (APP_DEBUG ? null : S('UdfHistoryData' . $key));

    if (!$tradeJson) {
        $tradeJson = M('TradeJson')->where(array(
            'market' => $market,
            'type' => $resolution,
            'data' => array('neq', ''),
            'addtime' => array(array('egt', $from), array('elt', $to), 'and'),
        ))->order('id asc')->select();
        S('UdfHistoryData' . $key, $tradeJson);
    }

    $json_data = array();
    foreach ($tradeJson as $k => $v) {
        $json_data[] = json_decode($v['data'], true);
    }

    $data = array(
        's' => 'ok',
        't' => array(),
        'c' => array(),//收盘
        'o' => array(),//开盘
        'h' => array(),//高
        'l' => array(),//低
        'v' => array(),//量
    );

    foreach ($json_data as $k => $v) {
        $data['t'][$k] = $v[0];
        $data['o'][$k] = $v[2];
        $data['c'][$k] = $v[5];
        $data['h'][$k] = $v[3];
        $data['l'][$k] = $v[4];
        $data['v'][$k] = $v[1];
    }

    exit(json_encode($data));
}
  • GET /time
    返回服务器时间
public function time()
{
    echo time();
}

完成以上4个接口就已经可以实现K线图了,如果需要更多的功能,请查询文档,按照需求添加接口。

配置数据源

var datafeed = new Datafeeds.UDFCompatibleDatafeed("https://mydeemo.com");

把url换成自己接口的地址就完成了

下一篇,TradingView简易教程(三) —— JSAPI实现