Type/to search
8
Follow
1370
Followers
전략 상태 표시줄에 대화형 버튼 기능 구축
Tutorials
Created 2017-06-13 15:24:05  Updated 2024-09-10 14:06:33
 22
 4266

전략 상태 표시줄에 대화형 버튼 기능 구축

  • API 문서에서 설명

    javascript
    // 也可以构造一个按钮在表格中, 策略用GetCommand接收cmd属性的内容 var table = { type: 'table', title: '持仓操作', cols: ['列1', '列2', 'Action'], rows: [ ['abc', 'def', {'type':'button', 'cmd': 'coverAll', 'name': '平仓'}], ] }; LogStatus('`' + JSON.stringify(table) + '`') // 或者构造一单独的按钮 LogStatus('`' + JSON.stringify({'type':'button', 'cmd': 'coverAll', 'name': '平仓'}) + '`') // 可以自定义按钮风格(bootstrap的按钮属性) LogStatus('`' + JSON.stringify({'type':'button', 'class': 'btn btn-xs btn-danger', 'cmd': 'coverAll', 'name': '平仓'}) + '`')

    API 문서는 정책 상태 <unk>에서 표시되는 테이블, 문자열, 그림, 도표 등의 내용을 API 함수를 호출하여 볼 수 있습니다.LogStatus이 모든 것이 실현되었습니다.
    우리는 JSON 데이터를 구성하여 대화형 버튼을 설정할 수 있습니다.

  • DEMO 출처:

    javascript
    function test1(p) { Log("调用自定义函数,参数:", p); return p; } function main() { while (true) { var table = { type: 'table', title: '持仓操作', cols: ['列1', '列2', 'Action'], rows: [ ['a', '1', { 'type': 'button', // 显示按钮 必须要 把 type 设置为 button 类型 'cmd': "CoverAll", // 字符串,发送的 数据,由GetCommand()函数接受。 'name': '平仓' // 按钮上显示的名字 }], ['b', '1', { 'type': 'button', 'cmd': 10, // 数值 'name': '发送数值' }], ['c', '1', { 'type': 'button', 'cmd': _D(), // 函数 策略运行 期间会一直调用 'name': '调用函数' }], ['d', '1', { 'type': 'button', 'cmd': 'JScode:test1("ceshi")', // 字符串, 用于执行的 JS 代码。 'name': '发送JS代码' }] ] }; LogStatus('`' + JSON.stringify(table) + '`') var str_cmd = GetCommand(); if (str_cmd) { Log("接收到的交互数据 str_cmd:", "类型:", typeof(str_cmd), "值:", str_cmd); } if (str_cmd && str_cmd.split(':', 2)[0] == "JScode") { // 判断是否有消息 var js = str_cmd.split(':', 2)[1]; // 分割 返回的消息 字符串, 限制返回2个, 把索引为1的 元素 赋值给 名为js 的变量 Log("执行调试代码:", js); // 输出 执行的代码 try { // 异常检测 eval(js); // 执行 eval函数, 该函数执行传入的参数(代码)。 } catch (e) { // 抛出异常 Log("Exception", e); // 输出错误信息 } } Sleep(500); } }

    이 전략은 다음과 같습니다.

    img

    우리는 상태 탭에 있는 탭 안에 있는 버튼을 누르면 상호작용이 시작됩니다. 우리는 탭을 누르면 평준화 저장고 탭을 누르고, 탭을 누르면 숫자를 보내기 탭을 누릅니다.

    이 버튼을 누르면 메세지가 정상적으로 전송됩니다.

    img

    > 但是点击 “发送数值” 的时候就不行了,原因是[ ```'cmd': 10, // 数值``` ]这里是 10 。不能发送数值类型。 [/upload/asset/2d8e0f86599f1b82da792544b7b840bc824d4a96.png](/upload/asset/2d8e0f86599f1b82da792544b7b840bc824d4a96.png) # 已经优化 兼容了 数值,返回的 为数值形式的 字符串。

    다음으로 함수 호출 버튼을 누르면 함수 호출을 테스트합니다._D () 함수,_D ((() 함수는 계속적으로 현재 시간 문자열을 반환한다. 따라서 여기서 함수 호출을 쓰면 계속적으로 호출된다.

    img

    이 자료는 다음과 같은 내용을 담고 있습니다:

    img

    마지막으로, JS 코드를 보내기 버튼을 누르면 우리 코드에 있는 테스트용 사용자 정의 함수를 실행할 수 있습니다.

    function test1(p) { Log("调用自定义函数,参数:", p); return p; }

    버튼을 누르면:

    img

    이 함수는 test1에서 실행된 함수입니다Log("调用自定义函数,参数:", p);문장:

  • 코드에 삽입합니다.'class': 'btn btn-xs btn-danger',스타일은 버튼의 모양을 바꿀 수 있습니다.

    img

    img

"이봐, 이봐, 이봐.

Related Recommendations
Comment
All comments (16)

    终于让我找到了。。。。。原来按钮是在这学习。。。。

    4 years ago

    这个是个比较老的帖子了。。

    4 years ago

    但是真心好用。

    4 years ago

    嘿嘿,感谢支持。

    4 years ago

    JScode:test1("ceshi")
    这种是另开一个线程执行的吗?是否影响main主循环

    6 years ago

    列2的数值,能不能做成输入类型?

    7 years ago

    暂时 状态栏的 控件类型只有一种 ,按钮。

    7 years ago

    实际测试结果和教程中的结果有出入。所有发送的数据都被解析为了 string,因此:

    1. 发送数值按钮是可以发送数值 10 的。
    2. 调用函数按钮触发的时候,_D() 函数已经被解析了,提示框询问的是“确定要向机器人发送命令 2018-03-16 16:40:50 ?”,而且只被执行一次,并不像教程中说的会不停返回。

    但是,如果我使用别的函数,如:'cmd': Log(exchange.GetAccount()),,机器人启动后即使没有按下按钮,也会不停返回数据。如果是 'cmd': exchange.GetAccount(),,触发按钮的时候提示是的“确定要向机器人发送命令 [object Object] ?”,GetCommand() 也无法获得具体返回的值。

    所以,能否详细解释下 BotVS 对交互按钮中 cmd 属性的处理逻辑?

    8 years ago

    第2点 您可能 理解错了, 我说的 不停调用是 指: 在整个程序 运行期间, 每次这个 _D() 都会 返回一个新的时间,用作这个 按钮的 命令。 并不是说 卡在这个 位置 一直调用_D()。您第一次 点击 调用函数按钮触发 提示框: 2018-03-16 16:40:50 , 下次 再点击的时候 显示 就是 另外一个时间了。 其实 就是 _D()每次策略循环 都在被调用。
    我的代码 你测试下, 会不停输出,亲测。

    var a = 0 function test1(p) { Log("调用自定义函数,参数:", p); return p; } function main() { while (true) { var table = { type: 'table', title: '持仓操作', cols: ['列1', '列2', 'Action'], rows: [ ['a', '1', { 'type': 'button', // 显示按钮 必须要 把 type 设置为 button 类型 'cmd': "CoverAll", // 字符串,发送的 数据,由GetCommand()函数接受。 'name': '平仓' // 按钮上显示的名字 }], ['b', '1', { 'type': 'button', 'cmd': 10, // 数值 'name': '发送数值' }], ['c', '1', { 'type': 'button', 'cmd': test1(a++), // 函数 策略运行 期间会一直调用 'name': '调用函数' }], ['d', '1', { 'type': 'button', 'cmd': 'JScode:test1("ceshi")', // 字符串, 用于执行的 JS 代码。 'name': '发送JS代码' }] ] }; LogStatus('`' + JSON.stringify(table) + '`') var str_cmd = GetCommand(); if (str_cmd) { Log("接收到的交互数据 str_cmd:", "类型:", typeof(str_cmd), "值:", str_cmd); } if (str_cmd && str_cmd.split(':', 2)[0] == "JScode") { // 判断是否有消息 var js = str_cmd.split(':', 2)[1]; // 分割 返回的消息 字符串, 限制返回2个, 把索引为1的 元素 赋值给 名为js 的变量 Log("执行调试代码:", js); // 输出 执行的代码 try { // 异常检测 eval(js); // 执行 eval函数, 该函数执行传入的参数(代码)。 } catch (e) { // 抛出异常 Log("Exception", e); // 输出错误信息 } } Sleep(500); } }

    第一个问题 : 数值 类型 现在兼容了,这个也亲测,我修改下文档。
    感谢提出建议 ^^

    8 years ago

    想通了,'cmd': _D() 本身是没有输出的,'cmd': Log(_D()) 才会一直不停输出。但是,既然是希望通过按钮来触发的,为什么 cmd 中的函数会一直在被调用呢?这样的设计似乎不妥吧?

    8 years ago

    所以 才有 第四 个 按钮 : 发送JS代码, 这个就是 按下了 才去执行 对应的函数 或者 JS 代码。而不是 不停执行。

    8 years ago

    不好意思,有点迷糊了。您代码中的 test1(a++) 是会不停输出,也正如我前面说的,即便我没有按下那个按钮,机器人一启动就在那儿输出了。可为什么如果换成_D() 就不会有输出,而必须通过按钮才能触发?

    8 years ago

    小小梦,除了可以在状态栏当中添加表格和按钮,其他的表单控件怎么添加,比如文本框

    8 years ago

    哦 目前暂时 只实现了 状态栏表格里 添加 按钮控件, 其他控件 还没有支持 ^^ 。

    8 years ago

    666 这个事件更丰富了

    9 years ago

    666 这个事件更丰富了

    9 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)