该JSON结构用于配置HttpQuery函数、HttpQuery_Go函数发送Http请求的各项参数。
请求方法,例如:GET
、POST
等。
method
string
请求体。例如在POST请求中,body可以包含表单数据、JSON、文本等。
body
string
字符集编码。例如指定文本数据在body中的编码方式为:"UTF-8"
。
charset
string
cookie是一种用于在客户端(通常是浏览器)和服务器之间存储和交换状态信息的小片数据。
cookie
string
用来模拟浏览器tls指纹。
profile
string
设置为true时,此次HttpQuery函数调用返回完整的应答报文。设置为false时只返回应答报文Body中的数据。
debug
bool
请求头信息,以键值对的形式存在(JSON结构),用于传递各种信息,如内容类型、认证信息、缓存控制等。
headers
JSON
超时设置,设置1000表示1秒钟超时。
timeout
number
使用范例:
function main() {
var options = {
method: "POST",
body: "a=10&b=20&c=30",
charset: "UTF-8",
cookie: "session_id=12345; lang=en",
profile: "chrome_103",
debug: false,
headers: {"TEST-HTTP-QUERY": "123"},
timeout: 1000
}
var ret = HttpQuery("http://127.0.0.1:8080", options)
Log(ret)
}
以上代码执行时发出的http报文:
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
{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}
该JSON结构为HttpQuery函数调用时,参数options
结构中指定debug字段为true时HttpQuery函数调试模式返回的数据结构。
http状态码 StatusCode number 请求头信息。 Header JSON Cookies信息。 Cookies array 请求的完整路径信息。 Trace JSON 报文长度 Length number 报文内容。 Body string
返回的JSON数据结构举例:
{
"StatusCode": 302,
"Header": {
"Content-Type": ["text/html"],
// ...
},
"Cookies": [{
// ...
}],
"Trace": {},
"Length": 154,
"Body": "..."
}
{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}
该JSON结构用于配置策略状态栏显示的表格内容。
用于设置所要解析显示的UI、控件的类型,对于状态栏表格来说固定设置为:table
。
type
string
用于设置状态栏表格的标题。
title
string
用于设置状态栏表格的列标题,数组的第一个元素为第一列的标题,以此类推。
cols
array
用于设置状态栏表格的行数据,该rows数组(二维数组)的第一个元素亦为数组结构,这个数组结构长度应当与表格列数一致(该数组结构中的元素与表格列名一一对应)即表格中的第一行数据。
rows
array
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) + "`")
}
{@fun/Log/LogStatus LogStatus}
该JSON结构用于配置状态栏中的按钮控件,按钮控件JSON结构可以嵌入到状态栏表格JSON结构中。该结构为旧版本结构,平台目前仍然兼容,建议使用最新版本的按钮JSON结构。 状态栏按钮控件构造范例(按钮触发点击之后,弹框中包含单个输入控件,通过input字段构造):
{
"type": "button",
"cmd": "open",
"name": "开仓",
"input": {
"name": "开仓数量",
"type": "number",
"defValue": 1
}
}
状态栏按钮控件点击触发后的弹框中的控件通过input
或者group
设置。
对于按钮控件来说固定设置为:button
。
type
string
按钮类型设置
class
string
按钮控件上的文本,即按钮名称。
name
string
按钮控件触发点击操作时,发送给策略的交互命令内容。
cmd
string
按钮控件的描述信息,在状态栏中鼠标放在该按钮上时显示的描述信息。
description
string
设置按钮为禁用(true) / 启用(false)。
disabled
bool
在构造状态栏按钮进行交互时也支持输入数据,交互指令最终由GetCommand()
函数捕获。给状态栏中的按钮控件的JSON数据结构中增加input
项用于配置按钮触发时显示的弹框中的输入控件。
例如设置input
字段值为:
{
"name": "开仓数量",
"type": "number",
"defValue": 1,
"description": "test",
}
上述JSON结构中各字段描述:
"number"
:数值输入控件。
2、"string"
:字符串输入控件。
3、"selected"
:下拉框控件。
4、"boolean"
:开关控件。"input": {"name": "开仓数量", "type": "selected", "defValue": "A|B|C"}
,下拉框选项的文本描述被设置为A、B、C。对于下拉框类型控件扩展的字段:
{text: "描述", value: "值"}
结构。使用defValue字段设置默认选项,默认选项可以是多选。input
JSON
input
字段配置状态栏按钮触发点击后弹出的弹框中的一个控件,group
区别于input
之处是配置一组控件,group
中的元素与input
字段值的数据结构一致,参考input
字段相关描述说明。
group array
状态栏中按钮JSON结构的class
取值范例:
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
字段使用范例:
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)
}
}
{@fun/Log/LogStatus LogStatus}
该JSON结构用于配置状态栏中的按钮控件,按钮控件JSON结构可以嵌入到状态栏表格JSON结构中。目前最新版本的按钮JSON结构。 状态栏按钮控件构造范例(按钮触发点击之后,弹框中包含多个输入控件,通过group字段构造):
{
"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
设置。
对于按钮控件来说固定设置为:button
。
type
string
按钮控件上的文本,即按钮名称。
name
string
按钮控件触发点击操作时,发送给策略的交互命令内容。
cmd
string
在构造状态栏按钮进行交互时也支持输入数据,交互指令最终由GetCommand()
函数捕获。给状态栏中的按钮控件的JSON数据结构中增加input
项用于配置按钮触发时显示的弹框中的输入控件。
相对于旧版本的input结构,新版本有一些新增字段、改动:
{
"type": "selected",
"name": "test",
"label": "topic",
"description": "desc",
"default": 1,
"filter": "a>1",
"group": "group1",
"settings": { ... }, // 组件配置
}
以上JSON结构中各字段描述、说明:
type
控件类型(必要字段),支持设置为:"number"
数值输入框, "string"
字符串输入框, "selected"
下拉框, "boolean"
开关控件。
name 如果当前JSON结构是input字段的字段值,当没有设置label字段时,name为状态栏按钮点击触发后弹出的弹框中的控件标题。 如果当前JSON结构是group字段的字段值(数组结构)中的一个元素,name不作为控件标题使用,name字段用于表示控件输入内容的字段名。例如节选的一段group字段作为说明:
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"}]
}
]
}
根据这个片段可知,如果状态栏按钮触发交互,会弹出一个弹框,其中有4个控件,均为下拉框控件。设置好各个控件的选项,点击确定发送交互消息后,策略中的GetCommand函数就会收到cmdTestBtn3:{"comboBox1":1,"comboBox2":0,"comboBox3":[0,2],"comboBox4":["A","C"]}
。
JSON结构中name的值都作为返回交互信息的字段名,例如:comboBox1、comboBox2等。
label 用于设置控件的标题。
description 控件的描述信息。如果当前JSON结构是group字段的字段值(数组结构)中的一个元素,当没有设置label字段时,description为状态栏按钮点击触发后弹出的弹框中的控件标题。
default 控件的默认值。
filter 选择器,用来隐藏控件。不设置该字段表示不过滤(显示控件);设置该字段时,当表达式为真时不过滤(显示控件)。当表达式为假时过滤(不显示控件)
group 用来控制控件分组,可折叠。
settings 组件配置,控件有多种UI可以选择,用此选项可以进行具体设置。例如:
settings:{
multiple:true,
customizable:true,
options:[{name:'xxx|yyy',value:0}]
}
settings相关设置: settings.required:是否必选。 settings.disabled:是否禁用。 settings.min:type=number时有效,表示最小值或字符串最小长度。 settings.max:type=number时有效,表示最大值或字符串最大长度。 settings.step:type=number,render=slider时有效,表示步长。 settings.multiple:type=selected时有效,表示支持多选。 settings.customizable:type=selected时有效,表示支持自定义;用户可以直接在下拉框控件中编辑添加新选项,如果选中新编辑的选项,在触发交互时使用该选项的名称而不是选项代表的值。 settings.options:type=selected时有效,表示选择器的选项数据格式:[“选项1”,“选项2”]、[{‘name’:‘xxx’,‘value’:0}, {‘name’:‘xxx’,‘value’:1}]。 settings.render:渲染组件类型。 type=number时,settings.render不设置(默认数字输入框),可选:slider(滑动条)、date(时间选择器返回时间戳)。 type=string时,settings.render不设置(默认单行输入框),可选:textarea(多行输入)、date(时间选择器返回yyyy-MM-dd hh:mm:ss)、color(颜色选择器返回#FF00FF)。 type=selected时,settings.render不设置(默认下拉框),可选:segment(分段选择器)。 type=boolean时,目前只有默认复选框。
input
JSON
input
字段配置状态栏按钮触发点击后弹出的弹框中的一个控件,group
区别于input
之处是配置一组控件,group
中的元素与input
字段值的数据结构一致,参考以上input
字段相关描述说明。
group array
支持双语设置:
{
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}]
}
}
{@fun/Log/LogStatus LogStatus}
该JSON用于设置自定义画图函数Chart()
的图表配置信息,图表库使用的是Highcharts。这里只列出几个基本的配置字段。
平台扩展字段。设置为true,使用的是Highstocks图表;设置为false,使用的是Highcharts图表。
__isStock string
{
layout: 'single', // 不参于分组,单独显示, 默认为分组 'group'
height: 300, // 指定高度
}
extension JSON 图表标题 title string X轴配置。 xAxis JSON Y轴配置。 yAxis JSON 图表数据系列。 series JSON
简单的画图例子:
// 这个chart在JavaScript语言中是对象,在使用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
// 取得最后成交价,为了2条线不重合在一起,我们加1
var lastPrice = ticker.Last + 1
// 用时间戳作为X值,买一价作为Y值传入索引0的数据序列
ObjChart.add(0, [nowTime, buy1Price])
// 同上
ObjChart.add(1, [nowTime, lastPrice])
Sleep(2000)
}
}
{@fun/Log/Chart Chart}
该JSON用于设置自定义画图函数KLineChart
的图表配置信息。这里只列出几个基本的配置字段。
是否画在主图。 overlay bool X轴配置。 xAxis JSON Y轴配置。 yAxis JSON 蜡烛图配置。 candle JSON
{@fun/Log/KLineChart KLineChart}
该JSON用于设置exchange.SetData()
函数所要加载的数据,该JSON数据是一个数组结构,其中每个元素也是一个数组即[time, data]
。
数据的时间戳,标记这条数据(data)的时间。
time
number
data是exchange.SetData()
函数加载的数据中某个时间对应的一条数据内容。策略运行时,exchange.GetData()
函数根据当前时间取到对应时间戳的数据。
data string, number, bool, object, array 等。
回测系统中加载数据,策略回测运行时取出数据的例子:
/*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)
}
}
{@fun SetData}, {@fun GetData}
该JSON是EventLoop()
函数返回的数据结构,EventLoop()
函数监听:1、任意WebSocket可读数据事件;2、HttpQuery_Go()函数并发的任务完成事件。3、JavaScript语言策略中threading.Thread()
函数创建的线程中发送的消息事件。
事件序列号。 Seq number 事件名称。 Event string 事件线程Id。 ThreadId number 事件索引。 Index number nano时间戳。 Nano number
JavaScript语言的策略中并发执行的线程中(由threading.Thread()
函数创建)使用线程对象的postMessage()
函数发送消息时,接收消息的线程中EventLoop()
函数会监听到以下事件数据结构:
{
"Seq":4,
"Event":"thread",
"ThreadId":1,
"Index":0,
"Nano":1727592066508674000
}
{@fun/Global/EventLoop EventLoop}
该JSON是DBExec()
函数返回的数据结构;使用Dial()
函数创建的对象的exec()
方法执行SQL语句时,也返回该JSON数据结构。
查询的数据的列名,字符串数组。 columns array 查询的具体数据,其中每条数据与列名对应。values字段的值是一个二维数组,其中每个元素为一个数组,是一条数据记录。 values array
查询数据库中的数据举例:
{
"columns":["TS","HIGH","OPEN","LOW","CLOSE","VOLUME"],
"values":[
[1518970320000,100,99.1,90,100,12345.6],
[1518960320000,100,99.1,90,100,12345.6]
]
}
{@fun/Global/DBExec DBExec}, {@fun/Global/Dial Dial}
该JSON是Thread
对象的成员函数join()
返回的数据结构,保存JavaScript
语言策略中并发线程的一些信息,Thread
对象指的是线程对象,通过threading.Thread()
方式创建。
线程Id。 id number 线程是否被强制结束。 terminated bool 线程的运行时间(纳秒)。 elapsed number 线程函数的返回值。 ret number
以下代码测试Thread
对象的join()
函数的超时机制,并打印输出join()
函数的返回值。
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}
}
{@fun/Threads/Thread/join join}
Market 内置变量