Nhật ký học thuật hóa học số lượng của nhà phát minh (a) kết thúc

Tác giả:Giấc mơ nhỏ, Tạo: 2016-05-23 23:10:46, Cập nhật: 2019-08-01 10:31:25

Ngày nay, ngoài công việc hàng ngày, viết cho khách hàng một mô-đun, kiểm tra lại toàn bộ mã không có vấn đề gì, ngoại trừ một đường chỉ số kỳ lạ trên biểu đồ, mọi thứ khác dường như bình thường, OK, thử nghiệm mô-đun trên.

Câu hỏi 1:

  • 1, đường K biểu đồ đôi khi thiếu một BAR, đang tìm kiếm BUG. Vấn đề được tìm thấy, phân tích, không nhận được dữ liệu khi thử nghiệm bằng đĩa analog. Khi nhận được dữ liệu, 2 BAR đã qua, vì vậy dữ liệu mới nhất được vẽ trên biểu đồ, dẫn đến một hoặc nhiều khoảng cách giữa.
  • 2, chạy trong một thời gian ((1 phút K-line cycle) không có vấn đề, thử lại ((30 phút K-line cycle) vấn đề xuất hiện một cách kỳ lạ:

TypeError: cannot read property length of null duk_hobject_props.c:2258 WToneAndWTtwo __FIL

Xem dưới đây là lỗi trong hàm WToneAndWTtwo, đọc tên của giá trị null, tính năng gọi là length, đó là một biến như var name = null; và sau đó tôi đọc tên của giá trị null. Sau khi đọc name.length, toàn bộ mã sẽ tìm thấy một vị trí có thể gọi length.

function isNullAndLog(arr,strArrName){//空数组报错
     if(!arr){
         Log("arr is:",arr,"name:",strArrName);
         return true;
      }
      return false;
}

Bạn nghĩ, ôi! Bây giờ tất cả các biến số được sử dụng cho length tôi đưa vào hàm này để kiểm tra, không có bug null nào thoát được. Trong 30 phút thử nghiệm K-Line, bạn sẽ thấy rằng:

TypeError: không thể đọc thuộc tính length của null duk_hobject_props.c:2258 WToneAndWTtwoĐIUTạm dịch:

BTS không thể giải quyết được!!! kiên nhẫn! ra ngoài và quay một vòng để thay đổi suy nghĩ của mình hoặc chắc chắn sẽ tỉnh táo! Khi tôi quay lại, tôi đã nghĩ rằng, liệu tôi có gọi cơ sở dữ liệu chỉ số hay không, các tham số đã được chuyển đến là null, và khi cơ sở dữ liệu được chạy, một lỗi đã xảy ra.

function isNullAndLog(arr,strArrName){//空数组报错
    if(!arr){
        Log("arr is:",arr,"name:",strArrName);
        return true;
    }
    return false;
}

function main(){
   if(typeof(x) === undefined ){
       Log(typeof(x));
   }
    var aaa = null;
    Log(isNullAndLog(aaa));
    /*
    while(!aaa || aaa.length < 9){
        Log("while xunhuan");
        Sleep(5000 * 1000);
    } 
    */
    talib.EMA(aaa,5);
} 

talib.EMA ((aaa,5); khóa này aaa là null, tôi cố tình đặt, chuyển qua để xem kết quả là gì. TypeError: Cannot read property length of null ~~OK. Có lẽ đó là vấn đề, hãy tiếp tục sửa mã.

Câu hỏi 2:

Một vấn đề khác là trước đây đã có ý tưởng ghi lại mã:

function DeleteNullEle(initArr){
    var dealArr = [];
    var initArrLen = initArr.length;
    for(var i = 0,j = 0 ; i < initArrLen ; i++,j++){
    //Log("initArr-",i,":",initArr[i]);//ceshi
    if(initArr[i] === null || isNaN(initArr[i]) ){
        j--;
        //Log("i:",i);//ceshi
        continue;
    }
        dealArr[j] = initArr[i];
    }
    //Log("dealArr:",dealArr);//ceshi
return dealArr;
}

Một số hàm được thêm vào bởi vì một số số matrix là như thế này [NaN, NaN, NaN, 22, 3, 56, 78, 4, 23] nhưng trong thử nghiệm định lượng của nhà phát minh, khi xuất hiện với hàm Log, nó hiển thị là null, và điều này có nghĩa là chúng ta sẽ không thể tính toán được với các hàm này. Hãy để tôi bị lạc lối trong một thời gian dài, hố lớn, phải nhớ rằng, bạn nhìn thấy là null hoặc NaN, vì vậy phán đoán null là không thể phán đoán.
Một điểm nữa là while ((!aaa gbla aaa.length < 10) {...}, nếu aaa === null, tại sao không trả lỗi, bởi vì trong khi đó biểu thức của toán tử này Trong!aaa thực là biểu thức luôn đúng, vì vậy aaa.length sau đó có thể không được thực hiện (( điều này có vẻ như đã được thấy khi học HTML, CSS, DOM, đánh giá trình duyệt Một số API đã được sử dụng.

Câu hỏi 3:

Ngoài ra, theo yêu cầu của một người bạn, hãy thay đổi việc giám sát chênh lệch giá, thực sự là thêm một phạm vi phân biệt giá và WeChat đẩy, rất đơn giản.

 if (diff != __lastDiff) {
//--------------------------------------------------------------------------------------------
        if(openWeixin){
            if( (diff <= price1 || diff >= price2 ) && off_on === true ){
                Log("差价:"+diff+"微信推送@");
                off_on = false;
                Sleep(1000);
            }else{
                off_on = true;
                Sleep(1000);
                }
        }
//---------------------------------------------------------------------------------------------
        // add添加数据到series, 参数格式为[series序号, 数据];
        __chart.add([0, [new Date().getTime(), diff]]);
        __lastDiff = diff;
    }

img

Có thể là một phần của một đoạn mã đơn giản, nhưng có thể chưa hoàn thiện.

Câu hỏi 4 (không phải là vấn đề, chỉ cần ghi lại một chút)

Những ngày này trong việc học viết chiến lược về tương lai, điều này phức tạp hơn so với giao dịch trực tiếp, ((May mắn là có một mẫu giao dịch tương lai lớn Z, nếu không viết chi tiết giao dịch là đủ để uống một chén >____

  • exchange.GetPosition() // được sử dụng để lấy thông tin giữ, lưu ý rằng hàm này trả về một mảng cấu trúc vị trí, chứa tất cả thông tin cụ thể về giữ.
  • exchange.SetMarginLevel ((MarginLevel) // hàm này là thiết lập đòn bẩy. Các tham số cụ thể MarginLevel chọn ((5 lần? 10 lần?) tùy thuộc vào giống, sàn giao dịch, cụ thể, một số không thể thay đổi ((ví dụ như tương lai hàng hóa CTP)
  • exchange.SetDirection ((Direction) // Đây là một API rất quan trọng, và nó được gọi trước khi trình đơn dưới đây, bởi vì chúng tôi vừa giới thiệu 4 hoạt động (để bán, bán,...), và chức năng này là thiết lập các hoạt động này (mặc dù có một chút bổ sung), CTP còn một tham số thứ hai chưa được nghiên cứu.
  • exchange.SetContractType ((ContractType) // Trước khi bắt đầu giao dịch, một trong số đó là hướng giao dịch rõ ràng (nhiều? trống? bình thường?), và một trong số đó là hợp đồng rõ ràng (được đánh dấu là đường trắng? bông?), Vì vậy, hãy sử dụng chức năng này để thiết lập loại hợp đồng. Các tham số được xác định cụ thể tại các sàn giao dịch khác nhau. Về cơ bản, chúng ta cũng sử dụng các hàm này.
  • exchange.Buy() // mua
  • exchange.Sell ((() // bán Dưới đây là mã thử nghiệm của tôi, chỉ chọn một đoạn (có thể sao chép trong hàm main), và kiểm tra lại.img
 if (!manager) {//Z大写的商品期货模板类库,用来管理交易的对象(manager 初始时null)。不明白的可以去看源代码,QQ群共享有注释版。
        if (_C(exchange.GetPosition).length > 0) {
            throw "策略启动前不能有持仓.";
        }
        Log('交易平台:', exchange.GetName(), _C(exchange.GetAccount));  //输出当前交易所 信息
        var insDetail = _C(exchange.SetContractType, ContractTypeName);  // 用容错函数 _C ,容错调用 SetContractType函数  首先明确 设置交易的合约类型。
        Log("合约", insDetail.InstrumentName, "一手", insDetail.VolumeMultiple, "份, 最大下单量", insDetail.MaxLimitOrderVolume, "保证金率:", insDetail.LongMarginRatio.toFixed(4), insDetail.ShortMarginRatio.toFixed(4), "交割日期", insDetail.StartDelivDate);
        // 上面这个Log 显示出合约的一些信息,注意 在回测的时候,与实际运行的结果不一样,可以看图杠杆都是null,保证金率都是0,可以试试看。
        manager = $.NewPositionManager();  // 这个生成管理者 对象
    }
    exchange.SetMarginLevel(10); //不支持       在这里我试着设置了一下杠杆试试,发现  显示 错误:Not support     ,CTP商品期货 应该不能自己调整杠杆
    var positions = exchange.GetPosition();     在所有的操作前 ,我试着调用了一下 GetPosition 函数  获取一下持仓信息,显示的null
    Log(positions[0]);
    exchange.SetDirection("buy"); // 在所有的操作前需要设置  操作方向  ,这里设置 买开仓(做多)。
    var id = exchange.Buy(1911,1); // 执行买入操作  下了一个  限价单,  有兴趣的同学 可以试试 市价单。(嘿嘿!自己动手记得牢)
    positions = _C(exchange.GetPosition); //再获取下 持仓信息 看看
    Log(positions);  //有持仓信息了,  在上面 Buy的时候  有兴趣的同学 试试 用低价格 买入。  Buy(1000,1) 看看。

Câu hỏi 5: Hôm nay, một người bạn viết một đoạn mã hỏi, hàm Sleep (()) có một lỗi lớn, ảnh hưởng đến chính sách tần số cao.

function main(){
    for(var i = 0 ; i < 10 ; i++){
        var b1 = 0;
        var b2 = 0;
        var b3 = 15;
        while(b1 < 200){
            var t2s1 = (new Date()).getTime();
            b1++;
            Sleep(b3);
            var t2s6 = (new Date()).getTime();
            b2 += (t2s6 - t2s1);
        }
        Log("Sleep()",b3,"MS",b1,"平均次数",b2/b1);
    }
    throw 2;
}

Tôi đã kiểm tra lại và thấy hàm Sleep sẽ chạy trong lần kiểm tra lại 1 giây (thời gian trước và sau khác nhau 1000), sau đó đoạn mã kiểm tra này có lỗi thời gian rất lớn, nhưng nếu chạy theo mô hình chạy, về cơ bản sai trong vòng 1 millisecond. Có thể hệ thống kiểm tra lại thuộc mô hình hộp cát, lỗi do các thuật toán chạy trong đó gây ra. Mô hình sai rất nhỏ (trong vòng 1 giây).

Câu hỏi 6: Một người bạn của tôi nói rằng máy chủ của tôi đã sụp đổ vào nửa đêm và gửi cho tôi nhật ký hệ thống. Tôi báo cho Z. Tôi tìm ra vấn đề, tôi ghi lại ở đây.

- Đây là nhật ký.

runtime/cgo: pthread_create failed: Resource temporarily unavailable
SIGABRT: abort
PC=0x7f332c591cc9 m=2

goroutine 0 [idle]:

goroutine 1 [select, 207 minutes]:

Từ dòng đầu tiên nhìn thấy việc tạo thread thất bại, tài nguyên không sẵn dùng tạm thời (không đủ). Có lẽ thấy vấn đề về bộ nhớ, có thể là do thiếu bộ nhớ. Giải pháp: 1. Kiểm tra mã chính sách robot đang chạy, liệu có tài nguyên được sử dụng không được phát hành, liệu có API sử dụng nhiều luồng không. 2, sử dụng ulimit lệnh kiểm tra giới hạn hệ thống của người quản lý ((Linux) ). Blog này có thể xem: (Địa chỉ blog)http://smilejay.com/2012/04/fork_resource/]] 3, quan tâm đến việc sử dụng bộ nhớ hệ thống.

Sử dụng ulimit -a để hiển thị:img

Các tham số của lệnh ulimit: -H đặt giới hạn tài nguyên cứng. -S đặt giới hạn tài nguyên mềm. -a hiển thị tất cả các hạn chế tài nguyên hiện tại. -c size: Đặt giá trị tối đa của tập tin lõi. Đơn vị:blocks -d size: Đặt giá trị tối đa của đoạn dữ liệu. Đơn vị: kbytes -f size: đặt tối đa giá trị để tạo tập tin. Đơn vị: blocks -l size: Đặt giá trị tối đa cho quá trình khóa trong bộ nhớ. Đơn vị: kbytes -m size: Đặt giá trị tối đa của bộ nhớ cố định có thể sử dụng. Đơn vị: kbytes -n size: Đặt giá trị tối đa của file descriptor mà kernel có thể mở cùng một lúc. Đơn vị: n -p size: Đặt giá trị tối đa của vùng đệm đường ống. Đơn vị: kbytes -s size: đặt giá trị tối đa của ngăn xếp. Đơn vị: kbytes -t size: đặt giới hạn tối đa về thời gian sử dụng CPU. Đơn vị:seconds -v size: Đặt giá trị tối đa của bộ nhớ ảo. Đơn vị: kbytes -u < số chương trình> Số chương trình tối đa mà người dùng có thể mở

Một người bạn gặp vấn đề này đã phát hiện ra rằng lỗi lọc hàm có thể là nguyên nhân gây ra vấn đề, đã tìm ra nguyên nhân gây ra sự sụp đổ của máy chủ (bộ nhớ đang bùng nổ); nguyên nhân là trong chính sách SetErrorFilter (( 502: 503: tcp character unexpected networktimeout WSARecv Connect GetAddr no such reset httppreceived EOF reused ); chức năng bị sử dụng sai, chỉ cần gọi một lần, không thể viết trong cấu trúc vòng lặp. Vấn đề ở trên ( bộ nhớ không ngừng phát triển) là do chức năng này được viết trong chức năng onTick, số vòng lặp liên tục dẫn đến sự sụp đổ cuối cùng.

Câu hỏi 7: Tóm tắt đơn giản về chức năng _C ((), chức năng _N ((), chức năng _G (()).

  • Chức năng _C (())

Giải thích: Chức năng này chủ yếu được sử dụng cho các API chấp nhận lỗi, ví dụ như hàm exchange.GetAccount ((), được gọi như sau: _C ((exchange.GetAccount); hãy lưu ý rằng tên hàm không được đặt dấu ngoặc, nếu hàm chấp nhận lỗi cần thêm tham số thì sẽ được viết ở tham số thứ hai của hàm _C(, sau đó. Sử dụng ví dụ.

function main(){
    var account = null;
    var amount = 1;
    var price = 2000;
    account = exchange.GetAccount();
    Log("_C 函数使用前  account :",account);
    //exchange = null; 
    _C(exchange.Buy,price,amount);
    //exchange.Buy(price,1);
    account = exchange.GetAccount();
    Log("_C 函数使用后  account :",account);
}

Chắc hẳn hàm C_c sẽ như thế này:

 function ___C(functionName,p1){
    functionName("执行需要容错的函数,传入的测试参数为:",p1);
    Log("__C 容错函数启动,容错完毕");
}
function main(){
    pstr = "测试参数--hello";
    ___C(Log,pstr);
}

Kết quả thực hiện:img

  • Chức năng _N( Giải thích: Chức năng này được sử dụng để xử lý quá nhiều vị trí sau dấu phẩy, giữ một số số vị trí nhỏ. Sử dụng ví dụ:
function main(){
    var pi = 3.1415926535897;
    Log("使用_N函数 前pi:",pi);
    var piOfDeal = _N(pi,2);
    Log("使用_N函数后 pi:",piOfDeal);
}

Kết quả thực hiện:img

  • Chức năng _G (()) Giải thích: Đây là một danh sách các từ điển toàn cầu có thể lưu được trong tài liệu API. Bảng KV, luôn lưu trữ các tập tin cục bộ, mỗi robot có một cơ sở dữ liệu riêng biệt, tồn tại sau khi khởi động lại hoặc người quản lý rời khỏi K phải là một số hoặc một chuỗi, không phân biệt kích thước nhỏ hoặc lớn, và V có thể được viết cho bất kỳ nội dung nào có thể được sắp xếp theo JSON _G ((num, 1); // Đặt một số biến toàn cầu, giá trị là 1 _G ((num, ok); // thay đổi một biến số toàn cầu, giá trị là chuỗi ok _G ((num, null); // Xóa biến số toàn cầu num _G ((num); // Trả về giá trị của biến số toàn cầu num _G(); // Trả về ID của robot hiện tại _G ((null); // Xóa tất cả các biến toàn cầu
function main(){
    Log("totalYLMoney 初始赋值 0");
    var totalYLMoney = 0;
    Log("totalYLMoney 已赋,  = ",totalYLMoney);
    if(typeof(_G("totalYLMoney_save")) !== "object"){
        totalYLMoney = _G("totalYLMoney_save"); 
        Log("读取 totalYLMoney 本地数据库 名称为totalYLMoney_save 的值 赋给 totalYLMoney ");
    }else{
        totalYLMoney = 100.12546328765458;
        _G("totalYLMoney_save",totalYLMoney.toString());
        Log("记录 totalYLMoney 保存到本地数据库");
    }
    Log("totalYLMoney",totalYLMoney);
    Log("typeof\(_G(\"totalYLMoney_save\"))",typeof(_G("totalYLMoney_save")));
}

Mã kiểm tra hàm G trên cần phải được kiểm tra trên robot, không hỗ trợ kiểm tra lại. Phương pháp kiểm tra, triển khai chương trình trên robot, lần đầu tiên khởi động robot, robot sẽ ghi lại 100.12546328765458; giá trị này được lưu trong từ điển toàn cầu với tên "totalYLMoney_save", chạy lại bot một lần nữa, bạn sẽ thấy var totalYLMoney = 0, biến này sau khi khởi động totalYLMoney, vẫn đọc ra từ từ điển giá trị được lưu trữ khi công cụ chạy lần đầu tiên.

Câu hỏi 8: Một chút về chiến lược tính toán lợi nhuận và tổn thất:

Nhiều lần nhìn thấy những học sinh mới trong nhóm, hỏi về các thuật toán chiến lược. Nói chung, các phương pháp xử lý có một vài cách, ở đây gửi một chút đơn giản, ý tưởng cũng được cung cấp bởi Đại thần trong nhóm, ở đây tôi chịu trách nhiệm giải thích.

  • Lợi nhuận nổi:

Lợi nhuận nổi là: theo (tiền hiện tại - tiền ban đầu) x giá hiện tại + (tiền hiện tại - tiền ban đầu)

Ví dụ: Ví dụ, giá đồng tiền ban đầu là 10 đô la / đồng, tài khoản bắt đầu với 5 đồng, 100 đô la. Trong một khoảng thời gian nhất định, tôi đã mua 3 đồng với giá trung bình 15 đô la / đồng. Vào cuối thời gian này, giá đồng tiền tăng lên 20 đô la / đồng. Hiện tại tài khoản của tôi là: 8 đồng, 55 đô la. Profit = (8 - 5) * 20 + (55 - 100) = 60 + (-45) = 15 Phương pháp tính toán này. Lợi nhuận là 15 đô la. (Lưu ý: Lợi nhuận của bạn hiện tại là nổi, bởi vì nếu giá đồng xu giảm mạnh vào thời điểm này, có thể bạn không chỉ không có lợi nhuận, mà còn mất tiền, tất nhiên, mất tiền cũng nổi, bởi vì lợi nhuận của bạn lúc này là theo sau giá đồng xu nổi, lý do là làm nhiều sàn giao dịch, bỏ túi) Ngoài ra, nếu tại thời điểm giá đồng xu là 20 đô la / đồng xu, đồng xu 20 bán được 3 đồng xu với giá đồng xu 15 đô la, tại thời điểm này tài khoản là: 5 đồng xu, 115 đồng xu. Lợi nhuận = (5 - 5) * 20 + (115 - 100) = 15, lợi nhuận vẫn là 15 đô la, sự khác biệt là nếu không tính đến sự suy giảm giá trị của đồng tiền nắm giữ ban đầu, lợi nhuận sẽ không thay đổi theo giá cả.

  • Lợi nhuận:

Tỷ lệ lợi nhuận: (tiền xu x giá hiện tại + tiền hiện tại) - (tiền xu ban đầu x giá ban đầu + tiền ban đầu)

Sử dụng ví dụ trên: ví dụ, giá đồng tiền ban đầu là 10 đô la, tài khoản bắt đầu với 5 đồng tiền, 100 đô la. Trong một khoảng thời gian, tôi đã mua 3 đồng tiền với mức giá trung bình là 15 đô la. Lợi nhuận = (8 * 20 + 55) - (5 * 10 + 100) = 215 - 150 = 65 Lợi nhuận của phương pháp tính toán này là 65 đô la. Lợi nhuận = (5 * 20 + 115) - (5 * 10 + 100) = 215 - 150 = 65.

So sánh hai phương pháp trên, một lợi nhuận 15 và một lợi nhuận 65, thực sự không khó để thấy. Cách đầu tiên bỏ qua lợi nhuận từ việc tăng giá trị của đồng tiền sở hữu ban đầu. Cách thứ hai là tính toán lợi nhuận từ việc tăng giá trị của đồng tiền sở hữu ban đầu. Tính toán lợi nhuận trên sổ cái cảm giác được sử dụng để thanh toán tiền. Lợi nhuận lơ lửng được áp dụng cho lợi nhuận và lỗ do giao dịch tạo ra trong một khoảng thời gian. Đây là một số trải nghiệm về những giấc mơ nhỏ bé, nếu có lỗi, xin hãy để lại dấu hiệu đúng, cảm ơn trước ^-^

Câu hỏi 9: Một người trong nhóm thấy một chính sách được công khai, và biểu mẫu xuất hiện, vì vậy họ đã đi qua API dưới đây và thấy rằng có vẻ như một chức năng mới được thêm vào, chức năng LogStatus trong API có thể vẽ bảng.

Trước tiên, hãy xem API của nền tảng:

LogStatus(Msg); //	此信息不保存到日志列表里, 只更新当前机器人的状态信息, 在日志上方显示, 可多次调用, 更新状态
LogStatus('这是一个普通的状态提示');
LogStatus('这是一个红色字体的状态提示 #ff0000');
LogStatus('这是一个多行的状态信息\n我是第二行');
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table)+'`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table)+'`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table])+'`'); // 支持多个表格同时显示, 将以TAB显示到一组里

Mã kiểm tra:

function main(){
    var value1 = 99;
    var value2 ="ceshi 01";
    var table1 = { type : "table", title : "ceshi1", cols : ["列1","列2","列3"] , rows : [ ["abc","def","ghi"] , ["1","2","3"] ] };
    var table2 = { type : "table", title : "ceshi2", cols : ["列1","列2","列3"] , rows : [ ["abc",value1,"ghi"] , [value2,"2","3"] ] };
    LogStatus("测试文本1\n`" + JSON.stringify([table1,table2]) + "`");
}

imgHình đầu tiên cho thấy chúng ta có một bảng phân trang ceshi1, định dạng dữ liệu của bảng là var table1 và var table2 và cả hai biến được tuyên bố. Tất nhiên, tất cả nội dung trong bảng 1 là các chuỗi cố định. Điều cần lưu ý là trước và sau hàm JSON.stringify (([table1, table2]) cần thêm ` này. Nếu không thì bảng sẽ không hiển thị. Tất nhiên, chúng ta phải hiển thị dữ liệu một cách động với bảng, không phải luôn luôn là nội dung văn bản cố định. Trong bảng 2, có hai dữ liệu thử nghiệm, value1 và value2.imgCác học sinh mới có thể sao chép mã, tự mình thử, thay đổi.

Câu hỏi 10: Một người dùng nhắn tin muốn một biểu đồ về tỷ lệ lợi nhuận, có thể hiện nay. Tài liệu API được định lượng bởi nhà phát minh mô tả đơn giản hơn, sử dụng biểu đồ có thể khó khăn hơn.

Tôi đã sử dụng một số số ngẫu nhiên để mô phỏng sự thay đổi động của lợi nhuận để hiển thị đường cong lợi nhuận trên biểu đồ.

var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A',enabled:true,valueDecimals:2,valueSuffix:'%'}, //提示框  就是鼠标在线上时 显示的一个 框框 里面有一些内容,这里是设置提示框的格式
    chart: { zoomType:'x',panning:true },//图表缩放  
    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
        },
    subtitle: {text: " 显示瞬时收益率 % "},//副标题
    xAxis:{type: 'datetime'}, //设置 X轴  的数值为时间类型
    yAxis: [{
            title: {text: '收益率 %'},//标题
            style: {color: '#4572A7'},//样式 
            //opposite: false  //生成右边Y轴
        }
    ],
    series: [//系列
        {name:'收益率',dataLables:{enabled:true,format:'{y} %'},type:'spline',yAxis:0,data:[]} //该图标只用到一条曲线  ,所以 只用设置一个数据序列
        ]                  
};
var chart = Chart(ChartObj);  //初始化

function main(){ //测试用的主函数
    chart.update(ChartObj); //更新
    chart.reset(); //清空图表
    var i = 0; //初始一个 i 值 , 后面循环用,   用来限制循环次数
    var randomNum = 0; //声明一个  随机数 初始化 0
    while(i < 5000){ //限制循环次数
        randomNum = Math.random() * 10;  // 生产随机数 0  -  9.9999
        //chart.add([0,[(new Date()),randomNum]]);
        chart.add(0,[(new Date()).getTime(),randomNum + 5]);  //把生成的随机数  按照时间(X 坐标)     把随机数 画在图表上(Y坐标)     
        Sleep(1000*60); // 程序 每次循环暂停60秒
        //chart.update(ChartObj);
        //chart.reset(500);
    }
    Log("over");
}
  • Một vấn đề ở đây khiến tôi bối rối nửa ngày, cũng ghi lại. Khi viết thời gian, nó phải là một số millisecond, viết như thế này: new Date (().getTime (()) Đây là một số millisecond, nếu như new Date (()) thì sẽ có một vấn đề nhỏ, chẳng hạn như hiển thị thời gian, và không sử dụng kích thước trục X. Ngoài ra còn có một công cụ: {xDateFormat: %Y-%m-%d %H:%M:%S, %A,enabled:true,valueDecimals:2,valueSuffix:%}, cài đặt này được xem để xem thông tin.valueDecimals:2 là giới hạn hiển thị giá trị của trục Y để giữ 2 chữ số nhỏ, valueSuffix:%' được thêm vào ký hiệu % vào cuối nội dung hiển thị trong hộp gợi ý.

Thêm nữa

LiuxinghuiXin vui lòng cho tôi biết, nếu có một đơn đặt hàng chưa hoàn thành, tôi sẽ hủy tất cả, tôi nên làm gì?

LouisĐiều này phải là một lời khen ngợi!

Mưa mưaCó rất nhiều điều không được đề cập trong tài liệu API.

Mùa xuânNhững điều tốt đẹp mà Shirin luôn sắp xếp

Trong khi đó, các nhà đầu tư khác cũng có thể tham gia vào các hoạt động này.Thật tốt!

Giấc mơ nhỏHãy tử tế nhé. https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png Các hướng dẫn liên kết: https://www.botvs.com/bbs-topic/475

Giấc mơ nhỏBạn có thể tìm hiểu thêm về nó ở đây.