avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Dicipta dalam: 2019-08-13 11:11:38, dikemas kini pada: 2023-10-20 20:06:13
comments   8
hits   4628

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Apabila menulis strategi dagangan terprogram, menggunakan data K-line, selalunya terdapat keperluan untuk menggunakan beberapa data K-line tempoh bukan standard, seperti data K-line tempoh 12 minit, data K-line tempoh 4 jam, biasanya jenis tidak standard ini Tempoh tidak boleh diperolehi terus. Jadi bagaimana kita bertindak balas terhadap tuntutan tersebut? Jawapannya pasti ada jalannya. Kitaran bukan standard boleh diperolehi dengan menggabungkan dan mensintesis data daripada kitaran yang lebih kecil Anda boleh bayangkan bahawa harga tertinggi dalam berbilang kitaran dikira sebagai harga tertinggi selepas sintesis, dan harga terendah dikira sebagai harga terendah selepas sintesis harga tidak akan berubah, harga pembukaan pertama data bahan mentah K-line yang disintesis digunakan, harga penutupan sepadan dengan harga penutupan terakhir data bahan mentah bagi K-line yang disintesis, masa adalah masanya. daripada harga pembukaan, dan volum dagangan dikira dengan menjumlahkan volum transaksi data bahan mentah. Seperti yang ditunjukkan dalam gambar:

  • ### Idea

Kami mengambil pasaran aset blockchain BTC_USDT sebagai contoh dan mensintesis 1 jam kepada 4 jam.

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

|Masa|Tinggi|Buka|Rendah|Tutup| |- |- |- |- |-| |2019.8.12 00:00|11447.07|11382.57|11367.2|11406.92| |2019.8.12 01:00|11420|11405.65|11366.6|11373.83| |2019.8.12 02:00|11419.24|11374.68|11365.51|11398.19| |2019.8.12 03:00|11407.88|11398.59|11369.7|11384.71|

Data empat kitaran 1 jam ini digabungkan menjadi data kitaran 4 jam Harga pembukaan ialah harga pembukaan masa 00:00 pertama: 11382.57 Harga penutupan adalah yang terakhir, iaitu harga penutupan pada 03:00: 11384.71 Harga tertinggi ialah harga tertinggi di sini: 11447.07 Harga terendah di sini: 11365.51 Masa mula kitaran 4 jam ialah 00:00, masa mula garis K 1 jam, iaitu, 2019.8.12 00:00 Jumlah dagangan boleh disimpulkan setiap 1 jam (terutamanya untuk memerhatikan bagaimana harga disintesis, yang tidak ditunjukkan dalam data volum dagangan saya tidak akan pergi ke butiran di sini).

Garis K 4 jam yang disintesis ialah: Tinggi: 11447.07 Buka: 11382.57 Terendah: 11365.51 Diterima: 11384.71 Masa: 2019.8.12 00:00

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Anda dapat melihat bahawa data adalah konsisten.

  • ### Tulis kod untuk dilaksanakan

Selepas mengesahkan idea awal, anda boleh mula menulis beberapa kod untuk melaksanakan keperluan ini secara awal.

Lepaskan kod secara terus, kod itu untuk rujukan sahaja:

    function GetNewCycleRecords (sourceRecords, targetCycle) {    // K线合成函数
        var ret = []

        // 首先获取源K线数据的周期
        if (!sourceRecords || sourceRecords.length < 2) {
            return null
        }
        var sourceLen = sourceRecords.length
        var sourceCycle = sourceRecords[sourceLen - 1].Time - sourceRecords[sourceLen - 2].Time

        if (targetCycle % sourceCycle != 0) {
            Log("targetCycle:", targetCycle)
            Log("sourceCycle:", sourceCycle)
            throw "targetCycle is not an integral multiple of sourceCycle."
        }

        if ((1000 * 60 * 60) % targetCycle != 0 && (1000 * 60 * 60 * 24) % targetCycle != 0) {
            Log("targetCycle:", targetCycle)
            Log("sourceCycle:", sourceCycle)
            Log((1000 * 60 * 60) % targetCycle, (1000 * 60 * 60 * 24) % targetCycle)
            throw "targetCycle cannot complete the cycle."
        }

        var multiple = targetCycle / sourceCycle


        var isBegin = false 
        var count = 0
        var high = 0 
        var low = 0 
        var open = 0
        var close = 0 
        var time = 0
        var vol = 0
        for (var i = 0 ; i < sourceLen ; i++) {
            // 获取 时区偏移数值
            var d = new Date()
            var n = d.getTimezoneOffset()

            if (((1000 * 60 * 60 * 24) - sourceRecords[i].Time % (1000 * 60 * 60 * 24) + (n * 1000 * 60)) % targetCycle == 0) {
                isBegin = true
            }

            if (isBegin) {
                if (count == 0) {
                    high = sourceRecords[i].High
                    low = sourceRecords[i].Low
                    open = sourceRecords[i].Open
                    close = sourceRecords[i].Close
                    time = sourceRecords[i].Time
                    vol = sourceRecords[i].Volume

                    count++
                } else if (count < multiple) {
                    high = Math.max(high, sourceRecords[i].High)
                    low = Math.min(low, sourceRecords[i].Low)
                    close = sourceRecords[i].Close
                    vol += sourceRecords[i].Volume

                    count++
                }

                if (count == multiple || i == sourceLen - 1) {
                    ret.push({
                        High : high,
                        Low : low,
                        Open : open,
                        Close : close,
                        Time : time,
                        Volume : vol,
                    })
                    count = 0
                }
            }
        }

        return ret 
    }

    // 测试
    function main () {
        while (true) {
            var r = exchange.GetRecords()                           // 原始数据,作为合成K线的基础K线数据,例如要合成4小时K线,可以用1小时K线作为原始数据。
            var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)      // 通过 GetNewCycleRecords 函数 传入 原始K线数据 r , 和目标周期, 1000 * 60 * 60 * 4 即 目标合成的周期 是4小时K线数据。

            $.PlotRecords(r2, "r2")                                 // 策略类库栏 可以勾选画线类库,调用 $.PlotRecords 画线类库 导出函数 画图。
            Sleep(1000)                                             // 每次循环间隔 1000 毫秒,防止访问K线接口获取数据过于频繁,导致交易所限制。
        }
    }

Sebenarnya, untuk mensintesis K-line, dua perkara diperlukan yang pertama ialah data bahan mentah, iaitu data K-line tempoh kecil.var r = exchange.GetRecords() Data garis K tempoh kecil yang diperolehi. Yang kedua ialah dengan jelas mentakrifkan tempoh sintesis, iaitu tempoh sasaran untuk sintesis data talian K. Kemudian, melalui algoritma fungsi GetNewCycleRecords, data struktur tatasusunan K-line yang disintesis akhirnya boleh dikembalikan. Perlu diingatkan bahawa:

    1. Kitaran sasaran tidak boleh kurang daripada kitaran garis K yang anda masukkan ke dalam fungsi GetNewCycleRecords sebagai bahan mentah data. Ini kerana adalah mustahil untuk menggunakan kitaran kecil untuk mensintesis data daripada kitaran yang lebih kecil.
    1. Tempoh sasaran yang ditetapkan mestilah tempoh tertutup. Apakah penutupan kitaran? Ringkasnya, dalam masa sejam atau sehari, julat masa kitaran sasaran digabungkan bersama untuk membentuk gelung tertutup. Contoh: Sebagai contoh, garis K bagi kitaran 12 minit bermula pada 0:00 setiap jam (ambil 0:00 sebagai contoh), dan kitaran pertama ialah00:00:00 ~ 00:12:00, kitaran kedua ialah00:12:00 ~ 00:24:00, kitaran ketiga ialah00:24:00 ~ 00:36:00, kitaran keempat ialah00:36:00 ~ 00:48:00, kitaran kelima ialah00:48:00 ~ 01:00:00 , yang merangkumi 1 jam lengkap.

    Jika ia adalah kitaran 13 minit, ia adalah kitaran terbuka, dan data yang dikira dalam kitaran sedemikian bukanlah unik, kerana data yang disintesis akan berbeza bergantung pada titik permulaan data yang disintesis.

Cakera sebenar telah dijalankan: Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Bandingkan carta pertukaran Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

  • ## Gunakan data K-line untuk membina struktur data yang diperlukan

Ahli kumpulan sering bertanya soalan: Saya ingin mengira purata pergerakan harga tertinggi bagi setiap K-line, apakah yang perlu saya lakukan?

Biasanya, kami mengira purata bergerak dengan mengira purata harga penutupan untuk membentuk purata bergerak, tetapi kadangkala terdapat keperluan untuk mengira harga tertinggi, harga terendah, harga pembukaan, dll. Pada masa ini, anda tidak boleh begitu sahajaexchange.GetRecords() Data K-line yang dikembalikan oleh fungsi terus dihantar ke dalam fungsi pengiraan penunjuk.

Contohnya: Fungsi pengiraan penunjuk purata bergerak talib.MA mempunyai dua parameter Parameter pertama ialah data yang perlu dihantar, dan parameter kedua ialah parameter tempoh penunjuk. Sebagai contoh, kami ingin mengira penunjuk berikut Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Kitaran K-line ialah 4 jam. Pada carta pertukaran, purata bergerak telah ditetapkan dengan parameter tempoh purata bergerak sebanyak 9. Dan sumber data untuk pengiraan ditetapkan kepada harga tertinggi bagi setiap Bar. Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram Iaitu, purata bergerak ini ialah purata harga tertinggi bagi 9 bar K-line 4 jam, yang membentuk purata bergerak penunjuk.

Mari kita bina sendiri beberapa data dan lihat sama ada ia sama dengan yang dikira oleh carta pertukaran.

  var highs = []
  for (var i = 0 ; i < r2.length ; i++) {
      highs.push(r2[i].High)
  }

Oleh kerana kita perlu mengira purata harga tertinggi bagi setiap bar untuk memperoleh penunjuk purata bergerak. Kemudian anda perlu membina tatasusunan terlebih dahulu, di mana setiap elemen data sepadan dengan harga tertinggi setiap Bar. Anda boleh melihat bahawa pembolehubah tertinggi pada mulanya adalah tatasusunan kosong, dan kemudian kami melintasi pembolehubah data candlestick r2 (tidak ingat r2? Lihat kod dalam fungsi utama mensintesis candlestick 4 jam di atas). Baca harga tertinggi bagi setiap bar r2 (iaitu r2[i].Tinggi , i berjulat dari 0 hingga r2.panjang - 1 ), dan kemudian menolaknya ke tahap tinggi . Dengan cara ini, struktur data dibina yang sepadan satu-dengan-satu dengan Bar data K-line.

Pada ketika ini, tinggi boleh dihantar ke fungsi talib.MA untuk mengira purata bergerak.

Contoh lengkap:

  function main () {
      while (true) {
          var r = exchange.GetRecords()
          var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)
          if (!r2) {
              continue
          }

          $.PlotRecords(r2, "r2")                                               // 画出K线

          var highs = []
          for (var i = 0 ; i < r2.length ; i++) {
              highs.push(r2[i].High)
          }

          var ma = talib.MA(highs, 9)                                           // 用均线指标函数 talib.MA 计算 均线指标
          $.PlotLine("high_MA9", ma[ma.length - 2], r2[r2.length - 2].Time)     // 使用画线类库把均线指标画在图表上

          Sleep(1000)
      }
  }

Larian ujian belakang:

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Anda boleh melihat bahawa nilai penunjuk purata bergerak pada kedudukan tetikus dalam rajah adalah11466.9289

Kod di atas boleh disalin ke dalam strategi untuk menjalankan ujian Ingat untuk menyemak “Perpustakaan Lukisan Garisan” dan simpannya!

  • ## Bagaimana untuk mendapatkan data K-line dalam pasaran mata wang digital

Platform Dagangan Kuantitatif Inventor sudah mempunyai antara muka berpakej, iaitu fungsi pertukaran.GetRecords, yang boleh mendapatkan data K-line. Perkara berikut memberi tumpuan kepada mengakses terus antara muka data pertukaran K-line untuk mendapatkan data, kerana kadangkala anda perlu menentukan parameter untuk mendapatkan lebih banyak K-line, antara muka GetRecords terkapsul Biasanya 100 dikembalikan. Jika strategi pada mulanya memerlukan lebih daripada 100 K-lines, anda perlu mengumpul dan menunggu. Untuk membuat strategi berjalan secepat mungkin, anda boleh merangkum fungsi sendiri, mengakses terus antara muka K-line pertukaran, dan menentukan parameter untuk mendapatkan lebih banyak data K-line.

Mengambil pasangan dagangan BTC_USDT Huobi sebagai contoh, kami melaksanakan keperluan ini:

Cari dokumen API pertukaran dan lihat perihalan antara muka K-line: Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

  https://api.huobi.pro/market/history/kline?period=1day&size=200&symbol=btcusdt

parameter: |Nama parameter|Jenis|Diperlukan|Penerangan|Nilai| |-|-|-|-|-| |simbol|rentetan|benar|Pasangan dagangan|btcusdt, ethbtc…| |tempoh|rentetan|true|Mengembalikan kebutiran masa data, iaitu, selang masa setiap lilin|1min, 5min, 15min, 30min, 60min, 1hari, 1bulan, 1minggu, 1tahun| |size|integer|false|Kembalikan bilangan data K-line|[1, 2000]|

Kod ujian:

  function GetRecords_Huobi (period, size, symbol) {
      var url = "https://api.huobi.pro/market/history/kline?" + "period=" + period + "&size=" + size + "&symbol=" + symbol
      var ret = HttpQuery(url)

      try {
          var jsonData = JSON.parse(ret)
          var records = []
          for (var i = jsonData.data.length - 1; i >= 0 ; i--) {
              records.push({
                  Time : jsonData.data[i].id * 1000,
                  High : jsonData.data[i].high,
                  Open : jsonData.data[i].open,
                  Low : jsonData.data[i].low,
                  Close : jsonData.data[i].close,
                  Volume : jsonData.data[i].vol,
              })
          }
          return records
      } catch (e) {
          Log(e)
      }
  }  


  function main() {
      var records = GetRecords_Huobi("1day", "300", "btcusdt")
      Log(records.length)
      $.PlotRecords(records, "K")
  }

Versi Python, contoh mengakses antara muka pertukaran Huobi:

#!python3
import json
import urllib2

def GetRecords_Huobi(period, size, symbol):
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    url = "https://api.huobi.pro/market/history/kline?" + "period=" + period + "&size=" + size + "&symbol=" + symbol
    request = urllib2.Request(url)  
    request.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')  
    opener = urllib2.build_opener()  
    f= opener.open(request)  
    ret = f.read().decode('utf-8')  
    
    try :
        jsonData = json.loads(ret)
        
        records = []
        for i in range(len(jsonData["data"]) - 1, -1, -1):
            records.append({
                "Time" : jsonData["data"][i]["id"] * 1000, 
                "High" : jsonData["data"][i]["high"], 
                "Open" : jsonData["data"][i]["open"], 
                "Low" : jsonData["data"][i]["low"], 
                "Close" : jsonData["data"][i]["close"], 
                "Volume" : jsonData["data"][i]["vol"], 
            })
        return records
    except Exception as e:
        Log(e)
        
def main():
    r = GetRecords_Huobi("1day", "300", "btcusdt")
    Log(len(r))
    ext.PlotRecords(r, "K")   # 需要引用Python画线类库


Versi Python, contoh untuk mengakses antara muka K-line Binance Exchange:

#!python3
import json
import urllib2

def GetRecords_Huobi(period, size, symbol):
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    url = "https://api.binance.com/api/v3/klines?symbol=" + symbol + "&interval=" + period
    request = urllib2.Request(url)  
    request.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')  
    opener = urllib2.build_opener()  
    f= opener.open(request)  
    ret = f.read().decode('utf-8')  
    try :
        jsonData = json.loads(ret)
        
        records = []
        for i in range(len(jsonData)):
            records.append({
                "Time" : float(jsonData[i][0]),
                "High" : float(jsonData[i][2]), 
                "Open" : float(jsonData[i][1]), 
                "Low" : float(jsonData[i][3]), 
                "Close" : float(jsonData[i][4]), 
                "Volume" : float(jsonData[i][5]), 
            })
        return records
    except Exception as e:
        Log(e)
        
def main():
    r = GetRecords_Huobi("1m", "300", "BTCUSDT")
    Log(len(r))
    ext.PlotRecords(r, "K")   # 需要引用Python画线类库


Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram

Kita boleh lihat dalam log bahawa records.length ialah 300, yang bermaksud terdapat 300 bar rekod data K-line. Perbincangan ringkas mengenai pemprosesan data K-line dalam dagangan berprogram