结构体
Trade
市场成交记录的数据结构。
属性
| 名称 | 类型 | 描述 |
Id | string | 市场成交记录的唯一标识符。 |
Time | number | 成交时间的毫秒级时间戳。 |
Price | number | 成交价格。 |
Amount | number | 成交数量。 |
Type | number | 订单类型,请参考 |
参考
备注
exchange.GetTrades()函数返回Trade数组或空数组。
Ticker
市场行情(Tick数据)的数据结构。
属性
| 名称 | 类型 | 描述 |
Info | object | 交易所接口返回的原始数据,回测时无此属性。 |
Symbol | string | 合约代码。 |
High | number | 最高价。 |
Low | number | 最低价。 |
Sell | number | 当前时刻的卖一价。 |
Buy | number | 当前时刻的买一价。 |
Last | number | 最新成交价。 |
Open | number | 当前交易日的开盘价。 |
Volume | number | 成交量。 |
Time | number | 毫秒级时间戳。 |
OpenInterest | number | 持仓量。 |
参考
备注
exchange.GetTicker()函数返回一个Ticker结构。
Record
K线柱的数据结构,采用标准OHLC格式,用于绘制K线图和技术指标计算分析。
属性
| 名称 | 类型 | 描述 |
Time | number | 毫秒级时间戳,表示该K线柱周期的起始时间。 |
Open | number | 开盘价。 |
High | number | 最高价。 |
Low | number | 最低价。 |
Close | number | 收盘价。 |
OpenInterest | number | 持仓量。 |
Volume | number | 成交量。 |
参考
备注
exchange.GetRecords()函数返回Record数组或空数组。每个Record结构代表一根K线柱。
对于Python语言,不同版本的pandas包处理方式可能有所差异,例如:
python
pandas.DataFrame(records) // 可能需要调整为:pandas.DataFrame(list(records))
相关报错信息:in getattr KeyError: 'dtype'。
Order
订单的数据结构。
属性
| 名称 | 类型 | 描述 |
Info | object | 交易所接口返回的原始数据,回测时无此属性。 |
Symbol | string | 合约代码。 |
Id | string | 订单ID。 |
Price | number | 下单价格。 |
Amount | number | 下单数量。 |
DealAmount | number | 已成交数量。 |
AvgPrice | number | 成交均价。 |
Status | number | 订单状态,参考 |
Type | number | 订单类型,参考 |
Offset | number | 合约订单的开平仓方向,参考 |
ContractType | string | 合约订单中该属性为具体的合约代码。 |
Time | number | 订单创建时间,毫秒级时间戳。 |
参考
备注
Order订单结构可由exchange.GetOrder()、exchange.GetOrders()函数返回。exchange.GetOrders()函数返回的是Order结构数组或空数组,如果当前没有未完成的订单,则返回[]即空数组。Order订单结构的Status属性可以直接与ORDER_STATE_PENDING等常量进行比较,判断是否相等从而确定订单状态。
商品期货CTP协议/易盛协议中Order结构字段AvgPrice数据由成交回报计算得出。一旦策略实盘停止,成交回报数据将会丢失,之后无法计算出该字段数据,该字段值将为0。如果策略一直处于运行状态,订单Order结构字段AvgPrice会正常显示。
OrderBook
市场深度中的订单簿结构。
属性
| 名称 | 类型 | 描述 |
Price | number | 订单价格。 |
Amount | number | 订单数量。 |
参考
备注
exchange.GetDepth()函数返回的数据结构中,Bids、Asks属性值为OrderBook数组。
Depth
市场深度数据结构。
属性
| 名称 | 类型 | 描述 |
Info | object | 交易所接口返回的原始数据,回测时无此属性。 |
Asks | array | 卖单数组,即OrderBook数组,按价格从低到高排序,数组中第一个OrderBook结构的Price最低。 |
Bids | array | 买单数组,即OrderBook数组,按价格从高到低排序,数组中第一个OrderBook结构的Price最高。 |
Time | number | 毫秒级时间戳。 |
参考
备注
exchange.GetDepth()函数返回一个Depth结构。
Account
账户信息的数据结构。
属性
| 名称 | 类型 | 描述 |
Info | object | 交易所接口返回的原始数据,回测时无此属性。 |
Balance | number | 账户可用资产余额。 |
FrozenBalance | number | 未成交订单冻结的资产数值。 |
Equity | number | 账户权益,包含可用资产余额、持仓保证金、持仓盈亏等。 |
UPnL | number | 所有持仓的未实现盈亏。 |
参考
备注
exchange.GetAccount()函数返回Account结构体。
Position
合约仓位信息的数据结构。
属性
| 名称 | 类型 | 描述 |
Info | object | 交易所接口返回的原始数据,回测时不包含此属性。 |
Symbol | string | 合约代码。 |
MarginLevel | number | 持仓杠杆大小,商品期货无法修改杠杆值。 |
Amount | number | 持仓量。 |
FrozenAmount | number | 仓位冻结量,即平仓订单未成交时临时冻结的仓位数量。 |
Price | number | 持仓均价。 |
Profit | number | 股票不支持此字段,商品期货显示盯市盈亏。 |
Type | number | 仓位类型,参考 |
ContractType | string | 合约代码或股票代码,具体请参考 |
Margin | number | 仓位占用的保证金。 |
参考
备注
exchange.GetPositions()函数返回Position数组或空数组。
Market
交易品种市场信息的数据结构
属性
| 名称 | 类型 | 描述 |
Symbol | string | 合约代码、股票代码或交易品种代码。 |
BaseAsset | string | 基础资产标识,商品期货固定为:FUTURES。 |
QuoteAsset | string | 交易所的计价货币代码,商品期货为:CNY。 |
TickSize | number | 最小价格变动单位,即价格的最小变动量。 |
AmountSize | number | 下单数量的最小变动单位。 |
PricePrecision | number | 订单价格的小数位精度。 |
AmountPrecision | number | 订单数量的小数位精度。 |
MinQty | number | 订单的最小下单数量。 |
MaxQty | number | 订单的最大下单数量。 |
MinNotional | number | 订单的最小成交金额。 |
MaxNotional | number | 订单的最大成交金额。 |
CtVal | number | 合约乘数。 |
CtValCcy | string | 合约价值的计价货币,商品期货固定为:FUTURES。 |
Info | object | 协议返回的原始数据信息,回测时不包含此字段。 |
参考
备注
exchange.GetMarkets()函数返回包含此Market结构的字典。
OtherStruct
HttpQuery-options
该JSON结构用于配置HttpQuery函数、HttpQuery_Go函数发送HTTP请求的各项参数。
属性
| 名称 | 类型 | 描述 |
method | string | 请求方法,例如: |
body | string | 请求体。例如在POST请求中,body可以包含表单数据、JSON、文本等。 |
charset | string | 字符集编码。例如指定文本数据在body中的编码方式为: |
cookie | string | Cookie是一种用于在客户端(通常是浏览器)和服务器之间存储和交换状态信息的小型数据片段。 |
debug | bool | 设置为true时,此次HttpQuery函数调用返回完整的响应报文。设置为false时仅返回响应报文Body中的数据。 |
headers | JSON | 请求头信息,以键值对的形式存在(JSON结构),用于传递各种信息,如内容类型、认证信息、缓存控制等。 |
timeout | number | 超时设置,设置1000表示1秒超时。 |
参考
备注
使用示例:
javascript
function main() {
var options = {
method: "POST",
body: "a=10&b=20&c=30",
charset: "UTF-8",
cookie: "session_id=12345; lang=en",
debug: false,
headers: {"TEST-HTTP-QUERY": "123"},
timeout: 1000
}
var ret = HttpQuery("http://127.0.0.1:8080", options)
Log(ret)
}
以上代码执行时发出的HTTP报文:
log
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Cookie: session_id=12345; lang=en
Host: 127.0.0.1:8080
Test-Http-Query: 123
Transfer-Encoding: chunked
User-Agent: Mozilla/5.0 (Macintosh; ...
Accept-Encoding: gzip, deflate, br
e
a=10&b=20&c=30
0
HttpQuery-return
该JSON结构为HttpQuery函数调用时,在参数options结构中将debug字段设置为true后,HttpQuery函数在调试模式下返回的数据结构。
属性
| 名称 | 类型 | 描述 |
StatusCode | number | HTTP状态码 |
Header | JSON | 请求头信息 |
Cookies | array | Cookie信息 |
Trace | JSON | 请求的完整路径信息 |
Length | number | 响应报文长度 |
Body | string | 响应报文内容 |
参考
备注
返回的JSON数据结构示例:
json
{
"StatusCode": 302,
"Header": {
"Content-Type": ["text/html"],
// ...
},
"Cookies": [{
// ...
}],
"Trace": {},
"Length": 154,
"Body": "..."
}
LogStatus-table
该JSON结构用于配置策略状态栏中显示的表格内容。
属性
| 名称 | 类型 | 描述 |
type | string | 用于设置要解析显示的UI控件类型,对于状态栏表格,固定设置为: |
title | string | 用于设置状态栏表格的标题。 |
cols | array | 用于设置状态栏表格的列标题,数组的第一个元素为第一列的标题,依此类推。 |
rows | array | 用于设置状态栏表格的行数据。该rows数组为二维数组,其第一个元素也是数组结构,该数组结构的长度应与表格列数一致(数组中的元素与表格列名一一对应),即表格的第一行数据。 |
参考
备注
javascript
function main() {
var tbl = {
type: "table",
title: "标题",
cols: ["列1", "列2", "列3"],
rows: [
["行1列1", "行1列2", "行1列3"],
["行2列1", "行2列2", "行2列3"],
["行3列1", "行3列2", "行3列3"],
]
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
LogStatus-btnTypeOne
该JSON结构用于配置状态栏中的按钮控件,按钮控件JSON结构可以嵌入到状态栏表格JSON结构中。此结构为旧版本结构,平台目前仍然兼容,建议使用最新版本的按钮JSON结构。
状态栏按钮控件构造示例(按钮触发点击后,弹框中包含单个输入控件,通过input字段构造):
json
{
"type": "button",
"cmd": "open",
"name": "开仓",
"input": {
"name": "开仓数量",
"type": "number",
"defValue": 1
}
}
状态栏按钮控件点击触发后的弹框中的控件通过input或group字段设置。
属性
| 名称 | 类型 | 描述 |
type | string | 对于按钮控件,固定设置为: |
class | string | 按钮类型设置。 |
name | string | 按钮控件上显示的文本,即按钮名称。 |
cmd | string | 按钮控件触发点击操作时,发送给策略的交互命令内容。 |
description | string | 按钮控件的描述信息。当鼠标悬停在状态栏中该按钮上时显示此描述信息。 |
disabled | bool | 设置按钮为禁用(true)或启用(false)。 |
input | JSON | 在构造状态栏按钮进行交互时支持输入数据,交互指令最终由
上述JSON结构中各字段描述:
对于下拉框类型控件的扩展字段:
|
group | array |
|
参考
备注
状态栏中按钮JSON结构的class属性取值示例:
javascript
function main() {
var table = {
type: "table",
title: "状态栏按钮样式",
cols: ["默认", "原始", "成功", "信息", "警告", "危险"],
rows: [
[
{"type":"button", "class": "btn btn-xs btn-default", "name": "默认"},
{"type":"button", "class": "btn btn-xs btn-primary", "name": "原始"},
{"type":"button", "class": "btn btn-xs btn-success", "name": "成功"},
{"type":"button", "class": "btn btn-xs btn-info", "name": "信息"},
{"type":"button", "class": "btn btn-xs btn-warning", "name": "告警"},
{"type":"button", "class": "btn btn-xs btn-danger", "name": "危险"}
]
]
}
LogStatus("`" + JSON.stringify(table) + "`")
}
group字段与input字段使用示例:
javascript
function main() {
// 状态栏按钮控件(通过设置input字段实现)testBtn1按钮触发的页面中的下拉框控件使用options字段设置选项,使用defValue字段设置默认选项。与本章其他示例中直接使用defValue设置选项的方式不同。
var testBtn1 = {
type: "button",
name: "testBtn1",
cmd: "cmdTestBtn1",
input: {name: "testBtn1ComboBox", type: "selected", options: ["A", "B"], defValue: 1}
}
/*
状态栏按钮控件(通过设置input字段实现)testBtn2按钮触发的页面中的下拉框控件使用options字段设置选项,options字段中的选项不仅支持字符串,
还支持使用```{text: "描述", value: "值"}```结构。使用defValue字段设置默认选项,默认选项可以是多选(通过数组结构实现多选)。多选需要将额外的字段multiple设置为真值(true)。
*/
var testBtn2 = {
type: "button",
name: "testBtn2",
cmd: "cmdTestBtn2",
input: {
name: "testBtn2MultiComboBox",
type: "selected",
description: "实现下拉框多选",
options: [{text: "选项A", value: "A"}, {text: "选项B", value: "B"}, {text: "选项C", value: "C"}],
defValue: ["A", "C"],
multiple: true
}
}
// 状态栏分组按钮控件(通过设置group字段实现)testBtn3按钮触发的页面中的下拉框控件使用options字段设置选项,也支持直接使用defValue设置选项。
var testBtn3 = {
type: "button",
name: "testBtn3",
cmd: "cmdTestBtn3",
group: [
{name: "comboBox1", label: "labelComboBox1", description: "下拉框1", type: "selected", defValue: 1, options: ["A", "B"]},
{name: "comboBox2", label: "labelComboBox2", description: "下拉框2", type: "selected", defValue: "A|B"},
{name: "comboBox3", label: "labelComboBox3", description: "下拉框3", type: "selected", defValue: [0, 2], multiple: true, options: ["A", "B", "C"]},
{
name: "comboBox4",
label: "labelComboBox4",
description: "下拉框4",
type: "selected",
defValue: ["A", "C"],
multiple: true,
options: [{text: "选项A", value: "A"}, {text: "选项B", value: "B"}, {text: "选项C", value: "C"}, {text: "选项D", value: "D"}]
}
]
}
while (true) {
LogStatus("`" + JSON.stringify(testBtn1) + "`\n", "`" + JSON.stringify(testBtn2) + "`\n", "`" + JSON.stringify(testBtn3) + "`\n")
var cmd = GetCommand()
if (cmd) {
Log(cmd)
}
Sleep(5000)
}
}
LogStatus-btnTypeTwo
该JSON结构用于配置状态栏中的按钮控件,按钮控件JSON结构可以嵌入到状态栏表格JSON结构中。这是目前最新版本的按钮JSON结构。
状态栏按钮控件构造示例(按钮触发点击后,弹出框中包含多个输入控件,通过group字段构造):
json
{
"type": "button",
"cmd": "open",
"name": "开仓下单",
"group": [{
"type": "selected",
"name": "tradeType",
"label": "下单类型",
"description": "市价单、限价单",
"default": 0,
"group": "交易设置",
"settings": {
"options": ["市价单", "限价单"],
"required": true,
}
}, {
"type": "selected",
"name": "direction",
"label": "交易方向",
"description": "买入、卖出",
"default": "buy",
"group": "交易设置",
"settings": {
"render": "segment",
"required": true,
"options": [{"name": "买入", "value": "buy"}, {"name": "卖出", "value": "sell"}],
}
}, {
"type": "number",
"name": "price",
"label": "价格",
"description": "订单的价格",
"group": "交易设置",
"filter": "tradeType==1",
"settings": {
"required": true,
}
}, {
"type": "number",
"name": "amount",
"label": "下单量",
"description": "订单的下单量",
"group": "交易设置",
"settings": {
"required": true,
}
}],
}
状态栏按钮控件点击触发后弹出框中的控件通过input或group字段进行设置。
属性
| 名称 | 类型 | 描述 |
type | string | 对于按钮控件,固定设置为: |
name | string | 按钮控件上显示的文本,即按钮名称。 |
cmd | string | 按钮控件被点击时,发送给策略的交互命令内容。 |
input | JSON | 在构造状态栏按钮进行交互时支持输入数据配置,交互指令最终由
以上JSON结构中各字段的描述和说明:
|
group | array |
|
参考
备注
支持双语设置:
json
{
type:'selected',
name:'test',
label:'选项|options',
description:'描述|description',
default:0, // 此处default默认值设置为0,表示{name:'xxx|yyy',value:0}选项中的value值
filter:'a>1&&a<10',
group:'分组|group',
settings:{
multiple:true,
customizable:true,
options:[{name:'xxx|yyy',value:0}]
}
}
Chart-options
此JSON用于配置自定义绘图函数Chart()的图表设置信息,图表库采用Highcharts。此处仅列出几个基本配置字段。
属性
| 名称 | 类型 | 描述 |
__isStock | string | 平台扩展字段。设置为true时,使用Highstocks图表;设置为false时,使用Highcharts图表。 |
extension | JSON |
|
title | string | 图表标题 |
xAxis | JSON | X轴配置。 |
yAxis | JSON | Y轴配置。 |
series | JSON | 图表数据系列。 |
参考
备注
简单的绘图示例:
javascript
// 在JavaScript语言中,chart是一个对象。在使用Chart函数之前,需要先声明一个用于配置图表的对象变量chart
var chart = {
// 该字段标记图表是否为股票图表,可以尝试改为false运行查看效果
__isStock: true,
// 缩放工具
tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
// 标题
title : { text : '差价分析图'},
// 选择范围
rangeSelector: {
buttons: [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
selected: 0,
inputEnabled: false
},
// 坐标轴横轴(X轴),当前设置的类型为时间
xAxis: { type: 'datetime'},
// 坐标轴纵轴(Y轴),默认数值随数据大小自动调整
yAxis : {
// 标题
title: {text: '差价'},
// 是否启用右侧纵轴
opposite: false
},
// 数据系列,该属性保存各个数据系列(线、K线图、标签等)
series : [
// 索引为0,data数组内存储该索引系列的数据
{name : "line1", id : "线1,buy1Price", data : []},
// 索引为1,设置了dashStyle:'shortdash',即设置为虚线
{name : "line2", id : "线2,lastPrice", dashStyle : 'shortdash', data : []}
]
}
function main(){
// 调用Chart函数,初始化图表
var ObjChart = Chart(chart)
// 清空图表
ObjChart.reset()
while(true){
// 获取本次轮询的时间戳(毫秒级时间戳),用于确定写入图表X轴的位置
var nowTime = new Date().getTime()
// 获取行情数据
var ticker = _C(exchange.GetTicker)
// 从行情数据的返回值中获取买一价
var buy1Price = ticker.Buy
// 获取最后成交价,为避免两条线重合,加1处理
var lastPrice = ticker.Last + 1
// 使用时间戳作为X值,买一价作为Y值,传入索引0的数据序列
ObjChart.add(0, [nowTime, buy1Price])
// 同上
ObjChart.add(1, [nowTime, lastPrice])
Sleep(2000)
}
}
KLineChart-options
该JSON用于配置自定义绘图函数KLineChart的图表参数。此处仅列出几个基本配置字段。
属性
| 名称 | 类型 | 描述 |
overlay | bool | 是否叠加在主图上。 |
xAxis | JSON | X轴配置参数。 |
yAxis | JSON | Y轴配置参数。 |
candle | JSON | K线图配置参数。 |
参考
备注
SetData-data
该JSON用于设置exchange.SetData()函数所要加载的数据。该JSON数据为数组结构,其中每个元素也是一个数组,即[time, data]。
属性
| 名称 | 类型 | 描述 |
time | number | 数据的时间戳,标记该条数据(data)的时间。 |
data | string / number / bool / object / array 等。 | data是 |
参考
备注
回测系统中加载数据,策略回测运行时获取数据的示例:
javascript
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/
function main() {
exchange.SetData("test", [[1579536000000, _D(1579536000000)], [1579622400000, _D(1579622400000)], [1579708800000, _D(1579708800000)]])
while(true) {
Log(exchange.GetData("test"))
Sleep(1000 * 60 * 60 * 24)
}
}
EventLoop-return
该JSON是EventLoop()函数返回的数据结构。EventLoop()函数监听以下事件:1、任意WebSocket的可读数据事件;2、HttpQuery_Go()函数并发任务的完成事件;3、JavaScript语言策略中通过threading.Thread()函数创建的线程发送的消息事件。
属性
| 名称 | 类型 | 描述 |
Seq | number | 事件序列号。 |
Event | string | 事件名称。 |
ThreadId | number | 事件线程ID。 |
Index | number | 事件索引。 |
Nano | number | 纳秒时间戳。 |
参考
备注
在JavaScript语言策略中,当并发执行的线程(通过threading.Thread()函数创建)使用线程对象的postMessage()函数发送消息时,接收消息的线程中EventLoop()函数会监听到以下事件数据结构:
json
{
"Seq":4,
"Event":"thread",
"ThreadId":1,
"Index":0,
"Nano":1727592066508674000
}
DBExec-return
该JSON是DBExec()函数返回的数据结构;使用Dial()函数创建的对象的exec()方法执行SQL语句时,也会返回该JSON数据结构。
属性
| 名称 | 类型 | 描述 |
columns | array | 查询数据的列名,为字符串数组。 |
values | array | 查询的具体数据,其中每条数据与列名一一对应。values字段的值是一个二维数组,其中每个元素为一个数组,代表一条数据记录。 |
参考
备注
查询数据库中的数据示例:
json
{
"columns":["TS","HIGH","OPEN","LOW","CLOSE","VOLUME"],
"values":[
[1518970320000,100,99.1,90,100,12345.6],
[1518960320000,100,99.1,90,100,12345.6]
]
}
Thread.join-return
该JSON是Thread对象的成员函数join()返回的数据结构,保存了JavaScript语言策略中并发线程的相关信息。Thread对象指线程对象,通过threading.Thread()方法创建。
属性
| 名称 | 类型 | 描述 |
id | number | 线程ID。 |
terminated | bool | 线程是否被强制终止。 |
elapsed | number | 线程的运行时间(纳秒)。 |
ret | number | 线程函数的返回值。 |
参考
备注
以下代码测试Thread对象的join()函数的超时机制,并打印输出join()函数的返回值。
javascript
function testFunc() {
for (var i = 0; i < 5; i++) {
Log(i)
Sleep(300)
}
}
function main() {
var t1 = threading.Thread(testFunc)
Log(t1.join(1000)) // undefined
Log(t1.join()) // {"id":1,"terminated":false,"elapsed":1506864000}
}