exchange.GetRecords
获取当前设置的交易对、合约代码对应的Record结构数组,即K线数据。
exchange.GetRecords()
exchange.GetRecords(symbol)
exchange.GetRecords(symbol, period)
exchange.GetRecords(symbol, period, limit)
exchange.GetRecords(period)
exchange.GetRecords(period, limit)示例
-
对于exchange.GetRecords(Period)函数,商品期货的实盘和回测均支持自定义周期,参数Period的单位为秒。
javascriptfunction main() { // 鉴于测试代码,不使用商品期货策略一般架构,这里仅仅判断exchange.IO("status")函数,判断连接期货公司前置机成功后立即执行测试代码。股票证券无需使用exchange.IO("status")判断连接状态 while(!exchange.IO("status")) { Sleep(1000) } Log(exchange.SetContractType("rb888")) // 打印K线周期为120秒(2分钟)的K线数据 Log(exchange.GetRecords(60 * 2)) // 打印K线周期为5分钟的K线数据 Log(exchange.GetRecords(PERIOD_M5)) }pythondef main(): while not exchange.IO("status"): Sleep(1000) Log(exchange.SetContractType("rb888")) Log(exchange.GetRecords(60 * 2)) Log(exchange.GetRecords(PERIOD_M5))c++void main() { while(exchange.IO("status") == 0) { Sleep(1000); } Log(exchange.SetContractType("rb888")); Log(exchange.GetRecords(60 * 2)[0]); Log(exchange.GetRecords(PERIOD_M5)[0]); } -
输出K线柱数据:
javascriptfunction main(){ // 鉴于测试代码,不使用商品期货策略一般架构,这里仅仅判断exchange.IO("status")函数,判断连接期货公司前置机成功后立即执行测试代码。股票证券无需使用exchange.IO("status")判断连接状态 while(!exchange.IO("status")) { Sleep(1000) } Log(exchange.SetContractType("rb888")) var records = exchange.GetRecords(PERIOD_H1) Log("第一根K线数据为,Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High) Log("第二根K线数据为,Time:", records[1].Time ,"Close:", records[1].Close) Log("当前K线(最新)", records[records.length-1], "上一根K线", records[records.length-2]) }pythondef main(): while not exchange.IO("status"): Sleep(1000) Log(exchange.SetContractType("rb888")) records = exchange.GetRecords(PERIOD_H1) Log("第一根K线数据为,Time:", records[0]["Time"], "Open:", records[0]["Open"], "High:", records[0]["High"]) Log("第二根K线数据为,Time:", records[1]["Time"], "Close:", records[1]["Close"]) Log("当前K线(最新)", records[-1], "上一根K线", records[-2])c++void main() { while(exchange.IO("status") == 0) { Sleep(1000); } Log(exchange.SetContractType("rb888")); auto records = exchange.GetRecords(PERIOD_H1); Log("第一根K线数据为,Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High); Log("第二根K线数据为,Time:", records[1].Time, "Close:", records[1].Close); Log("当前K线(最新)", records[records.size() - 1], "上一根K线", records[records.size() - 2]); } -
指定具体合约代码请求K线数据:
javascriptfunction main() { while(!exchange.IO("status")) { Sleep(1000) } var records = exchange.GetRecords("rb888") Log("当前K线(最新)", records[records.length - 1]) }pythondef main(): while not exchange.IO("status"): Sleep(1000) records = exchange.GetRecords("rb888") Log("当前K线(最新)", records[-1])c++void main() { while(exchange.IO("status") == 0) { Sleep(1000); } auto records = exchange.GetRecords("rb888"); Log("当前K线(最新)", records[records.size() - 1]); }
返回值
| 类型 | 描述 |
|
|
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 否 | 参数 |
period | number | 否 | 参数 |
limit | string | 否 | 参数 |
参考
备注
默认K线周期可在回测、实盘页面进行设置。如果在调用exchange.GetRecords()函数时指定了参数,则获取该参数周期对应的K线数据;如果函数调用时未指定参数,则按照回测、实盘参数中设置的K线周期返回对应的K线数据。
返回值为Record结构数组,返回的K线数据会随时间累积。累积K线柱数量的上限受exchange.SetMaxBarLen()函数设置的影响,未设置时默认上限为5000根K线柱。当K线数据达到K线柱累积上限后,每新增一根K线柱的同时会删除一根最早时间的K线柱(类似队列的先进先出机制)。
初始调用GetRecords函数时获取的K线柱数量:
- 回测系统会预先获取回测周期起始时刻前1000根K线柱,作为初始K线数据。
参数period设置为5,表示请求获取以5秒为周期的K线数据。
如果period参数不能被60整除(即代表的周期无法以分钟为单位),系统底层将使用Tick数据合成所需的K线数据。
如果period参数能被60整除,则最小使用1分钟K线数据(尽可能使用较大周期的数据)来合成所需的K线数据。
股票证券:
- 富途证券
当K线周期为日线以下周期时,调用GetRecords()函数返回的数据数组中,每个元素为一个K线柱数据(即Record结构体),每个K线柱数据结构的Time属性是该周期的结束时间(毫秒级时间戳),而非起始时间(毫秒级时间戳)。
当K线周期为日线周期时,Record结构体的Time属性是该周期的起始时间(毫秒级时间戳)。
在回测系统的模拟级别回测中,由于需要设置底层K线周期(回测系统在模拟级别回测时,会根据设置的底层K线周期使用对应的K线数据生成Tick数据),需要注意策略中获取的K线数据周期不能小于底层K线周期。因为在模拟级别回测中,各个周期的K线数据都是通过底层K线周期对应的K线数据合成的。
C++语言中如果需要自行构造K线数据,可参考以下代码示例:
c++
#include <sstream>
void main() {
Records r;
r.Valid = true;
for (auto i = 0; i < 10; i++) {
Record ele;
ele.Time = i * 100000;
ele.High = i * 10000;
ele.Low = i * 1000;
ele.Close = i * 100;
ele.Open = i * 10;
ele.Volume = i * 1;
r.push_back(ele);
}
// 输出显示:Records[10]
Log(r);
auto ma = TA.MA(r,10);
// 输出显示:[nan,nan,nan,nan,nan,nan,nan,nan,nan,450]
Log(ma);
}