Jurnal Pembelajaran Kimia Kuantitatif Pencipta (II) (Selepas)

Penulis:Mimpi kecil, Dicipta: 2016-05-22 20:05:36, Dikemas kini: 2019-08-01 10:31:58

Beberapa hari yang lalu, selepas menyelesaikan beberapa masalah, ketika menulis kod untuk pelanggan, saya merasa perlu menulis templat carta yang menunjukkan petunjuk (terutamanya petunjuk yang saya tulis sendiri), kedudukan dagangan dan lain-lain. Kerana saya juga seorang pelajar pemula, saya tidak biasa dengan carta tinggi, tetapi melihat contoh niaga hadapan komoditi besar Z, saya rasa kucing kucing harus dapat menyelesaikan masalah ini.

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

Dalam teks sublime, anda boleh menempelkannya dan melihat di dalamnya, pertama, masalah ini adalah bahawa kod yang ditulis semasa berjalan, mengalami adegan yang aneh, lihat gambar:

Saya juga menggunakan pelbagai kaedah untuk menguji, seperti: mengehadkan jumlah kitaran, menunjukkan berapa kali kitaran, menunjukkan apa yang dijalankan sehingga kitaran terakhir yang terjebak. Setelah melihat kod program, saya berasa tidak ada masalah. Saya tidak dapat menyelesaikannya. Saya telah menyusunnya, saya telah bekerja untuk masa yang lama, dan akhirnya saya menemui masalah, ini sebabnya. Apabila saya memulakan grafik, saya menulis siri data seperti ini:

 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:[]}   //......
        ] 

Dalam program ini, menulis data ke dalam carta adalah seperti ini:

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

Oleh itu, saya mengubahnya kepada:

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

Semua kod yang digunakan untuk menulis data dalam grafik diubah (terutamanya mengubah 1 menjadi 0)

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

Ia sangat hebat, tidak melekat, berjalan dengan baik. Walaupun tidak tahu apa pun sebabnya, saya rasa ia mungkin masalah dalam perpustakaan grafik.


Soalan 2

Hari ini, saya mengemas kini catatan kerana ada rakan yang mengajukan soalan di dalam kumpulan, dengan melakukan penyelidikan, menyelesaikan masalah, dan mencatatnya. Jika pengguna baru mempunyai keraguan yang sama, mudah dijelaskan.

Getticker mendapatkan harga niaga hadapan mengapa ia berbeza dengan harga sebenar?img

Saya telah menguji sendiri, ia benar-benar berbeza. Pencipta kuantitatif pada robot. Bursa adalah niaga hadapan OK, dengan harga terkini yang diperoleh dengan GetTicker. Oleh itu, saya menulis satu petikan kod untuk ujian khusus:

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

Perkhidmatan:img imgSaya menggunakan 2 fungsi API yang berbeza untuk mendapatkan nilai tukar yang berbeza.imgLihatlah perkenalan API, bukankah OK Futures menggunakan mata wang sendiri?

Di sini, anda akan melihat gambar yang menunjukkan bahawa anda telah membuat pengubahsuaian dengan tangan anda dan mengesahkan!imgOleh kerana harga di laman web OK hanya 1 digit selepas angka kecil (yang lain tidak ditunjukkan sepenuhnya), anggaran akan menjadi sedikit salah. Dengan melihat hasil yang sama, tidak dapat dipastikan dengan pasti bahawa harga pasaran yang diperoleh oleh GetTicker dan harga masa depan OK di laman web rasmi adalah berbeza, mungkin disebabkan oleh ketidakcocokan kadar pertukaran.


Soalan 3: Soalan senarai harga pasaran platform Bitcoin OKcoin (soalan ini telah disesuaikan, kini menyatukan senarai harga pasaran semasa pengulangan dan senarai harga pasaran semasa sebenar: parameter kedua untuk membeli adalah jumlah RMB, parameter kedua untuk menjual adalah jumlah barang yang disenaraikan. Lihat tutorial terperinci:https://www.fmz.com/bbs-topic/474


Soalan 4: Malam tadi, seorang rakan bertanya kepada saya di mana terdapat contoh penggunaan mengenai strategi butang interaksi, saya berfikir, hanya menulis sendiri, berlatih tangan, dan dengan cara ini, mudah untuk belajar bersama, cara lama, kod terlebih dahulu!

/* 交互按钮 测试
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);
    }
}

Saya telah menguji kod di atas, dan ia tidak tersedia di tempat terbuka, jadi jika anda ingin menguji, anda perlu menambahkan butang interaksi secara manual. Saya juga perlu menambah templat carta. Saya mempunyai skrin.imgDi sini, anda akan melihat gambar di atas.

Cuba lihat bagaimana ia berjalan:

img img

Sudah tentu, strategi ulangan tidak boleh diuji, memerlukan robot untuk mencipta sendiri, menggunakan piringan analog, tekan butang interaksi, dan operasi yang sesuai akan ditandakan pada carta. Di sini, letakkan bola tanduk, dan harap semua orang menulis strategi NB.


Soalan 5: Pengguna bertanya, bagaimana untuk mendapatkan nama mata wang elektronik yang sedang beroperasi, dan bagaimana untuk mendapatkan kitaran K baris semasa.

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

Rakan-rakan yang berminat boleh mencuba.


Soalan 6: Jika anda tidak memahami fungsi yang ditambah untuk keluaran baru Perpustakaan Dagangan Berjangka Komoditi, anda boleh berkongsi dan memuat turun kod versi komen baru ke kumpulan QQ.

  • Templat strategi boleh disalin di Strategy Square.img

Soalan 7: Apa yang x = [1 for i in range ((n))] bermaksud?

  • Saya tidak mempunyai masa lapang untuk melihat python, secara keseluruhan, belajar tidak begitu sukar, tetapi masih menghadapi banyak masalah, saya perlu ingat.

    Soalan: Apakah maksud x = [1 for i in range ((n) ]? Pada mulanya saya melihat di sini, saya juga sudah membesar, tatabahasa seperti ini seolah-olah tidak pernah saya lihat sebelumnya.

Ini adalah pemprosesan senarai dalam Python, yang bermaksud membentuk senarai dari 1 hingga n. Penerangan mengenai pemprosesan senarai boleh dilihat di bawah: Definisi dan penjelasan >Python mempunyai satu ciri yang kuat ialah pemetaan list, yang menyediakan satu kaedah yang ringkas untuk memetakan satu senarai ke dalam senarai lain dengan menggunakan satu fungsi pada setiap elemen dalam senarai. > Pemetaan senarai, juga dikenali sebagai pemenuhan senarai. > Pemetaan senarai lebih halus dan lebih cepat daripada for, terutamanya untuk data yang lebih besar. Pemetaan senarai boleh menggantikan kebanyakan kes yang memerlukan pemetaan dan penapis. 2. Penyelesaian senarai asas asas [x untuk 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 ialah [1, 2, 3, 4]. [x+y untuk x dalam l1 untuk y dalam l2] [2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8] Anda boleh memanggil fungsi [ func ((x) for x in l1] # yang sama dengan map Perhatikan bahawa penguraian senarai tidak mengubah nilai senarai asal, tetapi mencipta senarai baru. 3. Menganalisis senarai syarat [ x for x in range ((100) if x%2 == 0 ] 4., senarai nesting diselesaikanmat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] menukar matriks [ [row[i] untuk baris dalam mat] untuk i dalam (0, 1, 2) ] # [[1, 4, 7], [2, 5, 8], [3, 6, 9]] Di atas diambil daripada artikel blog CSDN oleh Liang Yue.

Sejujurnya, saya tidak faham apa yang di atas, tetapi secara konsep agak jelas bahawa frasa ini sepatutnya mempunyai beberapa fungsi berulang-ulang.
Cuba lihat bantuan yang lain:

i berputar dalam jangkauan range ((n), iaitu i = 0, 1, 2,..., n-1, dan seterusnya mengira nilai bagi ungkapan sebelumnya, sebagai item dalam senarai Ungkapan ini ialah 1, dengan nilai yang sama ialah 1, 1, 1..., bagi n 1, menghasilkan senarai yang mengandungi n 1 [1, 1...]

Ini kelihatan lebih jelas, lihat lagi.

x = [i untuk i dalam senarai] Memetakan satu senarai ke senarai lain, dengan setiap elemen ditetapkan sebagai pembolehubah i x = [1 untuk i dalam julat ((n) ] Mempetakan senarai range ((n) ke dalam senarai x, dengan setiap elemen ditetapkan sebagai konstanta 1 Selamat datang ke forpython.com untuk berbual

Isu 8: Python tidak mempunyai asas yang kukuh, telah dikembalikan, diabaikan selama setengah hari, lihat masalah di bawah

Semalam, saya menulis satu strategi ujian pada Python CTP Commodity Futures Equilibrium, dan bos saya meminta saya menguji Python CTP Commodity Futures Retesting System. Hari ini teruskan ujian dan dapati strategi yang sama sekali tidak mengikut garpu emas yang rata untuk membuka operasi pegangan, rasa pasti ada masalah, pemeriksaan, ujian, penemuan fungsi secara individu. Fungsi silang tidak mengembalikan kod nilai yang betul seperti yang dirancang:

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

Bagaimana? Lihat ini, satu kesilapan yang sangat baru! Saya telah menulis return n dalam cawangan syarat, yang nampaknya tidak ada masalah. Masalah ujian datang, apabila tidak mencetuskan garpu emas, garpu mati, fungsi Cross. Apakah nilai yang akan dikembalikan?

Kita buat satu eksperimen kecil:

img

Menentukan fungsi ujian yang hanya akan mengeluarkan satu mesej

img

Mari kita panggil ini, dan tulis ini, dan lihat sama ada None sama dengan -1.

img

Hasilnya menunjukkan bahawa apabila fungsi tidak menjalankan return, nilai yang dikembalikan oleh fungsi tersebut adalah None, dan None tidak sama dengan -1, tetapi jika None kurang daripada 0, maka ini adalah nilai yang benar.

Soalan 9: Soalan rujukan gelung JS.

Sebagai contoh, kod ini akan memberikan kesalahan:

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 (kesalahan ini telah memakan masa setengah jam!)

Saya telah berfikir selama setengah hari, dan saya mendapati masalah itu.obj.exchange = exchange;Perkataan ini membawa kepada rujukan loop, dengan tegas melompat ke hadapan apabila k === exchange dijumpai dalam loop for (var k in obj).

Kodnya ialah:

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

Saya akan cuba untuk mengulas semula, tetapi adakah anda dapat melihat bagaimana pengutipan berputar?

Soalan 10: Futures Komoditi Pada malam Jumaat Buka dagangan, memegang kedudukan, selepas perdagangan dibuka pada hari Isnin berikutnya, panggil fungsi GetPosition Mendapatkan maklumat pegangan, mengapa

img

Ini kerana:

img

Untuk melihat pelbagai nilai sifat jenis objek yang menyimpan maklumat mengenai kedudukan tertentu:https://www.fmz.com/bbs-topic/672

Apabila saya melihat ini, saya rasa saya perlu mula berlatih... dan anda?

Lebih lanjut

botvsing2Tuliskan secara langsung.

Mimpi kecilOleh itu, saya memohon ruang QQ khusus, supaya mudah dilihat dan dicari.