Xây dựng chức năng nút tương tác trong thanh trạng thái chính sách

Tác giả:Giấc mơ nhỏ, Tạo: 2017-06-13 15:24:05, Cập nhật: 2018-03-16 18:32:58

Xây dựng chức năng nút tương tác trong thanh trạng thái chính sách

  • Mô tả trong tài liệu API

    // 也可以构造一个按钮在表格中, 策略用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': '平仓'}) + '`')
    

    Các tài liệu API có thể hiển thị các biểu mẫu, chuỗi, hình ảnh, biểu đồ và các nội dung khác trong thanh trạng thái chính sách bằng cách gọi các hàm API:LogStatusCác bạn có thể tham gia vào chương trình này. Chúng ta cũng có thể thiết lập một nút tương tác bằng cách xây dựng dữ liệu JSON.

  • DEMO nguồn mã:

    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);
        }
    }
    

    Chúng ta hãy thực sự thử, chiến lược hoạt động như sau:

    img

    Chúng ta có thể nhấp vào các nút trong biểu mẫu trên thanh trạng thái để kích hoạt tương tác, chúng ta có thể nhấp vào hai nút sau đó là thanh phẳng và thanh gửi số.

    Bạn có thể gửi tin nhắn thông thường khi nhấp vào nút "Tập thẳng"

    img

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

    Tiếp theo, chúng ta nhấn vào nút gọi hàm, để kiểm tra hàm được gọi là hàm _D() và hàm _D() sẽ liên tục trả về chuỗi thời gian hiện tại, vì vậy ở đây nếu viết lệnh gọi hàm, sẽ liên tục gọi.

    img

    Những dữ liệu nhận được sẽ được in trên nhật ký:

    img

    Cuối cùng, chúng ta nhấp vào nút gửi mã JS và chúng ta có thể thực hiện các chức năng tùy chỉnh được sử dụng để kiểm tra trong mã của chúng tôi.

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

    Nhấp vào nút:

    img

    Bạn có thể thấy rằng chúng tôi đã thực hiện test1Log("调用自定义函数,参数:", p);Các câu nói.

  • Nhập vào mã'class': 'btn btn-xs btn-danger',Các thiết kế khác cũng có thể thay đổi hình ảnh của các nút.

    img

    img

Hãy bắt đầu luyện tập ngay!


Thêm nữa

Những đám mây nhẹCuối cùng, tôi đã tìm thấy nút này.

LwsxlnJScode:test1 (("ceshi") Điều này có ảnh hưởng đến vòng tròn chính hay không?

fmzeroGiá trị của hàng 2 có thể được làm kiểu đầu vào hay không?

hokshelatoKết quả kiểm tra thực tế và kết quả trong hướng dẫn có đầu ra. Tất cả dữ liệu được gửi được phân tích để string, do đó: 1. **Gửi số ** nút cho phép gửi số ` 10 `. 2. ** Khi nút gọi ** được kích hoạt, hàm `_D() ` đã được giải quyết, hộp gợi ý hỏi bạn xác định lệnh **2018-03-16 16:40:50** được gửi đến robot, và chỉ được thực hiện một lần, không liên tục trở lại như trong hướng dẫn. Tuy nhiên, nếu tôi sử dụng các hàm khác như: ` 'cmd': Log ((exchange.GetAccount))), `, robot sẽ không ngừng trả lại dữ liệu ngay cả khi khởi động mà không cần nhấn nút. Nếu ` 'cmd': exchange.GetAccount))) thì khi kích nút, bạn sẽ không thể nhận được giá trị cụ thể được trả về. Vì vậy, bạn có thể giải thích chi tiết về logic xử lý của BotVS đối với thuộc tính cmd trong nút tương tác không?

Ông Hồ.Tiểu Mộng, ngoài việc có thể thêm biểu mẫu và nút trong thanh trạng thái, cách thêm các điều khiển biểu mẫu khác, chẳng hạn như hộp văn bản

Gia đình nuôi con nghề nghiệp666 là một sự kiện phong phú hơn.

Gia đình nuôi con nghề nghiệp666 là một sự kiện phong phú hơn.

Giấc mơ nhỏXin cảm ơn vì đã ủng hộ.

Những đám mây nhẹNhưng thật sự thì rất hữu ích.

Giấc mơ nhỏĐây là một bài viết khá cũ.

Giấc mơ nhỏChỉ có một loại điều khiển trong thanh trạng thái tạm thời, nút.

Giấc mơ nhỏVì vậy, chúng ta có một nút thứ tư: gửi mã JS, đó là nhấn để thực hiện các hàm tương ứng hoặc mã JS.

hokshelatoBạn có thể hiểu, `'cmd': _D() ` bản thân nó không có đầu ra, `'cmd': Log ((_D()) ` sẽ không ngừng đầu ra. Nhưng, nếu nó được kích hoạt bởi nút mong muốn, tại sao các hàm trong `cmd` sẽ liên tục được gọi?

hokshelatoXin lỗi, tôi hơi bối rối. Có phải trong mã của bạn `test1 ((a++) ` sẽ không ngừng xuất, và như tôi đã nói trước đây, ngay cả khi tôi không nhấn nút đó, robot sẽ xuất ngay khi khởi động. Nhưng tại sao nếu bạn thay nó thành `_D`))) thì sẽ không có đầu ra mà phải kích hoạt bằng nút?

Giấc mơ nhỏĐiểm 2: Bạn có thể hiểu sai, khi tôi nói liên tục gọi là chỉ: trong suốt quá trình chạy của chương trình, mỗi lần _D() sẽ trả về một thời gian mới, được sử dụng như một lệnh cho nút này. Không phải là ở vị trí này đã được gọi là _D(). Bạn lần đầu tiên nhấp vào nút gọi hàm kích hoạt hộp gợi ý: 2018-03-16 16:40:50, lần tiếp theo nhấp lại sẽ hiển thị thời gian khác. Có thể bạn có thể thử nghiệm, và bạn sẽ không ngừng xuất ra, tự kiểm tra. `` var a = 0 function test1 ((p) { Log (("để gọi chức năng tùy chỉnh, tham số:", p); return p; ♪ ♪ function main (() { while (true) { var table = { type: 'table', title: 'Holding Operations', cols: ['column1', 'column2', 'Action'], [ ['a', '1', { 'type': 'button', // hiển thị nút. 'cmd': "CoverAll", // chuỗi, dữ liệu được gửi, được nhận bởi chức năng GetCommand (). 'name': 'Plating' // Tên hiển thị trên nút ♪ ♪ ['b', '1', { 'type': 'button', 'cmd': 10, // giá trị 'name': 'Gửi số' ♪ ♪ ['c', '1', { 'type': 'button', 'cmd': test1 ((a++), // hàm Chính sách được gọi trong khi chạy 'name': 'hãy gọi hàm' ♪ ♪ ['d', '1', { 'type': 'button', 'cmd': 'JScode:test1 (("ceshi") '', // chuỗi, dùng để thực thi mã JS. 'name': 'Gửi mã JS' ♪ ]] }; LogStatus (('`' + JSON.stringify ((table) + '`') var str_cmd = GetCommand (); if (str_cmd) { Log (("đã nhận được dữ liệu tương tác str_cmd:", "type:", typeof ((str_cmd), "value:", str_cmd); ♪ ♪ if (str_cmd && str_cmd.split ((':', 2)[0] == "JScode") { // Xác định liệu có tin nhắn hay không var js = str_cmd.split ((':', 2) [1]; // chia sẻ Thông điệp được trả về Dòng, hạn chế trả về 2 và đặt phần tử chỉ mục là 1 Đặt giá trị cho biến tên là js Log (("Execute debug code:", js); // xuất Code được thực hiện try { // Khám phá sự bất thường eval ((js); // Chạy hàm eval, hàm này thực hiện các tham số (công thức) được truyền. } catch (e) { // Thả ngoại lệ Log (("Exception", e); // xuất thông tin sai ♪ ♪ ♪ ♪ Sleep ((500); ♪ ♪ ♪ ♪ `` Câu hỏi đầu tiên: Số lượng kiểu hiện đang tương thích, điều này cũng là một thử nghiệm, tôi đã sửa các tài liệu sau. Cảm ơn bạn đã đề xuất ^^

Giấc mơ nhỏ Hiện tại chỉ được thực hiện tạm thời trong biểu mẫu thanh trạng thái. Thêm nút điều khiển, các điều khiển khác chưa được hỗ trợ ^^.