Baru-baru ini, strategi tipe Martin lebih banyak dibahas di kelompok resmi FMZ, dan tidak banyak strategi tipe Martin tentang kontrak mata uang digital di platform tersebut. Oleh karena itu, saya mengambil kesempatan untuk merancang strategi tipe Martin mata uang digital berjangka sederhana. Mengapa disebut strategi tipe Martin, karena strategi tipe Martin memang memiliki risiko potensial yang besar, tidak sepenuhnya mengikuti strategi tipe Martin. Namun, strategi jenis ini masih memiliki risiko yang besar, dan pengaturan parameter strategi tipe Martin terkait dengan bunga risiko, dan risiko tidak dapat diabaikan.
Artikel ini membahas pembelajaran dari desain strategi tipe Martin, ide strategi itu sendiri sudah jelas, sebagai pengguna FMZ kami lebih mempertimbangkan desain strategi.
Data ini sering digunakan dalam merancang strategi berjangka mata uang digital. Karena untuk menghitung laba, terutama ketika perlu menghitung laba yang mengalir. Karena kepemilikan menempati nilai jaminan, daftar tanggungan juga menempati.exchange.GetAccount()
Yang diperoleh adalah aset yang tersedia dan aset yang dibekukan. Sebenarnya sebagian besar bursa berjangka mata uang digital menyediakan data ini, tetapi FMZ tidak memiliki paket yang seragam untuk atribut ini.
Jadi kami mendapatkan data ini berdasarkan fungsi desain yang berbeda dari bursa yang berbeda:
// OKEX V5 获取总权益
function getTotalEquity_OKEX_V5() {
var totalEquity = null
var ret = exchange.IO("api", "GET", "/api/v5/account/balance", "ccy=USDT")
if (ret) {
try {
totalEquity = parseFloat(ret.data[0].details[0].eq)
} catch(e) {
Log("获取账户总权益失败!")
return null
}
}
return totalEquity
}
// 币安期货
function getTotalEquity_Binance() {
var totalEquity = null
var ret = exchange.GetAccount()
if (ret) {
try {
totalEquity = parseFloat(ret.Info.totalWalletBalance)
} catch(e) {
Log("获取账户总权益失败!")
return null
}
}
return totalEquity
}
Di dalam kodetotalEquity
Dan kemudian kita menuliskan fungsi lain sebagai input panggilan, untuk memanggil fungsi yang sesuai dengan nama bursa.
function getTotalEquity() {
var exName = exchange.GetName()
if (exName == "Futures_OKCoin") {
return getTotalEquity_OKEX_V5()
} else if (exName == "Futures_Binance") {
return getTotalEquity_Binance()
} else {
throw "不支持该交易所"
}
}
Sebelum merancang fungsi utama, logika utama. Kami juga perlu melakukan beberapa persiapan untuk merancang beberapa fungsi tambahan.
Hapus semua daftar saat ini
function cancelAll() {
while (1) {
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(500)
}
Sleep(500)
}
}
Fungsi ini diyakini akrab bagi mereka yang sering membaca kode contoh kebijakan di FMZ Strategy Square, banyak kebijakan yang menggunakan desain yang sama. Fungsi ini adalah untuk mendapatkan daftar yang sedang diunggah dan kemudian membatalkannya satu per satu.
Operasi pemesanan di masa depan
function trade(distance, price, amount) {
var tradeFunc = null
if (distance == "buy") {
tradeFunc = exchange.Buy
} else if (distance == "sell") {
tradeFunc = exchange.Sell
} else if (distance == "closebuy") {
tradeFunc = exchange.Sell
} else {
tradeFunc = exchange.Buy
}
exchange.SetDirection(distance)
return tradeFunc(price, amount)
}
function openLong(price, amount) {
return trade("buy", price, amount)
}
function openShort(price, amount) {
return trade("sell", price, amount)
}
function coverLong(price, amount) {
return trade("closebuy", price, amount)
}
function coverShort(price, amount) {
return trade("closesell", price, amount)
}
Ada empat arah perdagangan berjangka: openLong, openShort, coverLong, coverShort. Jadi kami telah merancang empat fungsi order untuk melakukan operasi ini. Jika hanya mempertimbangkan order, maka ada beberapa faktor yang diperlukan: arah, harga order, jumlah order.
Jadi, kami juga membuat sebuah blog yang berjudul:trade
Fungsi yang akan diproses jika方向(distance)
、下单价格(price)
、下单量(amount)
"Saya tidak tahu apa yang akan terjadi", katanya.
Fungsi openLong, openShort, coverLong, coverShort akhirnya disebut olehtrade
Fungsi melakukan fungsi praktis, yaitu melakukan pesanan di bursa berjangka berdasarkan arah, harga, dan kuantitas yang ditetapkan.
Ide strategisnya sangat sederhana, dengan harga saat ini untuk mendongkrak jual ("tidak ada") atau membeli ("lebih banyak") di bawah garis dasar. Saat transaksi selesai, membatalkan semua pesanan yang tersisa, kemudian menggantung pesanan penghentian baru pada jarak tertentu berdasarkan harga yang dimiliki, menggantung pesanan penambahan stok pada harga saat ini setelah diperbarui, tetapi tidak menambahkan pesanan yang ditambahkan.
Pekerjaan awal Karena untuk mendaftar, kita membutuhkan dua variabel global untuk mencatat ID pesanan.
var buyOrderId = null
var sellOrderId = null
Kemudian pada parameter antarmuka kebijakan dirancang opsi untuk menggunakan OKEX_V5 analog disk, jadi beberapa pengolahan harus dilakukan dalam kode:
var exName = exchange.GetName()
// 切换OKEX V5模拟盘
if (isSimulate && exName == "Futures_OKCoin") {
exchange.IO("simulate", true)
}
Perangkat lunak ini juga dirancang untuk mengatur ulang semua informasi dalam parameter antarmuka, sehingga kode juga memiliki pengolahan yang sesuai:
if (isReset) {
_G(null)
LogReset(1)
LogProfitReset()
LogVacuum()
Log("重置所有数据", "#FF0000")
}
Kami hanya menjalankan perjanjian abadi, jadi di sini tertulis mati, hanya diatur sebagai perjanjian abadi.
exchange.SetContractType("swap")
Kemudian kita juga harus mempertimbangkan masalah presisi harga pesanan, presisi jumlah pesanan, jika presisi tidak diatur dengan baik, presisi hilang dalam perhitungan strategi, dan banyak digit kecil data yang mudah menyebabkan permintaan ditolak oleh antarmuka pertukaran saat pesanan dibuat.
exchange.SetPrecision(pricePrecision, amountPrecision)
Log("设置精度", pricePrecision, amountPrecision)
Fungsi pemulihan data yang dirancang sederhana
if (totalEq == -1 && !IsVirtual()) {
var recoverTotalEq = _G("totalEq")
if (!recoverTotalEq) {
var currTotalEq = getTotalEquity()
if (currTotalEq) {
totalEq = currTotalEq
_G("totalEq", currTotalEq)
} else {
throw "获取初始权益失败"
}
} else {
totalEq = recoverTotalEq
}
}
Anda dapat mengatur parameter jika Anda ingin menetapkan total hak akun awal saat kebijakan berjalan.totalEq
Jika parameter ini ditetapkan menjadi -1, maka kebijakan akan membaca data total manfaat yang disimpan, jika tidak ada data total manfaat yang disimpan, maka dengan total manfaat yang dibaca saat ini sebagai keuntungan awal dari kemajuan operasi strategi, maka peningkatan total manfaat menunjukkan bahwa tidak ada, dan penurunan total manfaat menunjukkan kerugian. Jika membaca data total manfaat, maka penggunaan data ini terus berjalan.
Logika Utama Setelah pekerjaan awal selesai, akhirnya sampai pada bagian logika utama strategi, dan untuk memudahkan penjelasan, saya langsung menulis penjelasan di kolom komentar kode.
while (1) { // 策略主要逻辑设计为一个死循环
var ticker = _C(exchange.GetTicker) // 首先读取当前行情信息,主要用到最新成交价
var pos = _C(exchange.GetPosition) // 读取当前持仓数据
if (pos.length > 1) { // 判断持仓数据,由于这个策略的逻辑,是不太可能同时出现多空持仓的,所以发现同时出现多空持仓就抛出错误
Log(pos)
throw "同时有多空持仓" // 抛出错误,让策略停止
}
// 根据状态而定
if (pos.length == 0) { // 根据持仓状态做出不同操作,pos.length == 0是当没有持仓时
// 未持仓了,统计一次收益
if (!IsVirtual()) {
var currTotalEq = getTotalEquity()
if (currTotalEq) {
LogProfit(currTotalEq - totalEq, "当前总权益:", currTotalEq)
}
}
buyOrderId = openLong(ticker.Last - targetProfit, amount) // 挂开多仓的买单
sellOrderId = openShort(ticker.Last + targetProfit, amount) // 挂开空仓的卖单
} else if (pos[0].Type == PD_LONG) { // 有多头持仓,挂单位置、数量有所不同
var n = 1
var price = ticker.Last
buyOrderId = openLong(price - targetProfit * n, amount)
sellOrderId = coverLong(pos[0].Price + targetProfit, pos[0].Amount)
} else if (pos[0].Type == PD_SHORT) { // 有空头持仓,挂单位置、数量有所不同
var n = 1
var price = ticker.Last
buyOrderId = coverShort(pos[0].Price - targetProfit, pos[0].Amount)
sellOrderId = openShort(price + targetProfit * n, amount)
}
if (!sellOrderId || !buyOrderId) { // 如果有一边挂单失败就取消所有挂单,重来
cancelAll()
buyOrderId = null
sellOrderId = null
continue
}
while (1) { // 挂单完成,开始监控订单
var isFindBuyId = false
var isFindSellId = false
var orders = _C(exchange.GetOrders)
for (var i = 0 ; i < orders.length ; i++) {
if (buyOrderId == orders[i].Id) {
isFindBuyId = true
}
if (sellOrderId == orders[i].Id) {
isFindSellId = true
}
}
if (!isFindSellId && !isFindBuyId) { // 检测到买卖单都成交了
cancelAll()
break
} else if (!isFindBuyId) { // 检测到买单成交
Log("买单成交")
cancelAll()
break
} else if (!isFindSellId) { // 检测到卖单成交
Log("卖单成交")
cancelAll()
break
}
LogStatus(_D())
Sleep(3000)
}
Sleep(500)
}
Semua logika dan desain sudah dijelaskan.
"Saya tidak akan membiarkan orang-orang yang tidak bertanggung jawab melakukan apa yang mereka lakukan", katanya.
Seperti yang kita lihat, strategi kelas Martin masih memiliki risiko.
Alamat kebijakan:https://www.fmz.com/strategy/294957
Strategi yang digunakan terutama untuk belajar, emas dan perak yang asli harus digunakan dengan hati-hati!
Lisa20231Saya ingin bertanya kepada Anda tentang ini. if (!isFindSellId &&!isFindBuyId) { // Menemukan bahwa semua pesanan telah ditransfer Jika Anda melakukan transaksi pembelian dan penjualan secara bersamaan dengan cepat, apakah Anda akan membuat kesalahan dalam mendeteksi pesanan?
Neo1898Dan yang lain adalah, apakah model kontraknya penuh atau berangsur-angsur?
Neo1898Mengapa tidak ada perjanjian dua kali lipat? Berapa banyak yang harus dibeli?
Awan ringanTerima kasih, akhirnya saya bisa mengerti dari awal sampai akhir. Kemudian belajar mengawasi daftar, dan menulis Martin dua sisi. Syukurlah (menjabat)
jumlah hk/upload/asset/1a9ebf427c4e2cbf1c327.png False true dalam pertukaran?
Mimpi adalah angka delapan digit.Jika
Mimpi adalah angka delapan digit.Total hak dan kepentingan pemilik
nolApakah perlu menghentikan kerusakan?
btcrobotMartin, kembali hitung, kembali ke 0.
WqyJadi jika Anda tidak mengerti bahwa n selalu sama dengan 1, maka Anda tidak mengerti bahwa n selalu sama dengan 1.
IvdaleiApakah strategi ini terbuka ganda atau terbuka terpisah?
Penemu Kuantitas - Mimpi KecilTidak akan membuat kesalahan. Masih akan membatalkan semua order yang ditempel, keluar dari siklus saat ini, dan melanjutkan logikanya.
Penemu Kuantitas - Mimpi KecilBiasanya kita harus menggunakan seluruh gudang.
Penemu Kuantitas - Mimpi KecilLeverage dapat diatur secara khusus di bursa, sesuai dengan preferensi risiko Anda sendiri.
Penemu Kuantitas - Mimpi KecilTotal 666!
Penemu Kuantitas - Mimpi KecilVariabel yang disebut isFindBuyId tidak cocok.
Penemu Kuantitas - Mimpi KecilStrategi ini tidak dirancang untuk menghentikan kerugian. Jadi kurva yang keluar terlihat seperti jalan ke atas.
Penemu Kuantitas - Mimpi KecilHa-ha, tempat tinggal Martin. Artikel ini terutama dirancang untuk mendidik strategi, tanpa terlalu memperhatikan keuntungan.
Penemu Kuantitas - Mimpi KecilN itu digunakan untuk modifikasi setelah dilakukan, misalnya berpikir n kali jarak penambahan, sementara dapat ditetapkan sebagai 1⁄2.
Penemu Kuantitas - Mimpi KecilSaya tidak tahu apa yang terjadi.