Rancangan Perdagangan

Penulis:Mimpi kecil, Dicipta: 2019-08-06 17:15:13, Dikemas kini: 2023-10-20 20:06:49

img

Rancangan Perdagangan

Artikel ini bertujuan untuk membincangkan beberapa pengalaman dalam pembangunan strategi, serta beberapa teknik kecil yang boleh memberi pembaca idea tentang strategi perdagangan yang berkembang dengan cepat. Apabila kita menghadapi masalah yang serupa dalam reka bentuk strategi, kita boleh segera membuat penyelesaian yang munasabah. Platform perdagangan kuantitatif pencipta digunakan sebagai platform pengajaran, ujian dan latihan. Bahasa pengaturcaraan strategi: JavaScript Pasaran dagangan: Pasaran aset blockchain (BTC, ETH dan lain-lain)

  • Pengambilan dan pemprosesan data

    Biasanya berdasarkan logik strategi yang berbeza, mungkin menggunakan beberapa antara muka yang berbeza untuk mendapatkan data pasaran, kerana logik dagangan strategi biasanya didorong oleh data pasaran ((juga tentu ada beberapa strategi yang tidak melihat pasaran, seperti strategi pertaruhan).

    • GetTicker: Dapatkan pasaran tik secara langsung. Biasanya digunakan untuk mendapatkan harga terkini dengan cepat, beli satu harga, jual satu harga.

    • GetDepth: Memperoleh pesanan dalam pasaran yang tipis. Biasanya digunakan untuk mendapatkan harga setiap barangan, jumlah pesanan. Ia digunakan untuk strategi lindung nilai, strategi pasaran, dan sebagainya.

    • GetTrade: Dapatkan rekod transaksi terkini di pasaran. Biasanya digunakan untuk menganalisis tingkah laku pasaran dalam masa yang singkat, menganalisis perubahan mikro pasaran. Biasanya digunakan untuk strategi frekuensi tinggi, strategi algoritma.

    • GetRecords: Dapatkan data K-line pasaran. Biasanya digunakan sebagai strategi pengesanan trend. Ia digunakan untuk mengira penunjuk.

    • Membolehkan

      Dalam reka bentuk strategi, pemula biasanya mengabaikan pelbagai keadaan yang salah, secara intuitif menganggap bahawa hasil pelaksanaan setiap pautan dalam strategi adalah ditetapkan. Tetapi sebenarnya tidak demikian, dan pelbagai keadaan yang tidak dijangka juga akan berlaku semasa menjalankan program strategi, ketika meminta data pasaran. Sebagai contoh, beberapa antara muka industri telah mengembalikan data yang luar biasa:

      var depth = exchange.GetDepth()
      
      // depth.Asks[0].Price < depth.Bids[0].Price      卖一价格低于了买一价格,这种情况不可能存在于盘面上,
      //                                                因为卖出的价格低于买入的价格,必定已经成交了。
      // depth.Bids[n].Amount = 0                       订单薄买入列表第n档,订单量为0
      // depth.Asks[m].Price = 0                        订单薄卖出列表第m档,订单价格为0
      

      Atau secara langsung exchange.GetDepth ((() mengembalikan nilai null.

      "Sudah banyak kejadian aneh seperti ini. Oleh itu, kita perlu mengambil tindakan yang sesuai untuk masalah yang dapat diramalkan ini, yang dipanggil pemprosesan kesalahan.

      Pengendalian kesilapan biasanya dilakukan dengan membuang data dan mendapatkannya semula.

      Contohnya:

      function main () {
          while (true) {
              onTick()
              Sleep(500)
          }
      }
      
      function GetTicker () {
          while (true) {
              var ticker = exchange.GetTicker()
              if (ticker.Sell > ticker.Buy) {       // 以 检测卖一价格是不是小于买一价这个错误的容错处理为例,
                                                    // 排除这个错误,当前函数返回 ticker 。
                  return ticker
              }
              Sleep(500)
          }
      }
      
      function onTick () {
          var ticker = GetTicker()                  // 确保获取到的 ticker 不会存在 卖一价格小于买一价格这种数据错误的情况。
          // ...  具体的策略逻辑
      }
      

      Pengendalian kesalahan lain yang boleh diramalkan boleh digunakan dengan cara yang sama. Prinsip reka bentuk adalah bahawa anda tidak boleh memberikan data yang salah untuk memandu logik strategi.

    • Penggunaan data K-line

      Mengambil data K-Line dan memanggil:

      var r = exchange.GetRecords()
      

      Data K-line yang diperoleh adalah satu susunan aritmatika, seperti ini:

      [
          {"Time":1562068800000,"Open":10000.7,"High":10208.9,"Low":9942.4,"Close":10058.8,"Volume":6281.887000000001},
          {"Time":1562072400000,"Open":10058.6,"High":10154.4,"Low":9914.5,"Close":9990.7,"Volume":4322.099},
          ...
          {"Time":1562079600000,"Open":10535.1,"High":10654.6,"Low":10383.6,"Close":10630.7,"Volume":5163.484000000004}
      ]
      

      Anda boleh lihat setiap kurung bunga.{}Antara yang termasuk ialah: masa, harga bukaan, harga tertinggi, harga terendah, harga penutupan, jumlah dagangan. Ini adalah tiang garis K. Data garis K biasa digunakan untuk mengira penunjuk, contohnya: garis purata MA, MACD, dan lain-lain. Masukkan data garis K sebagai parameter (data mentah) dan set parameter penunjuk, untuk mengira fungsi data penunjuk, yang kita sebut sebagai fungsi penunjuk. Terdapat banyak fungsi penunjuk pada platform perdagangan kuantiti pencipta.

      Sebagai contoh, kita mengira penunjuk rata-rata yang berbeza mengikut kitaran data K yang kita masukkan, yang dihitung adalah rata-rata kitaran yang sepadan. Sebagai contoh, data K-line harian yang dihantar (satu tiang K-line mewakili satu hari) dikira adalah garis purata harian, sama seperti jika data K-line yang dihantar oleh fungsi penunjuk garis purata adalah tempoh 1 jam, maka penunjuk yang dikira adalah garis purata 1 jam.

      Jika saya mahu mengira garis purata 5 hari, kita perlu menyediakan data garis purata K hari pertama:

      var r = exchange.GetRecords(PERIOD_D1)  // 给GetRecords 函数传入参数 PERIOD_D1就是指定获取日K线,
                                              // 具体函数使用可以参看:https://www.fmz.com/api#GetRecords
      

      Dengan data garis K hari, kita boleh mengira garis rata, jika kita ingin mengira garis rata 5 hari, maka kita perlu menetapkan parameter indikator fungsi indikator kepada 5.

      var ma = TA.MA(r, 5)        // TA.MA() 就是指标函数,用来计算均线指标,第一个参数设置刚才获取的日K线数据r,
                                  // 第二个参数设置5,计算出来的就是5日均线,其它指标函数同理。
      

      Kami mengabaikan satu masalah yang berpotensi, jika terdapat kurang daripada 5 tiang K dalam data garis K hari r, bagaimana untuk mengira penunjuk rata-rata 5 hari yang berkesan? Jawapannya adalah tidak. Kerana penunjuk garis rata adalah nilai purata harga penutupan untuk sebilangan besar tiang K.

      img

      Oleh itu, sebelum menggunakan data garis K, fungsi penunjuk mengira data penunjuk, perlu dipastikan sama ada jumlah tiang garis K dalam data garis K memenuhi syarat pengiraan penunjuk (parameter penunjuk).

      Oleh itu, sebelum mengira garis purata 5 hari, kita perlu menilai bahawa kod lengkap adalah sebagai berikut:

      function CalcMA () {
          var r = _C(exchange.GetRecords, PERIOD_D1)     // _C() 是容错函数,目的就是避免 r 为 null , 具体可以查询文档:https://www.fmz.com/api#_C
          if (r.length > 5) {
              return TA.MA(r, 5)                         // 用均线指标函数 TA.MA 计算出均线数据,做为函数返回值,返回。
          }
      
          return false 
      }
      
      function main () {
          var ma = CalcMA()
          Log(ma)
      }
      

      img

      Ujian semula menunjukkan: [null, null, null, null, 428.7, 4402.9400000000005,... ]

      Anda dapat melihat bahawa indikator rata-rata 5 hari dikira, 4 yang pertama adalah sifar, kerana jumlah tiang K kurang dari 5, tidak dapat mengira rata-rata.

    • Tips untuk menilai kemas kini K-Line

      Skenario sering berlaku apabila kita menulis beberapa strategi, kita perlu memproses beberapa operasi atau mencetak beberapa log apabila setiap kitaran K baris selesai. Bagaimana kita boleh mencapai fungsi ini? Bagi pemula yang tidak mempunyai pengalaman pengaturcaraan, mungkin tidak tahu apa mekanisme yang akan digunakan untuk menangani, di sini kita memberi tips langsung.

      Apabila kita memutuskan bahawa satu kitaran K baris telah selesai, kita boleh mulakan dari sifat masa dalam data K baris, setiap kali kita mendapatkan data K baris, kita akan memutuskan sama ada nilai sifat Time telah berubah dalam data K baris terakhir data K baris ini, jika terdapat perubahan, ia mewakili bahawa terdapat K baris baru yang dihasilkan (menunjukkan bahawa kitaran K baris sebelumnya yang baru dihasilkan telah selesai), jika tidak ada perubahan, ia mewakili bahawa tidak ada K baris baru yang dihasilkan pada kitaran terakhir yang sedang berlaku (K baris kitaran belum selesai).

      Jadi kita perlu mempunyai satu pembolehubah untuk merakam data pada baris K pada baris K terakhir.

      var r = exchange.GetRecords()
      var lastTime = r[r.length - 1].Time       // lastTime 用来记录最后一根K线柱的时间。
      

      Dalam aplikasi praktikal, ia biasanya mempunyai struktur seperti ini:

      function main () {
          var lastTime = 0
          while (true) {
              var r = _C(exchange.GetRecords)
              if (r[r.length - 1].Time != lastTime) {
                  Log("新K线柱产生")
                  lastTime = r[r.length - 1].Time      // 一定要更新 lastTime ,这个至关重要。
      
                  // ... 其它处理逻辑
                  // ...
              }
      
              Sleep(500)
          }
      }
      

      img

      Seperti yang dapat dilihat dalam pengesanan semula, kitaran K baris ditetapkan sebagai hari (exchange.GetRecords tidak menetapkan parameter semasa panggilan fungsi, tetapi mengikut kitaran K baris yang ditetapkan sebagai parameter lalai), setiap kali tiang K baris baru muncul, log dicetak.

  • Pengiraan numerik

    • Mengira masa yang diperlukan untuk mengakses antara muka pertukaran

      Jika anda ingin melihat atau mengawal masa yang diperlukan untuk mengakses antara muka pertukaran secara strategik, anda boleh menggunakan kod berikut:

      function main () {
          while (true) {
              var beginTime = new Date().getTime()
              var ticker = exchange.GetTicker()
              var endTime = new Date().getTime()
      
              LogStatus(_D(), "GetTicker() 函数耗时:", endTime - beginTime, "毫秒")
              Sleep(1000)
          } 
      }
      

      Secara ringkasnya, ia adalah dengan menggunakan waktu yang direkodkan selepas panggilan fungsi GetTicker dikurangkan daripada masa sebelum panggilan, untuk mengira jumlah milidetik yang dialami, iaitu masa yang diambil oleh fungsi GetTicker dari pelaksanaan sehingga hasil yang dikembalikan.

    • Menggunakan Math.min / Math.max untuk mengehadkan had angka

      Jika anda mahu nilai mempunyai had, biasanya gunakan had Math.min

      Sebagai contoh, dalam proses penjualan, jumlah yang dijual tidak boleh lebih besar daripada jumlah syiling yang ada di akaun. Jika jumlah wang yang ada dalam akaun lebih besar, maka pesanan akan diproses dengan salah.

      Biasanya, ia dikendalikan dengan cara ini: Sebagai contoh, rancangan untuk menjual 0.2 sen.

      var planAmount = 0.2
      var account = _C(exchange.GetAccount)
      var amount = Math.min(account.Stocks, planAmount)
      

      Dengan cara ini, anda akan memastikan bahawa jumlah wang yang akan diorder tidak melebihi jumlah wang yang ada dalam akaun anda.

      Begitu juga, Math.max digunakan untuk memastikan had bawah nilai. Di mana situasi ini biasanya berlaku? Bursa biasa mempunyai had jumlah pesanan minimum untuk beberapa pasangan dagangan, dan jika jumlah pesanan minimum ini di bawah, mereka akan menolak pesanan; ini juga gagal. Anggap BTC biasanya mempunyai jumlah minimum 0.01 unit. Strategi Perdagangan Dengan mengira kadang-kadang mungkin untuk menghasilkan jumlah yang lebih kecil daripada 0.01 unit, jadi kita boleh menggunakan Math.max untuk memastikan jumlah yang paling kecil.

    • Jumlah pesanan, harga, kawalan ketepatan

      Ia boleh digunakan untuk mengawal ketepatan dengan menggunakan fungsi _N() atau fungsi SetPrecision.

      Fungsi SetPrecision ((() hanya ditetapkan sekali dan akan memotong secara automatik bilangan bilangan kecil yang berlebihan dalam jumlah dan harga dalam sistem.

      Fungsi _N() adalah untuk melakukan pemotongan digit kecil terhadap suatu nilai

      Contohnya:

      var pi = _N(3.141592653, 2)
      Log(pi)
      

      Nilai pi telah dipotong dengan bilangan kecil dan mengekalkan bilangan kecil 2 digit iaitu: 3.14

      Untuk maklumat lanjut, lihat dokumentasi API.

  • Beberapa tetapan logik

    • Menetapkan masa, menjalankan beberapa operasi mengikut kitaran masa tertentu

      Mekanisme seperti ini boleh digunakan, dengan kaedah pengesanan timeout, untuk menentukan timeout semasa dikurangkan dari timeout masa tamat tugas penjadwalan terakhir, dan mengira masa yang telah berlalu secara langsung apabila masa yang telah berlalu melebihi panjang masa yang ditetapkan, iaitu untuk menjalankan operasi baru.

      Sebagai contoh, ia digunakan dalam strategi pelaburan.

      var lastActTime = 0
      var waitTime = 1000 * 60 * 60 * 12   // 一天的毫秒数
      function main () {
          while (true) {
              var nowTime = new Date().getTime()
              if (nowTime - lastActTime > waitTime) {
                  Log("执行定投")
                  // ... 具体的定投操作,买入操作。
      
      
                  lastActTime = nowTime
              }
      
              Sleep(500)
          }
      }
      

      Ini adalah contoh yang mudah.

    • Reka bentuk mekanisme pemulihan automatik untuk dasar

      Dengan menggunakan fungsi _G() yang diukur oleh pencipta, dan keluar dari fungsi simpanan, sangat mudah untuk merancang dasar untuk keluar dari kemajuan simpanan dan memulakan semula keadaan pemulihan automatik.

      var hold = {
          price : 0, 
          amount : 0,
      }
      
      function main () {
          if (_G("hold")) {
              var ret = _G("hold")
              hold.price = ret.price
              hold.amount = ret.amount
              Log("恢复 hold:", hold)
          }
      
          var count = 1
          while (true) {
              // ... 策略逻辑
              // ... 策略运行中,可能开仓,交易,把开仓的持仓价格赋值给 hold.price ,开仓的数量赋值给 hold.amount,用以记录持仓信息。
      
              hold.price = count++     // 模拟一些数值
              hold.amount = count/10   // 模拟一些数值
      
              Sleep(500)
          }
      }
      
      function onexit () {    // 点击机器人上的停止按钮,会触发执行这个函数,执行完毕机器人停止。
          _G("hold", hold)
          Log("保存 hold:", JSON.stringify(hold))
      }
      

      img

      Seperti yang dapat dilihat, setiap kali bot berhenti, data dalam objek hold disimpan, dan setiap kali ia dihidupkan semula, data dibaca, mengembalikan nilai hold ke keadaan sebelum berhenti. Sudah tentu, ini adalah satu contoh sederhana, jika digunakan dalam strategi sebenar, ia harus direka berdasarkan data penting yang perlu dipulihkan dalam strategi (secara amnya maklumat akaun, pegangan, jumlah keuntungan, arah dagangan, dan lain-lain). Sudah tentu, anda juga boleh menetapkan beberapa syarat, sama ada pemulihan akan dilakukan.

Berikut adalah beberapa petua kecil untuk membangunkan strategi dan kami berharap ia akan membantu anda yang baru mula dan juga pembangun strategi! Semoga anda mendapat kejayaan yang panjang.


Berkaitan

Lebih lanjut

Weix1aoTerima kasih untuk berkongsi, sangat sesuai untuk pemula yang baru mula menulis tanpa memahami api, dan juga tanyakan apakah platform kami menyokong versi yang lebih tinggi, seperti biasa menggunakan?.

MAIKEOSyukur kepada Dream God! Dream God guru, betul-betul WWE ganda penuh, teknologi pengaturcaraan yang tinggi, artikel yang baik, mengagumkan!!!

Mimpi kecilSelamat datang, kini disokong oleh standard ES8.

Mimpi kecilTerima kasih kerana menyokong FMZ Quantify!