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:
Mari kita ambil aset blockchain BTC_USDT sebagai contoh dan sintesis 1 jam menjadi 4 jam.
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
Anda dapat melihat bahwa data konsisten.
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:
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.
Siklus target harus diatur menjadi
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:
Bagan pertukaran kontras
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.MA
Fungsi 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.
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.
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 bahwahighs
variabel 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 kehighs
Dengan cara ini kita hanya membangun struktur data yang sesuai satu-ke-satu dengan data K-line Bar.
Saat ini,highs
bisa lulustalib.MA
fungsi 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:
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
Platform FMZ Quant sudah memiliki antarmuka yang dikemas, yaitu
exchange.GetRecords
fungsi, 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, paketGetRecords
antarmuka 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 exchange
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")
}
Anda dapat melihat bahwa di log, cetakrecords.length
adalah 300, yaitu jumlahrecords
Bar data garis K adalah 300.