Dalam menulis strategi perdagangan terprogram, dengan menggunakan data K-line, sering kali akan ada kebutuhan untuk menggunakan beberapa data K-line non-standar, seperti data K-line 12 menit, data K-line 4 jam, yang biasanya tidak dapat diperoleh secara langsung. Jadi bagaimana kita menangani kebutuhan tersebut? Jawabannya pasti ada. Siklus non-standar dapat diperoleh dengan menggabungkan data dari siklus yang lebih kecil, Anda dapat membayangkan, harga tertinggi dalam beberapa siklus, dihitung sebagai harga tertinggi setelah sintesis, harga terendah dihitung sebagai harga terendah setelah sintesis, harga buka tidak akan berubah, harga buka pertama dari data bahan baku yang dikombinasikan dengan garis K ini, harga penutupan sesuai dengan harga penutupan terakhir dari data bahan baku yang dikombinasikan dengan garis K ini, waktu adalah waktu yang dibutuhkan untuk harga buka, volume transaksi dihitung dan diperoleh dengan data bahan baku. Seperti yang terlihat di bawah:
Jika kita menggunakan pasar aset blockchain BTC_USDT sebagai contoh, satu jam menjadi empat jam.
Waktu | Tinggi | Buka | Rendah | Pembuatan |
---|---|---|---|---|
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 1 jam ini, dikombinasikan dengan data dari satu siklus 4 jam akar, harga buka adalah harga buka pertama pada 00:00:11382.57 Harga penutupan adalah harga penutupan terakhir, yaitu pada pukul 03:00: 11384.71. Harga tertinggi untuk menemukan harga tertinggi di sini: 11447.07 Harga terendah untuk menemukan harga terendah di sini: 11365.51 Periode 4 jam dimulai pada jam 00:00 dan garis K 1 jam dimulai pada jam 2019. Jumlah transaksi per jam (yang tidak ditampilkan dalam data transaksi) tidak diulas di sini.
Sebuah garis K sepanjang 4 jam yang disintesis adalah: Tinggi: 11447.07 Buka: 11382.57 Rendah: 11365.51 Pengumpulan: 11384.71 Waktu: 19.8.12 00:00
Anda dapat melihat bahwa data ini konsisten.
Setelah memverifikasi ide awal, Anda dapat menulis kode dengan tangan untuk memenuhi kebutuhan ini.
Di sini, Anda dapat menemukan beberapa tips yang dapat Anda gunakan untuk membuat blog Anda menjadi lebih baik.
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线接口获取数据过于频繁,导致交易所限制。
}
}
Untuk mengintegrasikan K-line, kita membutuhkan dua hal, pertama, kita membutuhkan data bahan baku, yaitu data K-line bersiklus kecil, contohnya.var r = exchange.GetRecords()
Data garis K siklus kecil yang diperoleh. Kedua, perlu untuk menentukan berapa banyak siklus yang harus disintesis, yaitu siklus target yang akan disintesis data garis K.
Kemudian, dengan menggunakan algoritma GetNewCycleRecords, data dari struktur aritmatika K-line yang disintesis dapat dikembalikan.
Perhatikan hal berikut:
1. Periode target tidak bisa lebih kecil dari periode K baris yang Anda masukkan ke fungsi GetNewCycleRecords sebagai bahan baku data. Karena tidak mungkin untuk mengintegrasikan data dengan siklus yang lebih kecil.
2, target siklus yang disetel harus tertutup;
Apa itu siklus penutupan?
Secara sederhana, dalam satu jam atau dalam satu hari, rentang waktu siklus target dikombinasikan untuk membentuk lingkaran tertutup.
Contoh:
Sebagai contoh, garis K pada siklus 12 menit, dimulai dari 0 menit 0 detik setiap jam (misalnya pada waktu 0), dan siklus pertama adalah00:00:00 ~ 00:12:00
Dan siklus kedua adalah00:12:00 ~ 00:24:00
Dan siklus ketiga adalah00:24:00 ~ 00:36:00
Dan siklus keempat adalah00:36:00 ~ 00:48:00
Dan siklus kelima adalah00:48:00 ~ 01:00:00
Pada saat yang sama, saya juga melihat beberapa gambar yang menunjukkan bahwa saya tidak bisa melihat apa yang terjadi.
Jika siklus 13 menit, yaitu siklus yang tidak tertutup, maka data yang dihitung pada siklus tersebut tidak unik, karena data yang disintesis berbeda berdasarkan titik awal data yang disintesis.
Dia mengatakan bahwa dia tidak pernah melihat orang lain seperti itu.
Grafik Perbandingan Bursa
Saya ingin menghitung rata-rata harga tertinggi untuk setiap garis K, bagaimana dengan garis ini?
Biasanya kita menghitung rata-rata adalah rata-rata harga penutupan yang dihitung, yang membentuk rata-rata, tetapi kadang-kadang ada kebutuhan untuk menghitung harga tertinggi, harga terendah, harga buka, dll.
Anda tidak bisa langsung memasukkannya.exchange.GetRecords()
Data K-line yang dikembalikan oleh fungsi langsung ditransfer ke fungsi penghitungan indikator.
Misalnya:talib.MAFungsi perhitungan indikator linear memiliki dua parameter, yang pertama adalah parameter data yang harus ditransfer, dan yang kedua adalah parameter siklus indikator. Jadi, contohnya, kita harus menghitung indikator seperti gambar di bawah ini.
K-line memiliki siklus 4 jam. Pada grafik bursa, garis rata-rata telah ditetapkan dengan parameter siklus rata-rata adalah 9. Dan sumber data yang dihitung adalah harga tertinggi per bar.Garis rata ini adalah rata-rata dari harga tertinggi yang dihitung rata-rata dari 9 siklus 4 jam Garis K Bar, yang terdiri dari garis rata indikator.
Kami membuat perhitungan data sendiri dan melihat apakah itu sama dengan yang dihitung oleh grafik di bursa.
var highs = []
for (var i = 0 ; i < r2.length ; i++) {
highs.push(r2[i].High)
}
Karena untuk menghitung nilai rata-rata dari harga tertinggi untuk setiap Bar, kita akan mendapatkan indikator rata-rata. Jika Anda ingin membuat sebuah array, maka Anda harus membuat sebuah array dengan setiap elemen data yang merupakan nilai tertinggi dari setiap bar. Anda dapat melihat bahwa variabel highs awalnya adalah sebuah array kosong, dan kemudian kita melintasi variabel data garis K r2 (tidak ingat r2? Lihat kode di fungsi utama di atas untuk mengkomposisi garis K 4 jam). Membaca nilai tertinggi dari r2 per Bar (yaitu r2[i].High, i mengambil nilai dari 0 hingga r2.length - 1) dan mendorong ke highs.
Pada saat ini highs dapat ditransfer ke talib. Fungsi MA menghitung garis rata.
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)
}
}
Periksa ulang:
Anda dapat melihat bahwa nilai rata-rata dari titik penghentian mouse pada grafik adalah11466.9289
Kode di atas dapat disalin ke dalam kebijakan untuk menjalankan tes, ingat untuk menyimpan setelah mengklik "Draw Line Library"!
Penemu platform perdagangan kuantitatif sudah memiliki antarmuka yang terbungkus, yaitu fungsi exchange.GetRecords, yang dapat mengambil data K-line. Di bawah ini, fokusnya adalah langsung mengakses antarmuka data K-line untuk mendapatkan data, karena kadang-kadang perlu menentukan parameter untuk mendapatkan lebih banyak K-line, yang dibungkus dengan antarmuka GetRecords Umumnya mengembalikan 100 kata. Jika terjadi kebijakan yang membutuhkan lebih dari 100 kata pada awalnya, maka perlu mengumpulkan menunggu. Untuk membuat kebijakan bekerja secepat mungkin, Anda dapat membungkus sebuah fungsi sendiri, langsung mengakses antarmuka K-line, dan menentukan parameter untuk mendapatkan lebih banyak data K-line.
Kami memenuhi kebutuhan ini dengan menggunakan pasangan transaksi BTC_USDT sebagai contoh:
Untuk menemukan dokumen API dari bursa, lihat deskripsi antarmuka K-line:
https://api.huobi.pro/market/history/kline?period=1day&size=200&symbol=btcusdt
Parameter:
Nama parameter | Jenis | Apakah perlu? | Deskripsi | Mengambil nilai |
---|---|---|---|---|
lambang | string | benar | Perdagangan | Btcusdt, ethbtc... |
periode | string | benar | Mengembalikan data time particle, yaitu interval waktu setiap batang. | 1 menit, 5 menit, 15 menit, 30 menit, 60 menit, 1 hari, 1 bulan, 1 minggu, 1 tahun |
ukuran | bilangan bulat | palsu | Mengembalikan data K-line | [1, 2000] |
Kode tes:
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 akses ke antarmuka bursa token:
#!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 antarmuka K-Line untuk mengakses Bursa Binance:
#!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画线类库
Anda dapat melihat di log, mencetak records.length dengan 300, yang berarti bahwa records K memiliki 300 baris data.
BamsmenTidak bisa mengintegrasikan hari k dengan 3 jam atau 6 jam.
Bamsmenif (((1000 * 60 * 60 * 24) - sourceRecords[i].Time % (1000 * 60 * 60 * 24) + (n * 1000 * 60)) % targetCycle == 0) { isBegin = benar Aku tidak tahu. Ada masalah dengan kalimat ini, Anda tidak bisa membuat hari k dengan 3 jam atau 6 jam, Anda hanya bisa membuat hari k dengan 1 jam, 2 jam, 4 jam.
xis2004Jika Anda ingin menjelajahi semua data sejarah dari suatu spesies, apakah Anda juga bisa memanjat?
willzhangTerima kasih atas jawabannya.
willzhangSaya ingin bertanya, bagaimana cara yang lebih baik untuk menangani jika Anda ingin lebih dari 300 bit? misalnya 1000 bit data K-line.
Penemu Kuantitas - Mimpi KecilBaiklah, ambil waktu untuk mengubahnya.
Penemu Kuantitas - Mimpi KecilIni adalah akses ke data antarmuka bursa, berapa banyak data yang diberikan bursa kepada Anda.
Penemu Kuantitas - Mimpi KecilJika jumlah maksimum return yang didukung oleh antarmuka pertukaran melebihi, maka hanya data yang dapat dikumpulkan, dan sebagainya.