Kumpulan masa hadapan mata wang digital

Penulis:Mimpi kecil, Dicipta: 2021-07-02 14:35:34, Dikemas kini: 2023-09-21 21:09:56

img

Kumpulan masa hadapan mata wang digital

Strategi jenis Martin lebih banyak dibincangkan dalam kumpulan rasmi FMZ dan tidak banyak strategi jenis Martin mengenai kontrak mata wang digital di platform tersebut. Oleh itu, saya mengambil kesempatan untuk merancang strategi jenis Martin mata wang digital yang mudah. Mengapa dikatakan strategi jenis Martin, kerana risiko potensi strategi jenis Martin memang tidak kecil, tidak sepenuhnya mengikut strategi Martin. Tetapi strategi jenis ini masih mempunyai risiko yang tidak sedikit, dan parameter strategi jenis Martin berkaitan dengan parameter dan minat risiko, dan risiko tidak boleh diabaikan.

Artikel ini memaparkan pembelajaran dari reka bentuk strategi jenis Martin, dan idea strategi itu sendiri sudah jelas, sebagai pengguna FMZ, kami lebih mempertimbangkan reka bentuk strategi.

Mendapatkan Hak Bersama

Apabila merancang strategi niaga hadapan mata wang digital, data ini sering digunakan. Oleh kerana untuk mengira pendapatan, terutama apabila perlu mengira pendapatan terapung. Oleh kerana pemegang memegang sekuriti, terung juga mengambil alih. Dalam kes ini, antara muka API platform FMZ dipanggil.exchange.GetAccount()Hasilnya adalah aset yang boleh digunakan dan aset yang dibekukan. Sebenarnya, kebanyakan bursa niaga hadapan mata wang digital menyediakan data hak total, tetapi FMZ tidak menyusun sifat ini secara seragam.

Oleh itu, kami mendapatkan data ini berdasarkan fungsi reka bentuk yang berbeza di bursa yang berbeza:

// 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
}

Dalam kodtotalEquityKemudian kita menulis fungsi lain untuk memanggil input, dan 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 "不支持该交易所"
    }
}

Reka bentuk beberapa fungsi tambahan

Sebelum merancang fungsi utama, logik utama. Kami juga perlu membuat beberapa persiapan untuk merancang beberapa fungsi tambahan.

  • Batalkan semua senarai yang sedang dipaparkan

    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 dipercayai biasa bagi mereka yang sering membaca kod contoh strategi di Dataran Dasar FMZ, kerana banyak strategi telah menggunakan reka bentuk yang sama. Fungsi ini adalah untuk mendapatkan senarai yang sedang digantung dan kemudian membatalkannya secara individu.

  • Operasi pesanan bawah niaga hadapan

    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)
    }
    

    Perdagangan niaga hadapan mempunyai empat arah: terbuka panjang, terbuka pendek, terbuka pendek, dan terbuka pendek. Oleh itu, kami telah merancang empat fungsi pesanan untuk menangani operasi ini. Jika hanya mempertimbangkan pesanan, terdapat beberapa faktor yang diperlukan: arah, harga pesanan, jumlah pesanan. Oleh itu, kami juga merancang satu projek bernama:tradeFungsi yang akan diproses apabila方向(distance)下单价格(price)下单量(amount)Semua operasi adalah tepat pada waktunya. Fungsi-fungsi yang dipanggil oleh openLong, openShort, coverLong, dan coverShort akhirnya digunakan olehtradeFungsi menyelesaikan fungsi sebenar, iaitu membuat pesanan di bursa niaga hadapan mengikut arah, harga, dan kuantiti yang ditetapkan.

Fungsi utama

Idea strategi adalah mudah, dengan harga semasa untuk meletakkan jualan pada jarak tertentu di bawah garis asas, atau membeli pesanan. Apabila urus niaga selesai, membatalkan semua pesanan yang tersisa, kemudian meletakkan pesanan yang baru pada jarak tertentu berdasarkan harga yang dimiliki, meletakkan pesanan yang lebih tinggi pada harga semasa selepas pembaharuan, tetapi tidak menggandakan jumlah pesanan.

  • Kerja awal Oleh kerana order akan dilampirkan, kita memerlukan dua pembolehubah global untuk mencatat ID pesanan.

    var buyOrderId = null
    var sellOrderId = null
    

    Pilihan untuk menggunakan cakera OKEX_V5 kemudian direka dalam parameter antara muka dasar, jadi beberapa pengolahan perlu dilakukan dalam kod:

    var exName = exchange.GetName()    
    // 切换OKEX V5模拟盘
    if (isSimulate && exName == "Futures_OKCoin") {
        exchange.IO("simulate", true)
    }
    

    Pilihan untuk meletakkan semula semua maklumat juga telah direka dalam parameter antara muka, jadi kod juga mempunyai pengendalian yang sesuai:

    if (isReset) {
        _G(null)
        LogReset(1)
        LogProfitReset()
        LogVacuum()
        Log("重置所有数据", "#FF0000")
    }
    

    Kami hanya menjalankan perjanjian kekal, jadi di sini tertulis mati, hanya ditetapkan sebagai perjanjian kekal.

    exchange.SetContractType("swap")
    

    Kemudian kita juga perlu mengambil kira masalah ketepatan harga pesanan, ketepatan kuantiti pesanan, jika ketepatan tidak ditetapkan dengan baik, ketepatan hilang dalam proses pengiraan strategi, banyak digit kecil data mudah menyebabkan permintaan ditolak oleh antara muka bursa.

    exchange.SetPrecision(pricePrecision, amountPrecision)
    Log("设置精度", pricePrecision, amountPrecision)
    

    Fungsi pemulihan data yang mudah direka

    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 boleh menetapkan parameter jika anda ingin menetapkan hak total akaun awal semasa dasar berjalantotalEqJika parameter ini ditetapkan kepada -1, strategi akan membaca data manfaat keseluruhan yang disimpan, jika tidak ada data manfaat keseluruhan yang disimpan, maka dengan manfaat keseluruhan yang dibaca pada masa ini sebagai manfaat keseluruhan awal untuk kemajuan operasi strategi, maka peningkatan manfaat keseluruhan menunjukkan kekalahan, dan penurunan manfaat keseluruhan menunjukkan kerugian. Jika membaca data manfaat keseluruhan, penggunaan data ini terus dijalankan.

  • Logika utama Selepas kerja awal selesai, akhirnya datang kepada bahagian logik utama strategi, dan untuk memudahkan penjelasan, saya menulisnya secara langsung dalam nota kod.

      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 logik dan reka bentuk telah dijelaskan.

Ujian semula

Pergilah ke kawasan yang lebih ramai penduduknya, dan cubalah untuk menghidupkan strategi seperti yang berlaku pada 19 Mei.

img

img

Seperti yang kita lihat, strategi Martin masih mempunyai risiko.

Disk nyata boleh dimainkan dengan simulasi OKEX V5

img

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

Strategi ini digunakan terutamanya untuk belajar, emas sebenar dan perak digunakan dengan berhati-hati ~!


Berkaitan

Lebih lanjut

Lisa20231Saya ingin bertanya soalan ini. if (!isFindSellId &&!isFindBuyId) { // Mengesan semua tempahan telah dilakukan Jika anda membuat pesanan dengan cepat, dan anda membuat pesanan dengan cepat, adakah anda akan membuat kesilapan?

Neo1898Yang lain adalah, apakah kontrak itu penuh saham atau satu saham?

Neo1898Jika perjanjian itu sudah dibuka, mengapa tidak ditetapkan dua kali ganda? Berapa banyak yang dijual?

Awan ringanTerima kasih, akhirnya saya dapat memahami dari awal hingga akhir. Kemudian belajar untuk memantapkan senarai, dan kemudian menulis Martin dua hala. Dalam masa dua hari, menulis 580 baris. Syukur Syukur Syukur Syukur

jumlah hk/upload/asset/1a9ebf427c4e2cbf1c327.png False true dalam pertukaran?

Mimpi bernilai lapan digitJika

Mimpi bernilai lapan digitJumlah hak dan kepentingan pemilik

tiadaAdakah perlu menghentikan kerosakan?

btcrobotMartin, saya telah mengukur semula, dan hasilnya adalah 0.

wqyJika anda tidak faham, n selalu sama dengan 1.

LvdaleiAdakah strategi ini berganda atau terbuka secara berasingan?

Mimpi kecilTidak akan membuat kesilapan. Masih akan membatalkan semua pesanan yang dilampirkan, melompat keluar daripada kitaran semasa, dan meneruskan logik pesanan yang dilampirkan.

Mimpi kecilPada umumnya, anda perlu menggunakan kedai penuh.

Mimpi kecilLeverage boleh ditetapkan secara khusus di bursa, mengikut pilihan risiko anda sendiri.

Mimpi kecil666!

Mimpi kecilJika ia dipanggil isFindBuyId, ia tidak sesuai. Ia sepatutnya dipanggil isNotFindBuyId.

Mimpi kecilStrategi ini tidak direka untuk menghentikan kerugian. Oleh itu, lengkung yang keluar dapat dilihat sebagai jalan ke atas.

Mimpi kecilHa ha, tempat tinggal Martin. Artikel ini adalah mengenai reka bentuk strategi pengajaran dan tidak mengambil banyak perhatian.

Mimpi kecilN itu digunakan untuk perubahan selepas dilakukan, seperti berfikir n kali jarak penggajian, sementara boleh ditetapkan sebagai 1⁄2.

Mimpi kecilPercuma dibuka.