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

OtherStruct

HttpQuery-options

该JSON结构用于配置HttpQuery函数、HttpQuery_Go函数发送Http请求的各项参数。

请求方法,例如:GETPOST等。 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}

HttpQuery-return

该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}

LogStatus-table

该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}

LogStatus-btnTypeOne

该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结构中各字段描述:

  • name 状态栏按钮触发点击操作后,弹出的弹框中控件的标题。
  • description 状态栏按钮触发点击操作后,弹出的弹框中控件的描述信息。
  • type 状态栏按钮触发点击操作后,弹出的弹框中控件的类型。type字段可取值如下所示: 1、"number":数值输入控件。 2、"string":字符串输入控件。 3、"selected":下拉框控件。 4、"boolean":开关控件。
  • defValue 状态栏按钮触发点击操作后,弹出的弹框中控件的默认值。 如果是下拉框类型控件(selected),defValue字段用于设置下拉框选项,例如:"input": {"name": "开仓数量", "type": "selected", "defValue": "A|B|C"},下拉框选项的文本描述被设置为A、B、C。

对于下拉框类型控件扩展的字段:

  • options 状态栏按钮控件触发的页面中下拉框控件,可以使用options字段设置选项。options字段中的选项不仅支持字符串,也支持使用{text: "描述", value: "值"}结构。使用defValue字段设置默认选项,默认选项可以是多选。
  • multiple 该字段设置为true时,支持下拉框多选。

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}

LogStatus-btnTypeTwo

该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}

Chart-options

该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}

KLineChart-options

该JSON用于设置自定义画图函数KLineChart的图表配置信息。这里只列出几个基本的配置字段。

是否画在主图。 overlay bool X轴配置。 xAxis JSON Y轴配置。 yAxis JSON 蜡烛图配置。 candle JSON

参看使用KLineChart函数画图的专题文章

{@fun/Log/KLineChart KLineChart}

SetData-data

该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}

EventLoop-return

该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}

DBExec-return

该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}

Thread.join-return

该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 内置变量