Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Dibuat di: 2019-11-13 09:15:56, diperbarui pada: 2024-12-15 16:02:09
comments   0
hits   2306

Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Artikel sebelumnyaAjari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa sayaDalam artikel ini, kami melakukan uji coba transplantasi pada strategi bahasa Mai yang sederhana. Jika strategi bahasa Mai sedikit lebih rumit, bagaimana cara mentransplantasikannya ke bahasa JavaScript? Apa saja teknik untuk melakukannya?

Mari kita lihat terlebih dahulu strategi yang akan ditransplantasikan kali ini:

(*backtest
start: 2019-05-01 00:00:00
end: 2019-11-12 00:00:00
period: 1d
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
args: [["SlideTick",10,126961],["ContractType","quarter",126961]]
*)

N1:=10;
N2:=21;
AP:=(HIGH+LOW+CLOSE)/3;
ESA:=EMA(AP,N1);
D:=EMA(ABS(AP-ESA),N1);
CI:=(AP-ESA)/(0.015*D);
TCI:=EMA(CI,N2);
WT1:TCI;
WT2:SMA(WT1,4,1);
AA:=CROSS(WT1,WT2);
BB:=CROSSDOWN(WT1,WT2);
REF(AA,1),BPK;
REF(BB,1),SPK;

Awal dari strategi bahasa ini(*backtest...*)Ini adalah kode konfigurasi pengaturan backtest. Untuk memudahkan perbandingan, konfigurasi backtest terpadu ditetapkan. Strategi ini juga merupakan strategi yang ditemukan secara acak, dan tidak terlalu rumit (dibandingkan dengan strategi dalam artikel sebelumnya), dan merupakan strategi yang lebih representatif. Untuk mentransplantasikan strategi bahasa Mai, Anda harus terlebih dahulu membaca konten strategi tersebut. Kode strategi bahasa Mai relatif ringkas, dan pada dasarnya Anda dapat memiliki pemahaman tertentu tentang strategi secara keseluruhan. Strategi ini menggunakan beberapa fungsi indikator.EMASMA

Bangun roda terlebih dahulu

  • EMA Fungsi indikator ini memiliki fungsi pustaka indikator siap pakai saat menulis strategi dalam bahasa JavaScript pada platform FMZ. Sekarang:TA.MA

  • SMA Apa yang perlu kita lakukan adalahSMAKami menemukan bahwa fungsi indikator SMA tidak didukung di pustaka TA FMZ. Ada juga perbedaan antara indikator SMA di pustaka talib dan yang ada di bahasa Mai: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut) Seperti yang Anda lihat, selain parameter periode, ada juga parameter bobot di bagian parameter.

Deskripsi fungsi indikator SMA di pustaka talib dalam dokumentasi API FMZ adalah: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

bisa dilihattalib.SMAMerupakan indikator rata-rata bergerak sederhana. Dengan cara ini, Anda hanya dapat menerapkannya sendiriSMASebagai developer yang menulis strategi menggunakan bahasa Javascript, ini juga merupakan salah satu keterampilan yang dibutuhkan. Toh, kalau belum ada roda yang siap pakai, mobil tetap perlu dikendarai, jadi bikin saja.

Sejujurnya, belum banyak penelitian tentang indikator dan sejenisnya. Umumnya, jika saya tidak memahami sesuatu, saya hanya mencari dan mencari informasi. Untuk SMA, kami menemukan hal berikut: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Saya merasa bahwa proses algoritma yang dijelaskan di sini cukup dapat diandalkan. Mari kita terapkan:

  function SMA (arr, n, m) {
      var sma = []
      var currSMA = null
      for (var i = 0; i < arr.length; i++) {
          if (arr[i] && !isNaN(arr[i])) {
              if (!currSMA) {
                  currSMA = arr[i]
                  sma.push(currSMA)
                  continue
              }  

              // [M*C2+(N-M)*S1]/N
              currSMA = (m * arr[i] + (n - m) * currSMA) / n
              sma.push(currSMA)
          } else {
              sma.push(NaN)
          }
      }  

      return sma
  }

Menulis Bagian Pengisian

Penggunaan Kerangka KebijakanAjari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa sayaKerangka kerja yang sama dalam artikel ini terutama mengisi dua bagian: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Pertama, lakukan pemrosesan data pasar dan perhitungan indikator. Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Mari kita bahas fungsi bahasa Mai satu per satu:

  • 1、AP:=(HIGH+LOW+CLOSE)/3;

Kalimat ini dapat dipahami dengan menjumlahkan harga tertinggi, harga terendah, dan harga penutupan setiap BAR pada data K-line dan membaginya dengan 3, menghitung rata-ratanya, kemudian menyimpannya dalam bentuk array, yang mana setiap BAR bersesuaian satu per satu. satu. Hal ini dapat ditangani seperti ini:

  function CalcAP (r) {   // AP:=(HIGH+LOW+CLOSE)/3;
      var arrAP = []      // 声明一个空数组

      for (var i = 0; i < r.length; i++) {      // r为传入的K线数据,是一个数组,用for遍历这个数组
          v = (r[i].High + r[i].Low + r[i].Close) / 3      // 计算 平均值
          arrAP.push(v)                                    // 添加在 arrAP数组的尾部,arrAP是空的时候尾部就是第一个。
      }  

      return arrAP     // 返回 这个平均值数组,即麦语言中计算的 AP 
  }

Panggil saja fungsi ini di fungsi OnTick loop utama, misalnya:

  // 计算指标
  // AP
  var ap = CalcAP(records)
  • 2. Setelah perhitungan AP selesai, lanjutkan dengan perhitunganESA:=EMA(AP,N1);:

Di sini kita perlu menggunakan data AP yang dihitung pada langkah sebelumnya untuk menghitung ESA. Faktanya, ESA ini adalah “rata-rata pergerakan eksponensial” dari AP, yaitu indikator EMA, jadi kita menggunakan AP sebagai data dan N1 sebagai parameter indikator EMA untuk menghitung indikator EMA.

  function CalcESA (ap, n1) {   // ESA:=EMA(AP,N1);
      if (ap.length <= n1) {    // 如果AP的长度小于指标参数,是无法计算出有效数据的,这个时候让函数返回false。
          return false
      }  

      return TA.EMA(ap, n1)
  }
  • 3、D:=EMA(ABS(AP-ESA),N1);

Gunakan yang dihitungAPESAHitung dataD。 Anda dapat melihat komentar kode di sini untuk beberapa kiat tentang perhitungan indikator.

  function CalcD (ap, esa, n1) {    // D:=EMA(ABS(AP-ESA),N1);
      var arrABS_APminusESA = []
      if (ap.length != esa.length) {
          throw "ap.length != esa.length"
      }  

      for (var i = 0; i < ap.length; i++) {
          // 计算指标数值时,必须判断一下数据的有效性,因为前几次EMA计算可能数组中的开始部分的数据是NaN,或者null
          // 所以必须判断,参与计算的数据都是有效数值才能进行,如果有任何无效数值,就用NaN向arrABS_APminusESA填充
          // 这样计算得到的数据,每个位置和之前的数据都是一一对应的,不会错位。
          if (ap[i] && esa[i] && !isNaN(ap[i]) && !isNaN(esa[i])) {
              v = Math.abs(ap[i] - esa[i])     // 根据ABS(AP-ESA) , 具体计算数值,然后放入arrABS_APminusESA数组
              arrABS_APminusESA.push(v)
          } else {
              arrABS_APminusESA.push(NaN)
          }
      }  

      if (arrABS_APminusESA.length <= n1) {
          return false
      }  

      return TA.EMA(arrABS_APminusESA, n1)    // 计算数组arrABS_APminusESA的EMA指标,得到数据D(数组结构)
  }
  • 4、CI:=(AP-ESA)/(0.015*D); Metode perhitungan ini mirip dengan langkah 1, dan kodenya dirilis secara langsung.
  function CalcCI (ap, esa, d) {    // CI:=(AP-ESA)/(0.015*D);
      var arrCI = []
      if (ap.length != esa.length || ap.length != d.length) {
          throw "ap.length != esa.length || ap.length != d.length"
      }
      for (var i = 0; i < ap.length; i++) {
          if (ap[i] && esa[i] && d[i] && !isNaN(ap[i]) && !isNaN(esa[i]) && !isNaN(d[i])) {
              v = (ap[i] - esa[i]) / (0.015 * d[i])
              arrCI.push(v)
          } else {
              arrCI.push(NaN)
          }
      }  

      if (arrCI.length == 0) {
          return false
      }  

      return arrCI
  }
  • TCI:=EMA(CI,N2); Hitung saja indikator EMA untuk array CI.
  function CalcTCI (ci, n2) {   // TCI:=EMA(CI,N2);
      if (ci.length <= n2) {
          return false
      }  

      return TA.EMA(ci, n2)
  }
  • WT2:SMA(WT1,4,1);

Langkah terakhir ini menggunakan roda yang kita buat sebelumnya.SMAfungsi.

  function CalcWT2 (wt1) {    // WT2:SMA(WT1,4,1);
      if (wt1.length <= 4) {
          return false 
      }  

      return SMA(wt1, 4, 1)   // 使用我们自己实现的SMA函数计算出wt1的SMA指标。
  }

Transplantasi sinyal perdagangan sangatlah sederhana.

AA:=CROSS(WT1,WT2);
BB:=CROSSDOWN(WT1,WT2);
REF(AA,1),BPK;
REF(BB,1),SPK;

Dengan membaca kalimat kode bahasa Mai ini, kita dapat mengetahui bahwa penilaian golden cross dan dead cross dari dua garis indikator WT1 dan WT2 digunakan sebagai kondisi untuk membuka posisi. Perlu dicatat bahwa sinyal cross sebelumnya digunakan. Langsung uji ulang strategi tersebut dengan bahasa mikrofon, dan kita amati: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Melalui pengoperasian Strategi Bahasa Mai yang sebenarnya, dapat diketahui bahwa ketika suatu sinyal dideteksi pada titik pembukaan, sebenarnya ia mendeteksi apakah posisi 2 BAR sebelum titik pembukaan merupakan sebuah golden cross. Hal ini dapat dilihat dengan jelas dari gambar di atas: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut) Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Kode pengisian bagian deteksi sinyal dapat ditulis sebagai:

if ((_State == IDLE || _State == SHORT) && wt1[wt1.length - 4] < wt2[wt2.length - 4] && wt1[wt1.length - 3] > wt2[wt2.length - 3]) {
    if (_State == IDLE) {
        _State = OPENLONG
        Log("OPENLONG")    // 测试
    }
    if (_State == SHORT) {
        _State = COVERSHORT
        Log("COVERSHORT")  // 测试
    }
    isOK = false  
}

if ((_State == IDLE || _State == LONG) && wt1[wt1.length - 4] > wt2[wt2.length - 4] && wt1[wt1.length - 3] < wt2[wt2.length - 3]) {
    if (_State == IDLE) {
        _State = OPENSHORT
        Log("OPENSHORT")  // 测试
    }
    if (_State == LONG) {
        _State = COVERLONG
        Log("COVERLONG")  // 测试
    }
    isOK = false   
}

Di sini kita dapat memikirkan mengapa instruksi SPK dan BPK bahasa Mai dapat diimplementasikan dengan kode di atas.

Pengujian ulang

Konfigurasi uji ulang: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Uji coba ulang versi bahasa Mai: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Uji coba ulang versi JavaScript: Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut) Mengajarkan Anda cara mentransplantasikan strategi bahasa (tingkat lanjut)

Kode di awal fungsi OnTick digunakan untuk mempercepat proses backtesting dan menjalankan strategi berdasarkan model harga penutupan. Jika Anda tertarik, Anda dapat menganalisisnya secara terperinci.

function OnTick(){
    // 驱动策略的行情处理部分
    var records = _C(exchange.GetRecords)
    if (records[records.length - 1].Time == preTime) {
        if (isOK) {
            Sleep(500)
            return 
        }
    } else {
        preTime = records[records.length - 1].Time
    }
    ...
    ..
    .

Kode strategi pengajaran lengkap: https://www.fmz.com/strategy/174457

Terima kasih sudah membaca