Fitur Futures Mata Uang Digital

Penulis:Mimpi kecil, Dibuat: 2021-07-02 14:35:34, Diperbarui: 2023-09-21 21:09:56

img

Fitur Futures Mata Uang Digital

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.

Mendapatkan Hak dan Keuntungan Umum

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 kodetotalEquityDan 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 "不支持该交易所"
    }
}

Mendesain beberapa fungsi tambahan

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:tradeFungsi yang akan diproses jika方向(distance)下单价格(price)下单量(amount)"Saya tidak tahu apa yang akan terjadi", katanya. Fungsi openLong, openShort, coverLong, coverShort akhirnya disebut olehtradeFungsi melakukan fungsi praktis, yaitu melakukan pesanan di bursa berjangka berdasarkan arah, harga, dan kuantitas yang ditetapkan.

Fungsi utama

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.totalEqJika 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.

Pengamatan

"Saya tidak akan membiarkan orang-orang yang tidak bertanggung jawab melakukan apa yang mereka lakukan", katanya.

img

img

Seperti yang kita lihat, strategi kelas Martin masih memiliki risiko.

Anda dapat bermain dengan OKEX V5 simulasi lari dan lari

img

Alamat kebijakan:https://www.fmz.com/strategy/294957

Strategi yang digunakan terutama untuk belajar, emas dan perak yang asli harus digunakan dengan hati-hati!


Berkaitan

Lebih banyak

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?

Mimpi kecilTidak akan membuat kesalahan. Masih akan membatalkan semua order yang ditempel, keluar dari siklus saat ini, dan melanjutkan logikanya.

Mimpi kecilBiasanya kita harus menggunakan seluruh gudang.

Mimpi kecilLeverage dapat diatur secara khusus di bursa, sesuai dengan preferensi risiko Anda sendiri.

Mimpi kecilTotal 666!

Mimpi kecilVariabel yang disebut isFindBuyId tidak cocok.

Mimpi kecilStrategi ini tidak dirancang untuk menghentikan kerugian. Jadi kurva yang keluar terlihat seperti jalan ke atas.

Mimpi kecilHa-ha, tempat tinggal Martin. Artikel ini terutama dirancang untuk mendidik strategi, tanpa terlalu memperhatikan keuntungan.

Mimpi kecilN itu digunakan untuk modifikasi setelah dilakukan, misalnya berpikir n kali jarak penambahan, sementara dapat ditetapkan sebagai 1⁄2.

Mimpi kecilSaya tidak tahu apa yang terjadi.