Ajar anda cara memindahkan strategi bahasa (lanjutan)

Dicipta dalam: 2019-11-13 09:15:56, dikemas kini pada: 2024-12-15 16:02:09
comments   0
hits   2306

Ajar anda cara memindahkan strategi bahasa (lanjutan)

Ajar anda cara memindahkan strategi bahasa (lanjutan)

Artikel sebelumnyaAjar anda cara menulis strategi langkah demi langkah - pindahkan strategi bahasa sayaDalam artikel itu, kami menjalankan ujian pemindahan pada strategi bahasa Mai yang mudah Jika strategi bahasa Mai yang lebih kompleks, bagaimana untuk memindahkannya ke dalam bahasa JavaScript Apakah teknik untuk ini?

Mari kita lihat dahulu strategi yang akan dipindahkan 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;

Permulaan strategi bahasa ini(*backtest...*)Ia adalah kod konfigurasi tetapan ujian belakang Untuk memudahkan perbandingan, konfigurasi ujian belakang bersatu ditetapkan. Strategi ini juga merupakan strategi yang ditemui secara rawak, dan ia tidak terlalu rumit (berbanding dengan yang dalam artikel sebelumnya), dan ia merupakan strategi yang lebih representatif. Untuk memindahkan strategi bahasa Mai, anda mesti terlebih dahulu membaca kandungan strategi Kod strategi bahasa Mai secara relatifnya ringkas, dan pada asasnya anda boleh mempunyai pemahaman tertentu mengenai strategi ini menggunakan beberapa fungsi penunjuk.EMASMA

Bina roda dahulu

  • EMA Fungsi penunjuk ini mempunyai fungsi perpustakaan penunjuk siap sedia semasa menulis strategi dalam bahasa JavaScript pada platform FMZ. Sekarang:TA.MA

  • SMA Apa yang perlu kita lakukan ialahSMAKami mendapati bahawa fungsi penunjuk SMA tidak disokong dalam pustaka TA FMZ Terdapat juga perbezaan antara penunjuk SMA dalam pustaka talib dan yang dalam bahasa Mai. Ajar anda cara memindahkan strategi bahasa (lanjutan) Seperti yang anda lihat, sebagai tambahan kepada parameter tempoh, terdapat juga parameter berat dalam bahagian parameter.

Perihalan fungsi penunjuk SMA dalam perpustakaan talib dalam dokumentasi API FMZ ialah: Ajar anda cara memindahkan strategi bahasa (lanjutan)

nampaktalib.SMAMerupakan penunjuk purata bergerak mudah. Dengan cara ini, anda hanya boleh melaksanakannya sendiriSMASebagai pembangun yang menulis strategi menggunakan bahasa Javascript, ini juga merupakan salah satu kemahiran yang diperlukan Lagipun, jika tiada roda siap, kereta masih perlu dipandu, jadi bina satu sahaja.

Sejujurnya, tidak banyak kajian tentang penunjuk dan seumpamanya Secara amnya, jika saya tidak memahami sesuatu, saya hanya mencari dan mencari maklumat. Untuk SMA, kami mendapati perkara berikut: Ajar anda cara memindahkan strategi bahasa (lanjutan)

Saya merasakan bahawa proses algoritma yang diterangkan di sini agak boleh dipercayai.

  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 Bahagian Pengisian

Penggunaan Rangka Kerja DasarAjar anda cara menulis strategi langkah demi langkah - pindahkan strategi bahasa sayaRangka kerja yang sama dalam artikel terutamanya mengisi dua bahagian: Ajar anda cara memindahkan strategi bahasa (lanjutan)

Pertama, lakukan pemprosesan data pasaran dan pengiraan penunjuk. Ajar anda cara memindahkan strategi bahasa (lanjutan)

Kami akan menangani fungsi bahasa Mai satu persatu:

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

Ayat ini boleh difahami sebagai menambah harga tertinggi, harga terendah dan harga penutup setiap BAR dalam data garis K dan membahagikannya dengan 3, mengira purata, dan kemudian menyimpannya sebagai tatasusunan, sepadan dengan setiap BAR satu dengan satu. Ini boleh dikendalikan 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 sahaja fungsi ini dalam fungsi OnTick gelung utama, sebagai contoh:

  // 计算指标
  // AP
  var ap = CalcAP(records)
  • 2. Selepas pengiraan AP selesai, teruskan mengiraESA:=EMA(AP,N1);:

Di sini kita perlu menggunakan data AP yang dikira pada langkah sebelumnya untuk mengira ESA Sebenarnya, ESA ini adalah “purata pergerakan eksponen” AP, iaitu penunjuk EMA, jadi kita menggunakan AP sebagai data dan N1 sebagai. parameter penunjuk EMA untuk mengira penunjuk 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 dikiraAPESAKira dataD。 Anda boleh melihat ulasan kod di sini untuk beberapa petua tentang pengiraan penunjuk.

  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); Kaedah pengiraan ini adalah serupa dengan langkah 1, dan kod dilepaskan terus.
  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); Cuma kira penunjuk EMA untuk tatasusunan 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 kami bina tadi.SMAfungsi.

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

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

Pemindahan isyarat dagangan adalah sangat mudah.

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

Membaca ayat-ayat kod bahasa Mai ini, kita boleh tahu bahawa salib emas dan penghakiman silang mati dua garis penunjuk WT1 dan WT2 digunakan sebagai syarat untuk membuka kedudukan Perlu diingat bahawa isyarat silang sebelumnya digunakan. Uji balik strategi secara langsung dengan bahasa mikrofon, dan kami perhatikan: Ajar anda cara memindahkan strategi bahasa (lanjutan)

Melalui operasi sebenar Strategi Bahasa Mai, dapat dilihat apabila isyarat dikesan pada titik pembukaan, ia sebenarnya mengesan sama ada kedudukan 2 BAR sebelum titik pembukaan adalah salib emas. Ia dapat dilihat dengan jelas daripada rajah di atas: Ajar anda cara memindahkan strategi bahasa (lanjutan) Ajar anda cara memindahkan strategi bahasa (lanjutan)

Kod pengisian bahagian pengesanan isyarat boleh 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 boleh fikirkan mengapa arahan SPK dan BPK bahasa Mai boleh dilaksanakan dengan kod di atas.

Ujian belakang

Konfigurasi ujian belakang: Ajar anda cara memindahkan strategi bahasa (lanjutan)

Ujian belakang versi bahasa Mai: Ajar anda cara memindahkan strategi bahasa (lanjutan)

Ujian belakang versi JavaScript: Ajar anda cara memindahkan strategi bahasa (lanjutan) Ajar anda cara memindahkan strategi bahasa (lanjutan)

Kod pada permulaan fungsi OnTick digunakan untuk mempercepatkan proses ujian belakang dan untuk menjalankan strategi berdasarkan model harga penutupan Jika anda berminat, anda boleh 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
    }
    ...
    ..
    .

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

Terima kasih kerana membaca