Jurnal inventor kimia kuantitatif (II) (Selengkapnya)

Penulis:Mimpi kecil, Dibuat: 2016-05-22 20:05:36, Diperbarui: 2019-08-01 10:31:58

Beberapa hari yang lalu, setelah menyelesaikan beberapa masalah, ketika menulis kode untuk klien, saya merasa perlu untuk menulis template grafik, menunjukkan indikator (khususnya indikator yang saya tulis sendiri), posisi perdagangan, dll. Karena saya juga seorang pemula, saya tidak terbiasa dengan highcharts, tetapi melihat contoh futures komoditas dengan ukuran Z, saya merasa kucing kucing harus bisa menyelesaikannya.

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

Tidak baik untuk menempelkan kode ~ mungkin terlihat lebih ringan, Anda dapat menempelkan untuk mendapatkan teks sublime untuk melihat, pertama-tama dengan mudah mengatakan masalah, adalah kode yang ditulis saat berjalan, menemukan adegan aneh, lihat gambar:

Anehnya, jalur kemajuan mencapai 100% dan tetap terjebak, tidak bergerak, bukan mati palsu, seharusnya terjebak. Saya juga menggunakan berbagai cara untuk menguji, seperti: membatasi jumlah siklus, menunjukkan berapa kali siklus, yang ditampilkan adalah berjalan sampai terakhir kali siklus terjebak. Setelah melihat kode program, saya merasa seharusnya tidak ada masalah. Saya tidak bisa menyelesaikannya. Setelah bekerja keras, saya akhirnya menemukan masalahnya, dan inilah alasannya. Saya menulis urutan data seperti ini saat grafik initialized:

 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, cara menulis data ke dalam grafik adalah sebagai berikut:

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

Jadi saya mengubahnya menjadi:

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

Semua kode yang akan menulis data ke dalam grafik diubah (terutama mengubah 1 menjadi 0)

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

Itu luar biasa, tidak menempel, berjalan dengan baik. Meskipun tidak tahu apa penyebabnya, perasaan itu seharusnya menjadi masalah di perpustakaan grafik.


Pertanyaan 2

Posting hari ini diperbarui karena ada teman yang mengajukan pertanyaan di grup, dengan meneliti, memecahkan, dan mencatatnya. Jika ada pengguna baru yang memiliki pertanyaan serupa, mudah dijelaskan.

Getticker mendapatkan harga berjangka Mengapa harga berjangka berbeda dengan harga sebenarnya?img

Saya sendiri telah menguji, dan itu benar-benar berbeda. Penemu kuantitas pada robot. Bursa adalah berjangka OK, dengan harga terbaru yang diperoleh dengan GetTicker. "Saya tidak tahu apa yang akan terjadi, tapi saya tahu bahwa saya akan terus berjuang untuk mendapatkannya", katanya.

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

Operasi:img imgSaya menemukan nilai tukar yang berbeda, saya mendapatkan nilai tukar di sini dengan menggunakan 2 fungsi API yang berbeda.imgSetelah melihat pengantar API, tidak ada OK Futures yang menggunakan nilai tukarnya sendiri?

Jika Anda tidak tahu apa yang akan terjadi, maka Anda harus melakukan perhitungan sendiri dan periksa!imgKarena harga di situs resmi OK hanya 1 digit setelah angka kecil (sisa tidak ditampilkan sepenuhnya), diperkirakan akan ada sedikit kesalahan. Dengan hasil yang hampir sama, tidak dapat dipastikan bahwa harga pasar yang diperoleh oleh GetTicker berbeda dengan harga pasar di situs resmi OK futures, yang mungkin disebabkan oleh ketidakcocokan nilai tukar.


Pertanyaan 3: Pertanyaan daftar harga pasar platform Bitcoin OKcoin (pertanyaan ini telah disesuaikan, dan sekarang telah menyatukan daftar harga pasar saat retesting dan daftar harga pasar waktu nyata.https://www.fmz.com/bbs-topic/474


Pertanyaan 4: Tadi malam, seorang teman bertanya di mana ada contoh penggunaan tombol interaktif, jadi saya berpikir, hanya menulis sendiri, berlatih tangan, dan dengan cara ini, mudah bagi Anda untuk belajar bersama, cara lama, kode dulu!

/* 交互按钮 测试
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 kode di atas, dan tidak tersedia di alun-alun, jadi jika Anda ingin menguji, Anda harus menambahkan tombol interaktif secara manual.imgPerangkat lunak ini dapat digunakan untuk mengunduh video, video, dan video.

Lihatlah apa yang terjadi:

img img

Tentu saja, strategi retesting tidak dapat diuji, perlu membuat robot sendiri, uji dengan piringan simulasi, tekan tombol interaksi, dan operasi yang sesuai akan ditandai pada grafik. Di sini lemparkan bola, dan harap semua orang menulis strategi NB.


Pertanyaan 5: Ada pengguna yang bertanya, bagaimana mendapatkan nama mata uang elektronik yang saat ini beroperasi, dan bagaimana mendapatkan siklus K-line saat ini.

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

Teman-teman yang tertarik dapat mencoba.


Pertanyaan 6: Jika Anda tidak memahami fungsi tambahan untuk buku buku perdagangan komoditas berjangka versi baru, Anda dapat berbagi kode versi komentar baru ke kelompok QQ.

  • Templat strategi dapat disalin di Strategy Square.img

Pertanyaan 7: Apa artinya x = [1 for i in range ((n)) ]?

  • Dua hari ini saya melihat python di waktu luang, belajar secara keseluruhan tidak sulit, tetapi masih banyak masalah, saya harus ingat.

    Pertanyaan: Apa artinya x = [1 for i in range ((n)) ]? Pada saat pertama kali melihat di sini, saya juga sudah membesarkan kepala, dan tata bahasa seperti ini sepertinya belum pernah saya lihat sebelumnya.

Ini adalah pemrosesan daftar di Python, yang berarti membentuk daftar dari 1 hingga n. Deskripsi tentang pemrosesan daftar dapat dilihat di bawah ini: Definisi dan penjelasan >Python memiliki fitur yang kuat yaitu pemetaan list, yang menyediakan cara yang kompak untuk memetakan sebuah list ke dalam list lain dengan menerapkan satu fungsi pada setiap elemen dalam list. > Pemetaan daftar, juga disebut pemetaan daftar. > Pemetaan daftar lebih ramping dan lebih cepat daripada pemetaan for. Terutama untuk data yang lebih besar, pemetaan daftar dapat menggantikan sebagian besar kasus yang membutuhkan pemetaan dan filter. 2. Dasar daftar analisis dasar [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 adalah [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 dapat memanggil fungsi [ func ((x) for x in l1] # yang setara dengan map Perhatikan bahwa analisis daftar tidak mengubah nilai dari daftar asli, tetapi membuat daftar baru. 3. Parsing daftar kondisi [ x for x in range ((100) if x%2 ==0 ] 4., daftar nesting parsingmat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] matriks pertukaran [ [row[i] for row in mat] for i in (0,1,2)] # [[1, 4, 7], [2, 5, 8], [3, 6, 9]] Artikel ini diambil dari artikel blog CSDN yang ditulis oleh Liang Yue.

Sejujurnya, saya tidak mengerti apa yang ada di atas, tetapi secara konseptual tampaknya agak jelas bahwa kalimat ini seharusnya memiliki beberapa fungsi berulang.
Lihat juga bantuan lainnya:

i berputar dalam kisaran range ((n), yaitu i = 0, 1, 2,..., n-1, masing-masing menghitung untuk nilai dari ekspresi sebelumnya, sebagai item dari daftar Ekspresi adalah 1, dengan nilai yang sesuai adalah 1, 1, 1..., untuk n 1, menghasilkan daftar yang berisi n 1 [1, 1...]

Ini terlihat lebih jelas, lihat lagi.

x = [i untuk i dalam daftar] Memetakan satu list ke daftar lain, dengan setiap elemen ditetapkan sebagai variabel i x = [1 for i in range ((n) ] Mempetakan daftar range ((n) ke daftar x, dengan setiap elemen ditetapkan pada konstanta 1 Selamat datang di forpython.com untuk berbagi

Masalah 8: Python tidak memiliki dasar yang kuat, dikembalikan dan diabaikan selama setengah hari, lihat di bawah untuk melihat masalahnya

Kemarin saya menulis sebuah strategi pengujian pada Python CTP Commodity Futures Equilibrium, dan bos saya meminta saya untuk menguji Python CTP Commodity Futures Retest System. Saat ini terus menguji dan menemukan strategi yang sama sekali tidak sesuai dengan garis lurus untuk membuka perdagangan, merasa pasti ada masalah, memeriksa, menguji, dan menemukan setiap fungsi. Fungsi silang tidak mengembalikan kode nilai yang benar 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, ini adalah kesalahan yang sangat baru! Saya telah menulis return n di dalam cabang kondisi, yang tampaknya tidak ada masalah. Jadi apa yang akan dikembalikan?

Kami melakukan percobaan kecil:

img

Definisi fungsi pengujian yang hanya menghasilkan satu pesan

img

Mari kita sebut ini, dan tulis ini, dan lihat apakah None sama dengan -1.

img

Jika kita melihat hasilnya, kita bisa melihat bahwa fungsi yang tidak melakukan return akan mendapatkan nilai yang dikembalikan oleh fungsi tersebut, yaitu None, yang juga tidak sama dengan -1, tetapi jika None kurang dari 0, maka ini adalah nilai yang benar.

Pertanyaan 9: Pertanyaan JS tentang referensi lingkaran.

Seperti kode ini, yang 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 memakan waktu setengah jam saya!), laporan ini, saya cari di Baidu; itu berarti ada referensi lingkaran dalam kode, JSON tidak dapat diselesaikan.

Saya berpikir selama setengah hari dan menemukan masalahnya, karena saya yakin itu adalah karena saya tidak tahu apa yang harus saya lakukan.obj.exchange = exchange;Pernyataan ini menyebabkan referensi loop, yang secara tegas melompat melewati, mencoba, ketika k === exchange ditemukan dalam loop for (var k in obj).

Kode adalah sebagai berikut:

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

"Sebenarnya itu normal, tapi apakah Anda bisa melihat bagaimana referensi berputar? (untuk saat ini masih ada sedikit kebingungan, tanda tangan) "

Pertanyaan 10: Komoditas berjangka Pada hari Jumat malam, buka posisi, pegang posisi, setelah buka pasar pada hari Senin berikutnya, panggil fungsi GetPosition Informasi tentang posisi yang diperoleh, mengapa

img

Dia mengatakan, "Saya tidak tahu apa yang akan terjadi.

img

Posisi tertentu Untuk melihat berbagai nilai dari sifat tipe dari objek informasi yang disimpan:https://www.fmz.com/bbs-topic/672

Setelah melihat hal ini, saya merasa harus mulai berlatih... dan Anda?

Lebih banyak

Botvsing2Anda bisa langsung mengkliknya.

Mimpi kecilSaya ingin menulis banyak, jadi saya mengajukan aplikasi khusus untuk ruang QQ, sehingga terlihat mudah dan mudah ditemukan.