Pengolahan data garis K dalam perdagangan kuantitatif

Penulis:Kebaikan, Dibuat: 2019-09-03 11:15:30, Diperbarui: 2023-11-07 20:43:41

img

Bagaimana K Line memproses data dalam perdagangan kuantitatif?

Ketika menulis strategi perdagangan kuantitatif, menggunakan data K-line, seringkali ada kasus di mana data K-line siklus non-standar diperlukan. misalnya, data K-line siklus 12 menit dan data siklus K-line 4 jam diperlukan. Biasanya siklus non-standar seperti itu tidak tersedia secara langsung. Jadi bagaimana kita menangani kebutuhan seperti itu?

Data garis K siklus non-standar dapat diperoleh dengan menggabungkan data dari siklus yang lebih kecil. Gambar ini, harga tertinggi dalam beberapa siklus dihitung sebagai harga tertinggi setelah sintesis garis K siklus ganda, dan harga terendah dihitung sebagai harga terendah setelah sintesis, dan harga pembukaan tidak berubah. Harga pembukaan pertama dari data bahan baku dari garis K disintesis. Harga penutupan sesuai dengan harga penutupan data bahan baku terakhir dari garis K. Waktu menggunakan waktu garis harga pembukaan k. Volume transaksi menggunakan data bahan baku yang dijumlahkan dan dihitung.

Seperti yang ditunjukkan pada gambar:

  • Pikiran

Mari kita ambil aset blockchain BTC_USDT sebagai contoh dan sintesis 1 jam menjadi 4 jam.

img img img img

Waktu Paling tinggi Buka Terendah Dekat
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 dari empat siklus satu jam dikombinasikan menjadi satu data siklus empat jam.

Harga pembukaan adalah harga pembukaan garis K pertama pada jam 00:00 waktu: 11382.57 Harga penutupan adalah harga penutupan k baris terakhir pada pukul 03:00: 11384.71 Harga tertinggi adalah untuk menemukan harga tertinggi di antara mereka: 11447.07 Harga terendah adalah untuk menemukan harga terendah di antara mereka: 11365.51

Catatan: Pasar Komoditas Berjangka China ditutup pukul 15:00 pada hari perdagangan normal

Waktu awal siklus 4 jam adalah waktu awal dari K-line 1 jam pertama, yaitu 2019.8.12 00:00

Jumlah volume dari semua 1 jam k baris digunakan sebagai ini 4 jam k baris volume.

K-line 4 jam disintesis:

High: 11447.07
Open: 11382.57
Low: 11365.51
Close: 11384.71
Time: 209.8.12 00:00

img

Anda dapat melihat bahwa data konsisten.

  • Pelaksanaan Kode

Setelah memahami ide-ide awal, Anda dapat menulis kode secara manual untuk mewujudkan persyaratan.

Kode ini hanya untuk referensi:

function GetNewCycleRecords (sourceRecords, targetCycle) { // K line synthesis function
      var ret = []
      
      // First get the source K line data cycle
      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++) {
          // Get the time zone offset value
          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
  }

  // test
  function main () {
      while (true) {
          var r = exchange.GetRecords() // Raw data, as the basic K-line data of the synthesize K line. for example, to synthesize a 4-hour K-line, you can use the 1-hour K-line as the raw data.
          var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4) // Pass the original K-line data r through the GetNewCycleRecords function, and the target cycles, 1000 * 60 * 60 * 4, ie the target synthesis cycle is 4 hours K-line data .

          $.PlotRecords(r2, "r2") // The strategy class library bar can be selected by check the line class library, and calling the $.PlotRecords line drawing class library to export the function drawing.
          Sleep(1000) // Each cycle is separated by 1000 milliseconds, preventing access to the K-line interface too much, resulting in transaction restrictions.
      }
  }

Pada kenyataannya, untuk mensintesis garis K, Anda membutuhkan dua hal. yang pertama adalah data bahan baku, yaitu data garis K dari siklus yang lebih kecil.var r = exchange.GetRecords()untuk mendapatkan data garis siklus K yang lebih kecil.

Yang kedua adalah untuk mencari ukuran siklus sintesis, kita menggunakan algoritma fungsi GetNewCycleRecords untuk melakukan ini, maka Anda akhirnya dapat mengembalikan data dari struktur array K-line yang disintesis.

Harap perhatikan:

  1. Siklus target tidak bisa lebih kecil dari siklus garis K yang Anda lewatkan dalam fungsi GetNewCycleRecords sebagai bahan baku untuk data. karena Anda tidak dapat mensintesis data siklus yang lebih kecil dengan siklus yang lebih besar. hanya sebaliknya.

  2. Siklus target harus diatur menjadi siklus tertutup. Apa itu siklus tertutup? Sederhananya, dalam satu jam atau dalam sehari, rentang waktu siklus target digabungkan untuk membentuk loop tertutup.

misalnya:

K-line dari siklus 12 menit dimulai dari 0:0 setiap jam, siklus pertama adalah 00:00:00 ~ 00:12:00, dan siklus kedua adalah 00:12: 00 ~ 00: 24:00, siklus ketiga adalah 00:24: 00 ~ 00:36:00, siklus keempat adalah 00:36:00 ~ 00:48:00, siklus kelima adalah 00:48 :00 ~ 01:00:00, yang tepatnya selesai satu jam.

jika itu adalah siklus 13 menit, itu akan menjadi siklus yang tidak tertutup. data yang dihitung oleh siklus tersebut tidak unik karena data yang disintesis berbeda tergantung pada titik awal data yang disintesis.

Jalankan di pasar nyata:

img

Bagan pertukaran kontras

img

  • Membangun struktur data yang diperlukan menggunakan data K-line

Saya ingin menghitung rata-rata pergerakan harga tertinggi untuk semua garis K. Apa yang harus saya lakukan?

Biasanya, kita menghitung rata-rata bergerak dengan menggunakan rata-rata harga penutupan, tetapi kadang-kadang ada permintaan untuk menggunakan harga tertinggi, harga terendah, harga pembukaan dan sebagainya.

untuk permintaan tambahan ini, data garis K yang dikembalikan oleh fungsi exchange.GetRecords (()) tidak dapat langsung diteruskan ke fungsi perhitungan indikator.

Misalnya: Peraturantalib.MAFungsi perhitungan indikator rata-rata bergerak memiliki dua parameter, yang pertama adalah data yang perlu diteruskan, dan yang kedua adalah parameter siklus indikator.

misalnya, kita perlu menghitung indikator seperti yang ditunjukkan di bawah ini.

img

Siklus garis K adalah 4 jam.

Pada grafik kutipan pasar pertukaran, garis rata-rata telah ditetapkan dengan parameter siklus 9.

Sumber data yang dihitung menggunakan harga tertinggi per Bar.

img

Artinya, garis rata-rata bergerak ini terdiri dari rata-rata harga rata-rata tertinggi dari sembilan siklus 4 jam K-line Bar.

Mari kita bangun data sendiri untuk melihat apakah sama dengan data pertukaran.

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

Karena kita perlu menghitung harga tertinggi dari setiap Bar untuk mendapatkan nilai indikator rata-rata bergerak, kita perlu membangun array di mana setiap elemen data memiliki harga tertinggi untuk setiap Bar.

Anda dapat melihat bahwahighsvariabel awalnya adalah array kosong, maka kita melintasi variabel data r2 k-line (jangan ingat r2? Lihatlah kode dalam fungsi utama yang mensintesis 4 jam K-line di atas).

Baca harga tertinggi dari setiap Bar r2 (yaitu r2[i].High, i berkisar dari 0 sampai r2.length - 1), kemudian tekan kehighsDengan cara ini kita hanya membangun struktur data yang sesuai satu-ke-satu dengan data K-line Bar.

Saat ini,highsbisa lulustalib.MAfungsi untuk menghitung rata-rata 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") // Draw the K line
        
         var highs = []
         for (var i = 0 ; i < r2.length ; i++) {
             Highs.push(r2[i].High)
         }
        
         var ma = talib.MA(highs, 9) // use the moving average function "talib.MA" to calculate the moving average indicator
         $.PlotLine("high_MA9", ma[ma.length - 2], r2[r2.length - 2].Time) // Use the line drawing library to draw the moving average indicator on the chart
        
         Sleep(1000)
     }
}

Uji balik:

img

Anda dapat melihat bahwa nilai indikator rata-rata dari posisi titik mouse dalam gambar adalah 11466.9289

Kode di atas dapat disalin ke strategi untuk menjalankan tes, ingat untuk memeriksa Draw Line Library dan menyimpannya!

  • Metode akuisisi data K-line untuk pasar cryptocurrency

Platform FMZ Quant sudah memiliki antarmuka yang dikemas, yaituexchange.GetRecordsfungsi, untuk mendapatkan data K-line.

Berikut ini berfokus pada akses langsung ke antarmuka data K-line pertukaran untuk mendapatkan data, karena kadang-kadang Anda perlu menentukan parameter untuk mendapatkan lebih banyak K garis, paketGetRecordsantarmuka umumnya mengembalikan 100 k baris. jika Anda menemukan strategi yang awalnya membutuhkan lebih dari 100 K-garis, Anda perlu menunggu proses pengumpulan.

Untuk membuat strategi bekerja secepat mungkin, Anda dapat mengkapsulkan fungsi, langsung mengakses antarmuka garis K dari pertukaran, dan menentukan parameter untuk mendapatkan lebih banyak data garis K.

Menggunakan pasangan perdagangan BTC_USDT di bursa Huobi sebagai contoh, kami menerapkan persyaratan ini:

Cari dokumentasi API exchanges dan lihat deskripsi antarmuka K-line:

img

https://huobiapi.github.io/docs/spot/v1/en/#get-klines-candles

parameter:

Nama Jenis Apakah itu perlu? Deskripsi Nilai
lambang string benar Pasangan perdagangan Btcusdt, ethbtc...
periode string benar Mengembalikan granularitas waktu data, yang merupakan interval waktu dari setiap k baris 1 menit, 5 menit, 15 menit, 30 menit, 60 menit, 1 hari, 1 bulan, 1 minggu, 1 tahun
ukuran bilangan bulat palsu Mengembalikan jumlah K baris data [1, 2000]

Kode pengujian:

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

img img

Anda dapat melihat bahwa di log, cetakrecords.lengthadalah 300, yaitu jumlahrecordsBar data garis K adalah 300.img


Berkaitan

Lebih banyak