Reka bentuk strategi lindung nilai tunai mata wang digital ((2)

Penulis:Mimpi kecil, Dicipta: 2021-07-30 16:36:48, Dikemas kini: 2023-09-20 10:36:43

img

Reka bentuk strategi lindung nilai tunai mata wang digital ((2)

Dalam artikel sebelumnya, kita telah melaksanakan strategi lindung nilai yang mudah, dan seterusnya kita belajar bagaimana untuk meningkatkan strategi ini. Perubahan strategi tidak besar, tetapi perincian perubahan perlu diperhatikan. Definisi di beberapa tempat dalam kod dan perubahan sebelumnya memerlukan pemahaman yang penting.

Perlu meningkatkan strategi ini

  • Model Leverage Objek Bursa Tukar Perubahan ini hanya berkaitan dengan cakera sebenar, dan beberapa dagangan segera mempunyai semua antarmuka leverage segera, yang juga dibungkus pada FMZ. Ia juga boleh digunakan untuk menukar mod langsung untuk objek pertukaran yang dibungkus secara langsung di FMZ dan menyokong leverage segera.
  • Tambah grafik perbezaan Tambah grafik perbezaan yang ditunjukkan kerana hanya melukis.A交易所->B交易所B交易所->A交易所Kita boleh menggunakan garis perbezaan untuk melukis garis mendatar yang mencetuskan perbezaan.画线类库Di sini kita belajar bagaimana untuk menggunakan FMZ sebagai alat pengukur dan pengendalian, dan manfaatnya adalah mudah digunakan.模版类库Fungsi.
  • Fungsi Hedging Bersatu Perubahan ini boleh dikatakan lebih besar, kerana perbezaan antara kedua-dua bursa adalah sukar untuk ditukar sepenuhnya semasa perdagangan lindung nilai tertentu. Kebanyakan masa, harga satu bursa kekal lebih tinggi daripada harga bursa lain. Pada masa ini, jika aset kita telah di lindung nilai sepenuhnya (iaitu semua mata wang di bursa yang rendah dan semua wang di bursa yang tinggi). lindung nilai terhenti dan tidak dapat lagi bergantung pada keuntungan turun naik dari perbezaan harga.
  • Parameter seperti barisan perbezaan lipatan interaksi Untuk menambah fungsi interaksi kepada strategi, anda boleh mengubah garis pencetus perbezaan dalam masa nyata.
  • Menguruskan maklumat tab status, menggunakan bentuk jadual Menguruskan data yang perlu dipaparkan untuk memudahkan pengamatan.

Mari kita mulakan dengan satu demi satu.

Peralihan mod penjanaan mata wang bursa

Menggunakan kod untuk menukar ke mod peleburan tunai dengan contoh kotak tunai.exchanges[i].IO, masukkan parametertrade_normalBertukar kepada pegangan, masuktrade_super_marginBertukar ke levers penuh, retrograde tidak disokong.

DalammainTambah tahap persediaan untuk permulaan fungsi:

    // 切换杠杆模式
    for (var i = 0 ; i < exchanges.length ; i++) {   // 遍历检测所有添加的交易所对象
        if (exchanges[i].GetName() == "Binance" && marginType != 0) {   // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
            if (marginType == 1) {
                Log(exchanges[i].GetName(), "设置为杠杆逐仓")
                exchanges[i].IO("trade_normal")
            } else if (marginType == 2) {
                Log(exchanges[i].GetName(), "设置为杠杆全仓")
                exchanges[i].IO("trade_super_margin")
            }
        }
    }

Di sini, hanya ditambah kod untuk mode leverage mata wang untuk menukar mata wang tunai dengan mata wang tunai, jadi seting pertukaran pada parameter dasar hanya berlaku untuk mata wang tunai.

Tambah grafik perbezaan

Dengan menggunakan templat gambar yang sudah dibungkus sangat mudah.画线类库◎ Boleh cari dan dapatkan secara langsung di FMZ Platform Strategi Plaza.

img

Atau klik pautan di bawah:https://www.fmz.com/strategy/27293Jump to the copy page of this template.

img

Dengan mengklik butang, anda boleh menyalin perpustakaan ini ke dalam perpustakaan dasar anda sendiri.

img

Kemudian pada halaman penyuntingan dasar, anda boleh mengetuk dalam tetingkap templat yang anda perlukan; jika anda mengetuk kemudian simpan dasar, dasar ini merujuk kepada template ini. Ini hanya panduan ringkas mengenai penggunaan tetingkap template, kerana dasar ini telah merujuk kepada template ini, jadi tidak perlu mengulangi operasi. Apabila anda menyalin dasar ini di Dataran Dasar, anda akan dapat melihatnya dalam tetingkap template halaman penyuntingan dasar selepas anda menyalin kebijakan ini.画线类库Di sini, saya akan berkongsi dengan anda semua mengenai beberapa perkara yang telah dipetik.

Kami belajar cara menggunakannya.画线类库Fungsi untuk melukis gambar.

img

Kami merancang untukA->BPerbezaan harga.B->AUntuk meringkaskan perbezaannya, garis pemicu perbezaannya digambar. Anda perlu melukis dua kurva (perbezaannya semasa dari A ke B dan B ke A), dua garis mendatar (garis pemicu perbezaannya), seperti gambar di atas.

Tetapi jika anda ingin membuat perisai satu sisi, anda perlu membuat perisai satu sisi, dan anda perlu membuat perisai satu sisi.A->BdanB->AJika anda tidak mempunyai tali pencetus yang sama, anda tidak boleh menggunakan reka bentuk yang terdapat dalam artikel sebelumnya. Dalam artikel sebelumnya:

      var targetDiffPrice = hedgeDiffPrice
      if (diffAsPercentage) {
          targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
      }

Hanya satu yang mencetuskan perbezaantargetDiffPriceSaya tidak tahu. Jadi di sini kita akan mengubah kod, mula-mula mengubah parameter.

img

Kemudian ubah kod:

        var targetDiffPriceA2B = hedgeDiffPriceA2B
        var targetDiffPriceB2A = hedgeDiffPriceB2A
        if (diffAsPercentage) {
            targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
            targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
        }

Ini akan menyebabkan garis pemicu untuk harga menjadi lebih rendah daripada sebelumnya.targetDiffPriceSatu menjadi dua.targetDiffPriceA2BtargetDiffPriceB2ASaya tidak tahu. Kemudian, anda boleh menggunakan fungsi garis gambar di perpustakaan kelas untuk menggambar data ini di atas carta.

        // 画图
        $.PlotHLine(targetDiffPriceA2B, "A->B")  // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
        $.PlotHLine(targetDiffPriceB2A, "B->A")

Apabila strategi berjalan, grafik seperti ini menunjukkan.

img

Kemudian, corak perbezaan masa nyata digambar, untuk mengelakkan garis yang berlebihan. Masukkan kod untuk corak perbezaan masa nyata dalam pemeriksaan keseimbangan.

        if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
            nowAccs = _C(updateAccs, exchanges)
            var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
            cancelAll()
            if (isBalance) {
                lastKeepBalanceTS = ts
                if (isTrade) {
                    var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
                    isTrade = false 
                }                
            }

            $.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price)  // 画实时差价曲线
            $.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price)  // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
        }

Dengan hanya 4 baris kod, ia membolehkan strategi menunjukkan grafik semasa dijalankan.

Fungsi Hedging Bersatu

Dalam artikel di atas disebutkan bahawa garis pencetus perbezaan telah diubah menjadi dua barisan, masing-masing mengawal.A->BDi samping itu, ia juga akan memberi kesan negatif kepada ekonomi Malaysia.B->ADengan cara ini, anda tidak boleh menggunakan algoritma harga pesanan bawah sebelum ini, dan menggunakan cara harga dagangan yang diluluskan.

        if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) {          // A -> B 盘口条件满足            
            var priceSell = depthA.Bids[0].Price - slidePrice
            var priceBuy = depthB.Asks[0].Price + slidePrice
            var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
            if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
                Log("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks)  // 提示信息
                hedge(exB, exA, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        } else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) {   // B -> A 盘口条件满足
            var priceBuy = depthA.Asks[0].Price + slidePrice
            var priceSell = depthB.Bids[0].Price - slidePrice
            var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
            if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
                Log("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks)  // 提示信息
                hedge(exA, exB, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        }

Oleh kerana harga beli dan jual telah dipisahkan menjadi dua data, maka kita boleh menggunakan fungsi lindung nilai.hedgeSaya tidak tahu apa yang akan berlaku.

function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
    var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
    var sellRoutine = sellEx.Go("Sell", priceSell, amount)
    Sleep(500)
    buyRoutine.wait()
    sellRoutine.wait()
}

Terdapat juga beberapa penyesuaian kecil berdasarkan perubahan ini, yang tidak dapat diulas di sini, tetapi anda boleh melihat kodnya secara khusus.

Parameter-parameter seperti barisan perbezaan liputan liputan

Menambah interaksi kepada strategi untuk membolehkan strategi mengubah garis pemicu perbezaan secara langsung. Ini adalah keperluan reka bentuk strategi separa automatik, yang juga dilaksanakan sebagai contoh pengajaran. Reka bentuk interaksi dasar juga sangat mudah, mulakan dengan menambah kawalan interaksi kepada dasar di halaman penyuntingan dasar.

img

Tambahan dua kawalan, satu dipanggil A2B dan satu dipanggil B2A. Apabila anda memasukkan nombor ke dalam kotak input kawalan, klik butang masuk di sebelah kanan kotak. Ia akan segera menghantar arahan kepada dasar, contohnya: masukkan nombor ke dalam kotak input.123, klikA2BTombol ini akan segera menghantar arahan kepada polisi.

A2B:123

Mengesan interaksi dalam reka bentuk kod strategi, memproses kod.

        // 交互
        var cmd = GetCommand()   // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
        if (cmd) {               // 检测到有交互指令,例如:A2B:123
            Log("接收到命令:", cmd)
            var arr = cmd.split(":")   // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
            if (arr[0] == "A2B") {     // 判断触发的交互控件是不是A2B
                Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageB2A = parseFloat(arr[1])     // 修改触发差价线
                } else {
                    hedgeDiffPriceA2B = parseFloat(arr[1])          // 修改触发差价线
                }
            } else if (arr[0] == "B2A") {           // 检测到触发的控件是B2A     
                Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageA2B = parseFloat(arr[1])
                } else {
                    hedgeDiffPriceB2A = parseFloat(arr[1])
                }
            }
        }

Menguruskan maklumat tab status, menggunakan bentuk jadual

Membuat data tab status lebih teratur dan mudah dilihat.

        var tbl = {
            "type" : "table", 
            "title" : "数据", 
            "cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"], 
            "rows" : [], 
        }
        tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
        tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])

        LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")

img

Ujian semula

Ujian semula hanyalah strategi ujian, fungsi pengesanan awal, banyak bug pada peringkat ujian semula sebenarnya boleh diuji. Tidak perlu terlalu mementingkan hasil ujian semula, strategi akhir masih memerlukan peluru sebenar untuk dikesan dalam persekitaran sebenar.

img

img

Kod sumber strategi:https://www.fmz.com/strategy/302834


Berkaitan

Lebih lanjut

15570686905Strategi perdagangan ini adalah untuk menambah fungsi kontrak, dan yang terbaik adalah untuk menambah kontrak kekal, kontrak perpindahan.

Awan ringanMenarik, petikan semula main:127:9 - TypeError: Cannot read property 'SetPrecision' of undefined Strategi lindung nilai semasa untuk mata wang yang berbeza Ver 1.1

Mimpi kecilBaiklah, ini adalah peluang untuk mengajar.

Awan ringanSaya faham, terima kasih banyak.

Mimpi kecilUntuk menambah dua objek pertukaran.