Nhật ký học thuật hóa học số lượng của nhà phát minh (câu 2) (đã hoàn thành)

Tác giả:Giấc mơ nhỏ, Tạo: 2016-05-22 20:05:36, Cập nhật: 2019-08-01 10:31:58

Một vài ngày trước, sau khi giải quyết một vài vấn đề, khi viết mã cho khách hàng, tôi cảm thấy rất cần thiết để viết một mẫu biểu đồ, hiển thị các chỉ số (đặc biệt là các chỉ số mà tôi đã viết), vị trí giao dịch, v.v.

Câu hỏi 1:

 var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
    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'},
    yAxis: [{
            title: {text: 'K线'},//标题
            style: {color: '#4572A7'},//样式 
            opposite: false  //生成右边Y轴
        },
       {
            title:{text: 'WT'},
            opposite: true  //生成右边Y轴  ceshi
       }
    ],
    series: [//系列
        {name:'wt1',type:'spline',yAxis:1,data:[]},
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
        {name:'wt2',type:'spline',yAxis:1,data:[]},
        {type:'flags',onSeries:'wt',data:[]}
        ]                  
};
var chart = Chart(ChartObj);
var isFirst = true;
var preRecordTime = 0;
function Draw(){
    var strState = "";
    var fcolor = "";
    var msg = "";
    getRecords();
    if(isFirst === true){
        chart.reset();
        isFirst = false;
        preRecordTime = globalRecords[globalRecords.length - 1].Time;
    }
    if(preRecordTime === globalRecords[globalRecords.length - 1].Time){
        chart.add([1,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRecords.length - 1].Open,globalRecords[globalRecords.length - 1].High,globalRecords[globalRecords.length - 1].Low,globalRecords[globalRecords.length - 1].Close ],-1]);
    }else{
        //更新前一柱
        chart.add([1,[globalRecords[globalRecords.length - 2].Time,globalRecords[globalRecords.length - 2].Open,globalRecords[globalRecords.length - 2].High,globalRecords[globalRecords.length - 2].Low,globalRecords[globalRecords.length - 2].Close ],-1]);

        chart.add([1,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRecords.length - 1].Open,globalRecords[globalRecords.length - 1].High,globalRecords[globalRecords.length - 1].Low,globalRecords[globalRecords.length - 1].Close ]]);
       
        preRecordTime = globalRecords[globalRecords.length - 1].Time;
    }
    chart.update(ChartObj);
    //chart.reset(500);
}

Có thể bạn sẽ thấy nó khá khó nhìn, bạn có thể dán nó vào bên trong văn bản sublime để xem, trước tiên hãy nói một cách đơn giản vấn đề, đó là mã được viết trong khi chạy, gặp một cảnh kỳ lạ, xem hình:

Thật kỳ lạ, thanh tiến bộ đi đến 100% luôn bị kẹt, không di chuyển, không chết giả, nên bị kẹt. Tôi cũng sử dụng nhiều phương pháp để kiểm tra, ví dụ: hạn chế số lần quay, hiển thị số lần quay, hiển thị tất cả đều chạy cho đến lần quay cuối cùng bị kẹt. Nhìn vào mã của chương trình, cảm giác là không có vấn đề gì cả. Basty không thể giải quyết. Sau khi làm xong, làm lâu, cuối cùng tôi đã phát hiện ra vấn đề, đây là lý do. Khi khởi tạo biểu đồ, tôi viết chuỗi dữ liệu như thế này:

 series: [//系列
        {name:'wt1',type:'spline',yAxis:1,data:[]},        //    索引为0的 数据项,   
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},  // 索引为1
        {name:'wt2',type:'spline',yAxis:1,data:[]},    //索引为2
        {type:'flags',onSeries:'wt',data:[]}   //......
        ] 

Trong chương trình, viết dữ liệu vào biểu đồ như thế này:

  chart.add([1,[globalR.........    (太长了 没写完)      //   可以看到这里 我写入索引为1 的数据序列,就是add后面[ 符号后的 1,代表写入到{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},  这个序列中。问题就在这,我越过了索引0,直接写入索引1的数据序列里,就会导致卡死。

Vì vậy, tôi đã thay đổi nó thành:

  series: [//系列
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
        {name:'wt2',type:'spline',yAxis:1,data:[]},
        {type:'flags',onSeries:'wt',data:[]}
        ]  

Tất cả các mã được chuyển sang biểu đồ (chủ yếu là chuyển 1 thành 0)

 chart.add([0,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRe..........(太长了。。。)

Điều đó thật tuyệt vời, không bị kẹt, hoạt động không có vấn đề.


Vấn đề 2

Hôm nay, tôi đã cập nhật bài viết vì một người bạn trong nhóm đã đặt câu hỏi, bằng cách nghiên cứu, giải quyết vấn đề, ghi lại. Nếu người dùng mới có câu hỏi tương tự, hãy giải thích.

Getticker lấy giá tương lai tại sao lại khác với giá thực?img

Tôi đã tự mình thử nghiệm, và thực sự khác nhau. Các nhà phát minh định lượng trên robot. Sàn giao dịch là OK Futures, với giá mới nhất được lấy bằng GetTicker. Có sự khác biệt thực sự với OK Futures trên trang web chính thức, thực sự kỳ lạ, chắc chắn là không hiểu đâu. Vì vậy, tôi đã viết một đoạn mã để kiểm tra cụ thể:

function main(){
    exchange.SetContractType("this_week");
    var ticker = exchange.GetTicker();
    var huilv = exchange.GetRate();
    var OKhuilv = exchange.GetUSDCNY();
    while(true){
        huilv = exchange.GetRate();
        ticker = exchange.GetTicker();
        OKhuilv = exchange.GetUSDCNY();
        LogStatus("ticker:",ticker,"\n","huilv",huilv,"OKhuilv",OKhuilv);
        Sleep(1000);
    }
}

Các hoạt động:img imgTôi tìm thấy tỷ giá khác nhau, tôi lấy tỷ giá ở đây bằng 2 hàm API khác nhau.imgBạn đã xem phần giới thiệu về API, OK Futures không sử dụng tỷ giá của riêng mình?

Hãy thử và kiểm tra xem kết quả sẽ như thế nào:imgVì giá trên trang web của OK chỉ là 1 chữ số sau số nhỏ (những chữ số còn lại không hiển thị đầy đủ), ước tính sẽ có một chút sai lầm. Nhìn thấy kết quả về cơ bản là như nhau, bạn có thể không chắc chắn hoàn toàn rằng giá thị trường của GetTicker và giá tương lai của OK có sự khác biệt, có lẽ là do tỷ giá không phù hợp.


Vấn đề 3: Vấn đề danh sách giá thị trường OKcoin nền tảng Bitcoin (vấn đề này đã được điều chỉnh, và bây giờ thống nhất danh sách giá thị trường tại thời điểm xem lại và danh sách giá thị trường thực tế.https://www.fmz.com/bbs-topic/474


Câu hỏi 4: Tối qua, một người bạn hỏi tôi về chiến lược và ví dụ sử dụng các nút tương tác, và tôi nghĩ rằng, chỉ cần viết bản thân, thực hành, và nói cách khác, để mọi người cùng học, cách cũ, mã đầu tiên!

/* 交互按钮 测试
while (true) {
  var cmd = GetCommand();
  if (cmd) {
    Log(cmd);
  }
  Sleep(1000);
}
*/
function main(){
    var cmd = null; //初始化一些用到的变量,这个变量是直接接受 GetCommand 函数 返回值的。
    var jsonObjStr = null; //接收JSON对象字符串 的变量
    var jsonObj = null; // JSON 对象
    var keyValue = null; // JSON 对象中的  KEY 的值
    var arrStr = null; // 字符串数组
    var ticker = exchange.GetTicker(); 
    while(true){
        $.Draw(); // 画图函数 , 图表模板的 导出函数
        while(!ticker){
            ticker = exchange.GetTicker();
            Sleep(500);
        }
        cmd = GetCommand(); //获取  交互命令
        if (cmd) {
            Log("按下了按钮:",cmd);
            arrStr = cmd.split(":"); // GetCommand 函数返回的 是一个字符串,这里我处理的麻烦了,因为想熟悉一下JSON ,所以先对字符串做出处理,把函数返回的字符串以 : 号分割成2个字符串。储存在字符串数组中。
            
            
            jsonObjStr = '{' + '"' + arrStr[0] + '"' + ':' + arrStr[1] + '}'; // 把 字符串数组中的元素重新 拼接 ,拼接成 JSON 字符串  用于转换为JSON 对象。
            //Log(jsonObjStr);//ceshi
            //Log(typeof(cmd));//ceshi
            /*ceshi
            for(var obj1 in cmd){ //  测试用  注释掉了
                Log(cmd[obj1]);
            }
            */
            
            jsonObj = JSON.parse(jsonObjStr); // 转换为JSON 对象
            //Log("ceshi"); //ceshi
            for(var key in jsonObj){ // 遍历对象中的  成员名
                keyValue = jsonObj[key]; //取出成员名对应的 值 , 就是交互按钮的值
            }
            Log(keyValue); //ceshi 
            switch(keyValue){ // 分支选择 操作
                case 1:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue ); //开多仓
                    break;
                case 2:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue ); // 开空仓
                    break;
                case 0:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue );//平仓
                    break;
                default: break;
            }
        }
        Sleep(2000);
    }
}

Tôi đã thử nghiệm mã trên và nó không được hiển thị trên quảng trường, vì vậy nếu bạn muốn thử, bạn cần phải thêm một nút tương tác bằng tay.imgTheo các thiết lập trên.

Hãy xem nó hoạt động như thế nào:

img img

Tất nhiên, việc kiểm tra lại chính sách là không thể thử nghiệm, cần phải tự tạo robot, thử nghiệm bằng đĩa mô phỏng, nhấn nút tương tác, sẽ được đánh dấu trên biểu đồ.


Câu hỏi 5: Người dùng hỏi, làm thế nào để có được tên của tiền điện tử hiện đang hoạt động, và làm thế nào để có được chu kỳ của dòng K hiện tại.

function main() {
    var records = exchange.GetRecords();
    while(!records || records.length < 2){
        records = exchange.GetRecords();
        Sleep(500);
    }
    var currency = exchange.GetCurrency();
    var diffTime = records[records.length - 1].Time - records[records.length - 2].Time;
    if(diffTime/1000 >= 1 && diffTime/1000 < 60){
        Log("周期:",diffTime/1000,"秒");
    }else if(diffTime/1000/60 >= 1 && diffTime/1000/60 < 60 ){
        Log("周期:",diffTime/1000/60,"分钟");
    }else if(diffTime/1000/60/60 >= 1 && diffTime/1000/60/60 < 24 ){
        Log("周期:",diffTime/1000/60/60,"小时");
    }else if(diffTime/1000/60/60/24 >= 1){
        Log("周期:",diffTime/1000/60/60/24,"天");
    }
    Log("货币品种:",currency);
}

Bạn bè quan tâm có thể thử.


Câu hỏi 6: Nếu không hiểu được chức năng bổ sung cho thư viện giao dịch tương lai hàng hóa phiên bản mới, bạn có thể chia sẻ mã bản chú thích mới cho nhóm QQ.

  • Các mẫu chiến lược có thể được sao chép tại Quảng trường Chiến lược.img

Câu 7: x = [1 for i in range ((n)) nghĩa là gì?

  • Những ngày rảnh rỗi này tôi đã xem python, nói chung không khó khăn gì để học, nhưng tôi vẫn gặp rất nhiều vấn đề, tôi nhớ trước.

    Câu hỏi: nghĩa là gì khi x = [1 for i in range ((n))? Khi nhìn thấy nơi này, tôi cũng đã lớn lên, và ngữ pháp như vậy dường như chưa bao giờ thấy trước đây. Đánh đoán, đoán, không đoán ý nghĩa của nó.

Đây là phân tích danh sách trong Python, nghĩa là tạo ra một danh sách từ 1 đến n. Một trong những tính năng mạnh mẽ nhất của Python là phân tích list, nó cung cấp một phương pháp nhỏ gọn để tạo ra các liên kết bằng cách áp dụng một hàm cho mỗi phần tử trong list để lập bản đồ một list khác.> List comprehension, còn được gọi là cách suy luận danh sách.> List comprehension hoạt động tinh tế hơn và nhanh hơn so với for, đặc biệt là đối với dữ liệu lớn, phân tích danh sách thay thế hầu hết các trường hợp cần sử dụng map và filter. 2. Giải pháp danh sách cơ bản cơ bản [x for x in range ((5)] # [0, 1, 2, 3, 4] l1 = [1, 2, 3,4] [x*2 for x in l1] # [2, 4, 6,8] [ %s = %s for (k, v) in a_map.items))) L1 = [1, 2, 3, 4]. L2 = [1,2,3,4] [x + y cho x trong l1 cho y trong l2] [2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8] Bạn có thể gọi hàm [ func ((x) for x in l1] # bằng map Lưu ý rằng phân tích danh sách không thay đổi giá trị của danh sách ban đầu, nó sẽ tạo ra một danh sách mới. 3. Xác định danh sách điều kiện [ x for x in range ((100) if x%2 ==0 ] 4., danh sách mảng phân tíchmat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] Chuyển matrix [ [row[i] for row in mat] for i in (0,1,2)] # [[1, 4, 7, [2, 5, 8], [3, 6, 9]] Bài viết trên được chuyển từ bài viết trên blog của CSDN.

Nói thật, tôi không hiểu rõ điều trên, nhưng nó có vẻ khá rõ ràng về mặt khái niệm, câu nói này có thể có một số tác dụng lặp đi lặp lại.
Xem thêm các hoạt động khác:

i xoay vòng trong phạm vi range ((n), tức là i = 0, 1, 2,..., n-1, tính cho các giá trị của biểu thức trước đó, như các mục trong danh sách biểu thức là 1, giá trị tương ứng là 1,1,1..., cho n 1, tạo ra một danh sách chứa n 1.

Điều này có vẻ rõ ràng hơn, xem tiếp nhé.

x = [i for i in list] Định dạng một list thành một list khác với mỗi phần tử là i x = [1 for i in range ((n) ] Đặt danh sách range ((n) vào danh sách x, mỗi phần tử được đặt thành hằng số 1 Chào mừng bạn đến forpython.com để trao đổi

Vấn đề 8: Python cơ sở không vững chắc, được trả về bị bỏ qua nửa ngày, xem vấn đề dưới đây

Hôm qua, tôi đã viết một chiến lược thử nghiệm về đường thẳng tương lai hàng hóa của Python CTP, và ông cho phép tôi thử nghiệm hệ thống kiểm tra tương lai hàng hóa của Python CTP. Ngày hôm nay tiếp tục thử nghiệm phát hiện ra chiến lược hoàn toàn không theo đường thẳng vàng đúc chết đúc để mở giao dịch giao dịch, cảm giác chắc chắn có vấn đề, kiểm tra từng chức năng, thử nghiệm, phát hiện ra Các hàm chéo không trả về các mã giá trị chính xác theo thiết kế:

def Cross(records,fast,slow): # 交叉函数 ,参数是  records K线数据   、  fast 快线周期   、slow 慢线周期
    global array_S_MA,array_F_MA   # 使用外部的 全局变量
    array_F_MA = TA.MA(records,fast)  # 调用指标函数
    array_S_MA = TA.MA(records,slow)
    n = 0   # 返回的信号值   0:不操作   , 1 : 金叉     -1: 死叉 
    if array_F_MA[-2] > array_S_MA[-2] and array_F_MA[-3] < array_S_MA[-3] and array_F_MA[-4] < array_S_MA[-4]:
        n = 1
        return n
    elif array_F_MA[-2] < array_S_MA[-2] and array_F_MA[-3] > array_S_MA[-3] and array_F_MA[-4] > array_S_MA[-4]:
        n = -1 
        return n

Làm thế nào? Bạn có thể thấy điều này, một sai lầm rất mới! Tôi đã viết return n trong nhánh điều kiện, điều này dường như không có vấn đề. Và giá trị mà nó trả về là gì?

Chúng tôi đã thực hiện một thí nghiệm nhỏ:

img

Định nghĩa một hàm kiểm tra, chỉ xuất một thông báo

img

Chúng ta hãy gọi nó, và viết nó như thế này, để xem nếu không phải là -1

img

Nếu bạn nhìn vào kết quả, bạn sẽ thấy rằng khi không thực hiện return trong hàm, giá trị trả về của hàm sẽ là None, và None cũng không bằng -1, nhưng nếu None nhỏ hơn 0, thì đó là giá trị thực.

Câu hỏi 9: Câu hỏi liên quan đến vòng lặp của JS.

Ví dụ, đoạn mã này sẽ trả lại lỗi:

function main(){
    obj = {
        exchange : null,
        initAccount : null,
        state : 0,
        exchangeName : "",
    }
    obj.name = "OKCoin";
    obj.exchange = exchange;
    obj.initAccount = obj.exchange.GetAccount();
    obj.state = 2;
    var table = {
        type : 'table',
        title : '测试',
        cols : ['obj属性名', '值'],
        rows : [],
    };
    for(var k in obj){
        table.rows.push([k, obj[k]]);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

img

TypeError: Converting circular structure to JSON (Lỗi này làm tôi đau đớn nửa giờ!)

Sau nửa ngày suy nghĩ, tôi đã phát hiện ra vấn đề.obj.exchange = exchange;Câu nói dẫn đến tham chiếu vòng tròn, quyết định khi gặp k === exchange trong vòng tròn for ((var k in obj) nhảy qua, thử.

Mã là:

function main(){
    obj = {
        exchange : null,
        initAccount : null,
        state : 0,
        exchangeName : "",
    }
    obj.name = "OKCoin";
    obj.exchange = exchange;
    obj.initAccount = obj.exchange.GetAccount();
    obj.state = 2;
    var table = {
        type : 'table',
        title : '测试',
        cols : ['obj属性名', '值'],
        rows : [],
    };
    for(var k in obj){
        if(k === 'exchange'){  // 增加的代码
            continue;
        }
        table.rows.push([k, obj[k]]);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

img

Có thể nhìn thấy cách liên kết vòng tròn không? (thậm chí có một chút nhầm lẫn trong thời gian này, ngón tay cao!)

Câu hỏi 10: Tiền tương lai hàng hóa Vào tối thứ Sáu Mở giao dịch, giữ giao dịch, sau khi giao dịch mở cửa vào thứ Hai tiếp theo, gọi hàm GetPosition Nhận thông tin giữ giao dịch, tại sao

img

Có một lý do là:

img

Các giá trị của thuộc tính type của các vị trí cụ thể của các đối tượng lưu trữ thông tin:https://www.fmz.com/bbs-topic/672

Nhìn thấy điều này, tôi cảm thấy mình nên bắt tay vào thực hành... và bạn?

Thêm nữa

botvsing2Đăng ngay.

Giấc mơ nhỏVì vậy, tôi đã đăng ký một không gian QQ đặc biệt để dễ dàng xem và tìm kiếm.