资源加载中... loading...

exchange.GetRecords

获取当前设置的交易对、合约代码对应的{@struct/Record Record}结构数组,即K线数据。

exchange.GetRecords()函数请求数据成功时返回{@struct/Record Record}结构数组,请求数据失败时返回空值。 {@struct/Record Record}数组、空值

exchange.GetRecords() exchange.GetRecords(symbol) exchange.GetRecords(symbol, period) exchange.GetRecords(symbol, period, limit) exchange.GetRecords(period) exchange.GetRecords(period, limit)

参数symbol用于指定请求的{@struct/Record Record}数组数据对应的合约代码。不传该参数时默认请求当前设置的合约代码的K线数据。

symbol false string period参数指定请求的K线数据的周期,例如:{@var/PERIOD/PERIOD_M1 PERIOD_M1},{@var/PERIOD/PERIOD_M5 PERIOD_M5},{@var/PERIOD/PERIOD_M15 PERIOD_M15}等。 参数period的值除了可以传定义的标准周期,还可以传入整数数值,单位为秒。 period false number 参数limit用于指定请求的K线数据的长度。

limit false string

function 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))      
}
def main():
    while not exchange.IO("status"):
        Sleep(1000)
    Log(exchange.SetContractType("rb888"))
    
    Log(exchange.GetRecords(60 * 2))
    Log(exchange.GetRecords(PERIOD_M5))
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]);
}

对于exchange.GetRecords(Period)函数来说商品期货的实盘、回测均支持自定义周期,参数Period为秒数。

function 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])
}
def 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])
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线柱数据:

function main() {
    while(!exchange.IO("status")) {
        Sleep(1000)
    }

    var records = exchange.GetRecords("rb888")
    Log("当前K线(最新)", records[records.length - 1])
}
def main():
    while not exchange.IO("status"):
        Sleep(1000)
    
    records = exchange.GetRecords("rb888")
    Log("当前K线(最新)", records[-1])
void main() {
    while(exchange.IO("status") == 0) {
        Sleep(1000);
    }
    
    auto records = exchange.GetRecords("rb888");
    Log("当前K线(最新)", records[records.size() - 1]);
}

指定具体合约代码请求K线数据:

默认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线数据。
股票证券:

  • 富途证券 在K线周期为日线周期以下时,调用GetRecords()函数返回的数据中数组的每个元素为一个K线柱数据(即Record结构体),每个K线柱数据结构的Time属性是该周期的结束时间(毫秒级时间戳)并非起始时间(毫秒级时间戳)。 在K线周期为日线周期时,Record结构体的Time属性是该周期的起始时间(毫秒级时间戳)。

回测系统中模拟级别回测由于需要设置底层K线周期(回测系统模拟级别回测时,根据设置的底层K线周期使用对应的K线数据生成Tick数据), 需要注意在策略中获取的K线数据的周期不能小于底层K线周期。因为在模拟级别回测中,各个周期的K线数据在回测系统中都是通过底层K线周期对应的K线数据合成的。 C++语言中如果需要自己构造K线数据有以下代码范例:

#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);                     
}

{@fun/Market/exchange.GetTicker exchange.GetTicker}, {@fun/Market/exchange.GetDepth exchange.GetDepth}, {@fun/Market/exchange.GetTrades exchange.GetTrades}, {@fun/Market/exchange.SetMaxBarLen exchange.SetMaxBarLen}

exchange.GetTrades exchange.GetPeriod