Tangan-tangan mengajarkan Anda strategi untuk mentransportasi bahasa Melayu (dalam proses).

Penulis:Mimpi kecil, Dibuat: 2019-11-13 09:15:56, Diperbarui: 2023-10-17 21:23:21

img

Tangan-tangan mengajarkan Anda strategi untuk mentransportasi bahasa Melayu (dalam proses).

Artikel SebelumnyaTangan mengajarkan Anda menulis strategi -- mentransfer strategi bahasa saya.Saya telah melakukan tes pemindahan untuk strategi bahasa Maya yang sederhana, bagaimana jika itu adalah bahasa Maya yang sedikit lebih rumit, bagaimana cara memindahkan strategi ke bahasa JavaScript?

Pertama, mari kita lihat strategi transplantasi 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;

Bagian awal dari strategi bahasa Melayu ini(*backtest...*)Untuk memudahkan perbandingan, mengatur konfigurasi retargeting yang seragam. Strategi ini juga merupakan strategi pencarian acak, tidak terlalu rumit (lebih rumit dibandingkan artikel sebelumnya), dan merupakan strategi yang lebih representatif. Memindahkan strategi bahasa Mac, pertama-tama untuk melihat isi strategi, kode strategi bahasa Mac lebih sederhana, pada dasarnya dapat melihat strategi secara keseluruhan, yang kita lihat menggunakan beberapa fungsi indikator.EMASMA

Pembuatan roda

  • EMA Fungsi indikator ini, adalah fungsi perpustakaan indikator yang langsung tersedia saat menulis kebijakan di platform FMZ menggunakan bahasa JavaScript, yaitu:TA.MA

  • SMA Yang perlu kita lakukan adalah:SMAIni adalah indikator yang kami temukan di FMZ's TA library yang tidak mendukung fungsi SMA, dan ada perbedaan antara indikator SMA di talib library dan bahasa Melayu:imgSeperti yang bisa dilihat, bagian parameter selain parameter siklus, ada juga parameter bobot.

    Fungsi indikator SMA dalam Talib di dokumen FMZ API dijelaskan sebagai berikut:img

    Lihattalib.SMAIni adalah indikator rata-rata bergerak sederhana. Dengan cara ini, Anda hanya bisa memulai sebuah usaha sendiri.SMAYa, sebagai pengembang yang menulis strategi menggunakan bahasa JavaScript, ini juga merupakan salah satu keterampilan yang diperlukan, karena jika tidak ada roda siap pakai, mobil akan tetap berjalan, membuat satu saja.

    Sejujurnya, tidak banyak penelitian tentang indikator-indikator seperti ini, dan umumnya orang-orang tidak mengerti tentang pencarian, mencari informasi.img

    Saya merasa proses algoritma ini sangat dapat diandalkan, cobalah:

    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

Menggunakan kerangka kerja strategisTangan mengajarkan Anda menulis strategi -- mentransfer strategi bahasa saya.Artikel ini memiliki kerangka kerja yang sama, yang terdiri dari dua bagian:img

Pertama, proses data pasar, penghitungan indikator.img

Kami akan membahas fungsi dari bagian bahasa Melayu ini satu per satu:

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

    Hal ini dapat dipahami sebagai menambahkan harga tertinggi, harga minimum, dan harga penutupan dari setiap BAR dalam data garis K, kemudian dibagi dengan 3, menghitung rata-rata, dan menyimpannya sebagai suatu aritmatika, dan setiap BAR memiliki satu korespondensi. Ini bisa dilakukan dengan cara 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 
    }
    

    Fungsi ini dapat dipanggil dalam fungsi OnTick pada loop utama, misalnya:

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

    Untuk menghitung ESA menggunakan data AP yang dihitung pada langkah sebelumnya, sebenarnya ESA adalah " moving average " dari AP, yaitu EMA, jadi kita bisa menghitung EMA dengan menggunakan AP sebagai data, N1 sebagai parameter dari 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);

    MenggunakanAPESAPerhitungan dataDSaya tidak tahu. Di sini Anda dapat melihat komentar kode, beberapa teknik penghitungan 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);Cara menghitung ini mirip dengan langkah 1, langsung keluarkan kode.

    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); Hanya menghitung indikator EMA dari matriks 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);

    Dan langkah terakhir adalah menggunakan roda yang telah kita buat sebelumnya.SMAFungsi tersebut.

    function CalcWT2 (wt1) {    // WT2:SMA(WT1,4,1);
        if (wt1.length <= 4) {
            return false 
        }  
    
        return SMA(wt1, 4, 1)   // 使用我们自己实现的SMA函数计算出wt1的SMA指标。
    }
    

Transplantasi sinyal transaksi sangat sederhana.

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

Membaca beberapa kalimat kode bahasa Melayu ini, dapat diketahui bahwa untuk kedua garis indikator WT1 dan WT2 adalah garpu emas, garpu mati, penilaian sebagai kondisi untuk membuka perdagangan, perlu dicatat bahwa yang digunakan adalah sinyal silang sebelumnya. Dengan menggunakan strategi bahasa Melayu secara langsung, kita dapat melihat:img

Dengan menggunakan strategi bahasa Ma, kita dapat melihat bahwa saat deteksi titik buka sinyal, sebenarnya deteksi titik buka adalah apakah BAR berada di posisi dua BAR sebelumnya; Gambar di atas dapat dilihat dengan jelas:img img

Kode pengisian bagian deteksi sinyal dapat ditulis sebagai berikut:

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 Anda dapat berpikir mengapa instruksi SPK, BPK dalam bahasa Melayu dapat diimplementasikan dengan kode di atas.

Pengamatan

Periksa kembali konfigurasi:img

Dia mengatakan bahwa dia tidak akan membiarkan orang-orang yang dia cintai pergi.img

Versi Javascript yang diperiksa:img img

Bagian awal dari kode fungsi OnTick, yang digunakan untuk mempercepat retargeting, adalah untuk membuat strategi berjalan dengan model harga penutupan, yang menarik untuk dianalisis secara detail.

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 yang lengkap:https://www.fmz.com/strategy/174457

Terima kasih sudah membaca.


Berkaitan

Lebih banyak