输入/搜索内容
入门
欢迎使用发明者量化交易平台
快速开始
密钥安全性
平台基础
账号与计费
实盘计费与充值
子账号
交易所
通用协议
本地凭据文件
交易所特殊说明
证券与期货
加密货币
托管者
策略库
实盘
编写策略
开发工具
回测系统
进阶专题
数据与研究
对外接口

JavaScript、Python、Rust、My语言策略可以设计交互控件,策略的交互控件用来在策略实盘运行时给运行的策略程序发送交互指令。对于JavaScript、Python、Rust语言类型的策略,在策略代码中使用 GetCommand 函数获取交互控件产生的消息。交互控件的「组件配置」与策略参数相同,见 组件配置。

交互控件

在策略中设计好处理交互控件消息的代码,在实盘时使用交互控件可以实现(不限于)诸如以下功能:

  • 手动平掉策略持仓。
  • 动态修改策略参数,避免重启策略实盘。
  • 切换策略逻辑。
  • 触发打印某些调试信息、数据,用来测试某些功能。

变量(命名举例)描述类型默认值(说明)组件配置(说明)备注
cmdNum交互控件cmdNum的描述数字型(number)默认值选填,可留空用于设置当前交互项绑定的界面控件的:组件类型、最小值、最大值、分组等交互控件cmdNum的备注
cmdBool交互控件cmdBool的描述布尔型(true/false)默认值必选,开启或关闭同上交互控件cmdBool的备注
cmdStr交互控件cmdStr的描述字符串(string)默认值选填,可留空同上交互控件cmdStr的备注
cmdCombox交互控件cmdCombox的描述下拉框(selected)默认值选填,可留空同上交互控件cmdCombox的备注
cmdBtn交互控件cmdBtn的描述按钮(button)按钮控件不绑定输入项同上交互控件cmdBtn的备注

交互控件触发后发送给策略的消息(字符串):

  • 数字型
    在交互控件cmdNum的输入框中输入交互数据:123后,点击交互控件cmdNum的按钮。策略程序中的GetCommand()函数会收到消息:cmdNum:123。
  • 布尔型
    在交互控件cmdBool的开关控件上设置为打开,点击交互控件cmdBool的按钮。策略程序中的GetCommand()函数会收到消息:cmdBool:true。
  • 字符串
    在交互控件cmdStr的输入框中输入交互数据:abc后,点击交互控件cmdStr的按钮。策略程序中的GetCommand()函数会收到消息:cmdStr:abc。
  • 下拉框
    在交互控件cmdCombox的下拉框中选中第二个选项后,点击交互控件cmdCombox的按钮。策略程序中的GetCommand()函数会收到消息:cmdCombox:1,1表示选中的选项的索引,第一个选项索引为0,第二个选项索引为1。
  • 按钮
    点击交互控件cmdBtn的按钮。策略程序中的GetCommand()函数会收到消息:cmdBtn。

交互控件的「组件配置」与策略参数相同,见 组件配置。

示例:用交互控件动态修改策略参数

在策略编辑页面的「策略交互」中添加一个字符串类型的交互控件,变量名为changeSymbol。交互控件的设置界面:

设置交互控件

实盘运行时,在该控件的输入框中填入ETH_USDT并点击按钮,GetCommand()会收到消息changeSymbol:ETH_USDT。策略检测到这条消息后更新对应的变量(策略界面上的参数也是全局变量,这里用代码中的全局变量演示):

javascript
// 策略参数 var symbol = "BTC_USDT" function main() { while (true) { var cmd = GetCommand() if (cmd) { var arr = cmd.split(":") if (arr.length == 2 && arr[0] == "changeSymbol") { // 检测到 changeSymbol 控件触发,就会执行参数更新操作 Log("Changed symbol parameter to:", arr[1]) symbol = arr[1] } } LogStatus(_D(), ", Current symbol parameter value:", symbol) Sleep(3000) } }

除了在「策略交互」栏中设计交互控件,还可以在策略状态栏中设计交互控件。目前支持的交互控件种类仅有按钮类型,见 LogStatus。

状态栏中的按钮控件可以分为:

  • 普通按钮控件
    数据结构举例为:

    json
    {"type": "button", "name": "Button 1", "cmd": "button1", "description": "This is the first button"}
  • 带一个输入数据的按钮控件
    使用input属性设置输入控件选项,数据结构举例为:

    json
    {"type": "button", "name": "Button 2", "cmd": "button2", "description": "This is the second button", "input": {"name": "Open Quantity", "type": "number", "defValue": 1}}
    json
    { "type": "button", "cmd": "test1", "name": "test1", "input": { "type": "selected", "name": "selected", "label": "Dropdown", "description": "description", "default": 100, "settings": { "multiple": true, "customizable": true, "options":[{"name": "A", "value": 100}, {"name": "B", "value": 200}] } } }
  • 带一组输入数据的按钮控件
    使用group属性设置一组输入控件的选项,数据结构举例为:

    json
    { "type": "button", "cmd": "open", "name": "Open", "group": [ {"name": "orderType", "description": "下单方式|order type", "type": "selected", "defValue": "市价单|挂单"}, {"name": "tradePrice@orderType==1", "description": "交易价格|trade price", "type": "number", "defValue": 100}, {"name": "orderAmount", "description": "委托数量|order amount", "type": "string", "defValue": 100}, {"name": "boolean", "description": "是/否|boolean", "type": "boolean", "defValue": true} ] }
    json
    { "type": "button", "cmd": "test2", "name": "test2", "group": [{ "type": "selected", "name": "selected", "label": "Dropdown", "description": "description", "default": 200, "group": "group1", "settings": { "multiple": true, "options":[{"name": "A", "value": 100}, {"name": "B", "value": 200}] } }, { "type": "string", "name": "string", "label": "Input Box", "description": "description", "default": "ABC", "group": "group1" }] }

将这些按钮控件JSON数据编码为JSON字符串,然后使用`字符包裹住,在状态栏输出。以JavaScript语言为例:

javascript
function main() { var btn = {"type": "button", "name": "Button 1", "cmd": "button1", "description": "This is the first button"} LogStatus("`" + JSON.stringify(btn) + "`") }

这些按钮控件也可以写入状态栏表格中,详细例子见 LogStatus。

input字段结构与group字段中单个控件结构一致,以下为详细说明(带注释的 JavaScript 对象):

javascript
{ "type": "selected", // 控件类型(必要字段),支持设置为:number, string, selected, boolean "name": "test", // 名称(group中使用时,为必要字段) "label": "topic", // 标题(必要字段) "description": "desc", // 组件的提示 "default": 1, // 默认值;当前JSON结构中如果不设置settings字段,兼容defValue,可以用defValue代替default "filter": "a>1", // 选择器,不设置该字段表示不过滤(显示控件);设置该字段时,当表达式为真时不过滤(显示控件)。当表达式为假时过滤(不显示控件) // 对于选择器,以当前例子中表达式a>1为例,a指的是type=button的结构中group字段下name为a的控件值,根据此数值判断是否过滤 "group": "group1", // 分组 "settings": {} // 组件配置,各字段见下文 }

组件配置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时有效,表示选择器的选项数据格式:["Option 1", "Option 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时,目前只有默认复选框。

支持双语设置,例如:'选项|options'文本内容会根据当前语言环境适配;以group字段中单个控件为例,完整的例子(JavaScript 对象):

javascript
{ 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}] } }