AllTick
从逐笔数据到蜡烛图
博客

从逐笔数据到蜡烛图

蜡烛图是股票市场和金融交易中广泛使用的一种图表类型,旨在显示特定时间段内的开盘价、最高价、最低价和收盘价等信息。本文介绍

AllTick阅读 5 分钟

蜡烛图是股票市场和金融交易中广泛使用的一种图表类型,旨在显示特定时间段内的开盘价、最高价、最低价和收盘价等信息。本文介绍如何将实时逐笔数据转换为各种时间范围的蜡烛图数据,并提供必要的公式和计算方法,帮助您更好地分析和理解市场趋势。

1. 蜡烛图简介

蜡烛图由一系列连续的矩形柱组成,每个柱表示特定时间间隔内的价格变动。每根蜡烛通常包括四个关键价格点:开盘价(Open)、最高价(High)、最低价(Low)和收盘价(Close)。蜡烛的形状和形态可以帮助分析师和交易者识别市场趋势和价格形态。

2. 实时逐笔数据

实时逐笔数据是指市场中每笔交易的价格和成交量信息。它可以即时反映市场流动性和价格变化。典型的逐笔数据记录包括时间戳、成交价格和成交量等字段。

3. 蜡烛图数据计算方法

时间窗口设置
首先,需要定义蜡烛图的时间范围,例如 1 分钟、15 分钟、1 小时等。这决定了从实时逐笔数据中采样的时间间隔。

蜡烛图数据计算
对于每个时间窗口,根据逐笔数据计算蜡烛图数值:

  • 开盘价:时间窗口内第一笔数据的价格
  • 最高价:时间窗口内的最高价格
  • 最低价:时间窗口内的最低价格
  • 收盘价:时间窗口内最后一个跳动的价格

更新蜡烛图数据
随着时间推移,每个时间窗口都会移动,新的跳动数据也会进入范围。在每个时间窗口结束时,使用新接收的跳动数据更新蜡烛图数据。

其他指标计算
除了 OHLC 值之外,您还可以根据蜡烛图数据计算其他指标,例如交易量和移动平均线。这些指标可以提供更深入的市场洞察。

4示例公式

下面是一个示例,演示如何将实时跳动数据转换为 1分钟蜡烛图数据:

  1. 初始化蜡烛图数据
  • 初始开盘价:第一个跳动的价格
  • 初始最高价:第一个跳动的价格
  • 初始最低价:第一个跳动的价格
  • 初始收盘价:第一个跳动的价格
  1. 更新蜡烛图数据
  • 如果当前跳动的时间戳超出当前时间窗口,则表示该窗口已结束,需要更新蜡烛图数据。
  • 新开盘价:前一时间窗口的收盘价
  • 新最高价:新时间窗口内的最高价
  • 新最低价:新时间窗口内的最低价
  • 新收盘价:当前刻度的价格

这是一个简单示例。在实际应用中,可能需要更详细的数据处理和逻辑,以满足特定需求。

5. Java 代码示例

import java.util.ArrayList;
import java.util.List;

public class KLineGenerator {
public static List<KLineData> generateKLineData(List<TickData> tickDataList, int interval) {
List<KLineData> kLineDataList = new ArrayList<>();
long startTime = tickDataList.get(0).getTime();


long currentKLineStartTime = startTime - (startTime % interval);
double openPrice = tickDataList.get(0).getPrice();
double highPrice = openPrice;
double lowPrice = openPrice;
double closePrice = 0;
long volume = 0;


for (TickData tickData : tickDataList) {
long currentTime = tickData.getTime();
double currentPrice = tickData.getPrice();
long currentVolume = tickData.getVolume();


if (currentTime >= currentKLineStartTime + interval) {
closePrice = tickDataList.get(tickDataList.indexOf(tickData) - 1).getPrice(); // 上一个Tick的价格作为收盘价

KLineData kLineData = new KLineData(currentKLineStartTime, openPrice, highPrice, lowPrice, closePrice, volume);
kLineDataList.add(kLineData);


currentKLineStartTime += interval;
openPrice = currentPrice;
highPrice = currentPrice;
lowPrice = currentPrice;
volume = currentVolume;
} else {

highPrice = Math.max(highPrice, currentPrice);
lowPrice = Math.min(lowPrice, currentPrice);
volume += currentVolume;
}
}


closePrice = tickDataList.get(tickDataList.size() - 1).getPrice();


KLineData lastKLineData = new KLineData(currentKLineStartTime, openPrice, highPrice, lowPrice, closePrice, volume);
kLineDataList.add(lastKLineData);

return kLineDataList;
}
}


class TickData {
private long time;
private double price;
private long volume;

public TickData(long time, double price, long volume) {
this.time = time;
this.price = price;
this.volume = volume;
}

public long getTime() {
return time;
}

public double getPrice() {
return price;
}

public long getVolume() {
return volume;
}
}


class KLineData {
private long time;
private double open;
private double high;
private double low;
private double close;
private long volume;

public KLineData(long time, double open, double high, double low, double close, long volume) {
this.time = time;
this.open = open;
this.high = high;
this.low = low;
this.close = close;
this.volume = volume;
}


}

6. Python 代码示例

from datetime import datetime, timedelta

class TickData:
def __init__(self, time, price, volume):
self.time = time
self.price = price
self.volume = volume

class KLineData:
def __init__(self, time, open_price, high_price, low_price, close_price, volume):
self.time = time
self.open_price = open_price
self.high_price = high_price
self.low_price = low_price
self.close_price = close_price
self.volume = volume

def generate_kline_data(tick_data_list, interval):
kline_data_list = []
start_time = tick_data_list[0].time
current_kline_start_time = start_time - (start_time % interval)
open_price = tick_data_list[0].price
high_price = open_price
low_price = open_price
close_price = 0
volume = 0

for tick_data in tick_data_list:
current_time = tick_data.time
current_price = tick_data.price
current_volume = tick_data.volume

if current_time >= current_kline_start_time + interval:
close_price = tick_data_list[tick_data_list.index(tick_data) - 1].price
kline_data = KLineData(current_kline_start_time, open_price, high_price, low_price, close_price, volume)
kline_data_list.append(kline_data)

current_kline_start_time += interval
open_price = current_price
high_price = current_price
low_price = current_price
volume = current_volume
else:
high_price = max(high_price, current_price)
low_price = min(low_price, current_price)
volume += current_volume

close_price = tick_data_list[-1].price
last_kline_data = KLineData(current_kline_start_time, open_price, high_price, low_price, close_price, volume)
kline_data_list.append(last_kline_data)

return kline_data_list

立即开始接入市场数据

几秒内生成免费 API 密钥,通过一个端点连接所有市场。