
Strategi yang mengutamakan pasar yang bergejolak, seperti strategi grid dan strategi Martingale, memiliki kelemahan yang melekat. Strategi serupa telah diuji di pasar kontrak ETH selama beberapa waktu. Saya juga sering mengobrol dan berbagi pengalaman dengan pemain baru dan lama di FMZ.COM. Mengenai jenis strategi ini, ada satu hal yang sangat saya setujui dengan apa yang dikatakan seorang teman. Artinya, ketika membuat kontrak di lingkaran mata uang kripto, risiko mengambil posisi long sedikit lebih rendah daripada risiko mengambil posisi short. Atau sederhananya, penurunan terburuk yang mungkin terjadi adalah nol, tetapi keuntungannya tidak terbatas.
Jadi, apakah strategi seperti Martingale dan grid hanya akan mengambil posisi long dan tidak short, dan mendistribusikan risiko bottom-picking dalam jangka panjang akan lebih baik daripada melakukan perdagangan bilateral? Ide ini kedengarannya bagus, tetapi tidak seorang pun tahu apakah ide ini dapat dipraktikkan secara nyata. Namun setidaknya kita dapat melakukan uji ulang sederhana untuk menguji gagasan ini. Jadi kita punya topik artikel hari ini - merancang strategi bottom-picking kontrak.
Kode untuk mengimplementasikan ide ini sebenarnya sangat sederhana, berkat fleksibilitas platform, enkapsulasi antarmuka, sistem pengujian ulang yang kuat, dll. Keseluruhan kode hanya membutuhkan 60 baris (demi standar penulisan kode, banyak singkatan tidak digunakan).
Desain strateginya sangat sederhana. Berdasarkan harga awal di awal logika, order beli ditempatkan pada interval menurun. Jika harga terus menurun, teruskan menempatkan order beli untuk melanjutkan bottom fishing. Kemudian tempatkan perintah penutupan berdasarkan harga posisi ditambah selisih keuntungan tertentu dan tunggu posisi ditutup. Jika posisi ditutup, logika di atas akan diulang dengan harga saat ini sebagai harga awal. Strategi ini tidak menahan posisi pendek, hanya posisi panjang.
Kode sumber strategi:
function cancelAll() {
while (true) {
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
break
}
for (var i = 0 ; i < orders.length ; i++) {
exchange.CancelOrder(orders[i].Id, orders[i])
Sleep(interval)
}
}
}
function getLong(arr, kind) {
var ret = null
for (var i = 0 ; i < arr.length ; i++) {
if (arr[i].Type == (kind == "pos" ? PD_LONG : ORDER_TYPE_BUY)) {
ret = arr[i]
}
}
return ret
}
function pendingBidOrders(firstPrice) {
var index = 0
var amount = baseAmount
while (true) {
var pos = _C(exchange.GetPosition)
var price = firstPrice - index * baseSpacing
amount *= ratio
index++
exchange.SetDirection("buy")
exchange.Buy(price, amount)
if (pos.length != 0) {
var longPos = getLong(pos, "pos")
if (longPos) {
exchange.SetDirection("closebuy")
exchange.Sell(longPos.Price + profitTarget, longPos.Amount)
}
}
while (true) {
Sleep(interval)
if (!getLong(_C(exchange.GetOrders), "orders")) {
cancelAll()
break
}
if (!getLong(_C(exchange.GetPosition), "pos")) {
cancelAll()
return
}
}
}
}
function main() {
exchange.SetContractType(symbol)
while (true) {
pendingBidOrders(_C(exchange.GetTicker).Last)
}
}
Desain parameternya juga sangat sederhana:

Hanya ada beberapa parameter ini.
Tetapkan saja rentang waktu pengujian ulang:

Uji coba kembali:


Kelihatannya sangat mirip dengan strategi grid atau tipe Martin~. Apakah siswa baru yang baru mulai belajar takut dengan strategi yang panjang dan mudah putus asa? Pengenalan strategi yang singkat dan padat lebih cocok, membuatnya lebih mudah mencerna ide-ide strategis dan mempelajari desain logis.
Kode strategi ini hanya untuk tujuan pembelajaran dan penelitian.