Tangan mengajar anda strategi pemindahan bahasa Melayu (dalam tahap lanjutan)

Penulis:Mimpi kecil, Dicipta: 2019-11-13 09:15:56, Dikemas kini: 2023-10-17 21:23:21

img

Tangan mengajar anda strategi pemindahan bahasa Melayu (dalam tahap lanjutan)

Artikel TerdahuluTangan mengajar anda menulis strategi -- mentransfer strategi dalam bahasa saya.Jika bahasa Melayu yang agak rumit, bagaimana untuk mentransfer strategi ke bahasa JavaScript?

Kita mulakan dengan melihat strategi untuk pemindahan 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 Melayu(*backtest...*)Ini adalah kod konfigurasi untuk tetapan semula, untuk perbandingan yang mudah, menetapkan konfigurasi retargeting yang seragam. Kaedah ini juga merupakan strategi mencari secara rawak, tidak terlalu rumit (lebih rumit daripada artikel sebelumnya), adalah strategi yang lebih mewakili. Memindahkan strategi bahasa Mac, terlebih dahulu melihat isi kandungan strategi, kod strategi bahasa Mac lebih ringkas, pada dasarnya dapat melihat kepada pemahaman tertentu tentang keseluruhan strategi, yang kita lihat menggunakan beberapa fungsi penunjuk.EMASMA

Rumbai yang dicipta

  • EMA Fungsi penunjuk ini, adalah fungsi perpustakaan penunjuk yang sedia ada ketika platform FMZ menulis dasar dalam bahasa JavaScript; iaitu:TA.MA

  • SMA Apa yang perlu kita lakukan ialah:SMAIni menunjukkan bahawa FMZ tidak menyokong fungsi SMA dalam TA, dan terdapat perbezaan antara SMA dalam talib dan bahasa Melayu:imgSeperti yang dapat dilihat, bahagian parameter mempunyai parameter berat selain parameter kitaran.

    Fungsi penunjuk SMA dalam perpustakaan talib dalam dokumentasi FMZ API digambarkan sebagai berikut:img

    Boleh lihattalib.SMAIa adalah satu purata bergerak yang mudah. Dengan cara ini, anda hanya boleh mulakan untuk mencapai matlamat anda sendiri.SMASebagai pemaju yang menulis strategi menggunakan bahasa JavaScript, ini juga merupakan salah satu kemahiran yang diperlukan, kerana jika tidak ada roda siap pakai, kereta masih perlu berjalan, membuat satu adalah semua.

    Sebenarnya, tidak banyak kajian mengenai penunjuk dan sebagainya, dan biasanya orang tidak faham tentang mencari dan mencari maklumat.img

    Saya rasa proses algoritma ini agak boleh dipercayai, cuba laksanakan:

    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 StrategiTangan mengajar anda menulis strategi -- mentransfer strategi dalam bahasa saya.Artikel ini mempunyai kerangka kerja yang sama, yang terdiri daripada dua bahagian:img

Pertama, proses data pasaran, pengiraan penunjuk.img

Kami telah mengkaji fungsi setiap ayat dalam bahagian Bahasa Melayu:

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

    Ini boleh difahami sebagai, untuk menambah harga tertinggi, harga minimum, harga penutupan setiap BAR dalam data K baris, kemudian membahagikan dengan 3, mengira purata, dan kemudian disimpan sebagai satu aritmatika, dengan setiap BAR satu sama lain. Ini boleh dilakukan seperti berikut:

    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 boleh dipanggil di dalam fungsi OnTick utama, contohnya:

    // 计算指标
    // AP
    var ap = CalcAP(records)
    
  • 2. Selepas perhitungan AP selesai, perhitungan seterusnya.ESA:=EMA(AP,N1);:

    Untuk mengira ESA, gunakan data AP yang dikira pada langkah sebelumnya, yang sebenarnya ESA adalah "Peringat Bergerak Indeks" AP, iaitu EMA, jadi kita boleh menggunakan AP sebagai data, dan N1 sebagai parameter EMA untuk mengira 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);

    Menggunakan pengiraanAPESAData pengiraanDSaya tidak tahu. Di sini anda boleh melihat nota kod, beberapa teknik 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);Cara ini adalah sama seperti langkah 1, dengan mengeluarkan kod 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); Hanya mengira indikator EMA dalam 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 sebelum ini.SMAFungsi tersebut.

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

Penghantaran isyarat dagangan adalah sangat mudah.

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

Membaca beberapa ayat kod bahasa Melayu ini, anda dapat mengetahui bahawa untuk kedua-dua garis petunjuk WT1 dan WT2, garpu emas, garpu mati adalah penilaian sebagai syarat untuk membuka dagangan, perlu diingat bahawa isyarat silang pertama digunakan. Di sini, kita dapat melihat bahawa bahasa Melayu adalah salah satu bahasa yang paling popular di Malaysia, dan kita dapat melihat bahawa bahasa Melayu adalah bahasa yang paling popular di Malaysia.img

Dengan menggunakan strategi bahasa Melayu, kita dapat melihat bahawa ketika titik pembukaan deteksi isyarat, ia sebenarnya mengesan apakah kedudukan titik pembukaan BAR di 2 BAR sebelumnya adalah garpu emas. Gambar di atas dapat dilihat dengan jelas:img img

Kod pengisian bagi bahagian pengesanan isyarat boleh 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 kita boleh berfikir mengapa arahan SPK dan BPK dalam bahasa Melayu dapat dilaksanakan dengan kod di atas.

Ujian semula

Mengesan semula konfigurasi:img

Perkataan ini telah diucapkan oleh seorang ahli media Malaysia bernama Al Jazeera.img

Periksa semula versi JavaScript:img img

Kod pada bahagian awal fungsi OnTick, yang digunakan untuk mempercepatkan penarikan semula, adalah untuk membolehkan strategi dijalankan dengan model harga penutupan, yang menarik untuk dianalisis 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
    }
    ...
    ..
    .

Di sini anda boleh melihat semua maklumat mengenai kaedah pengajaran:https://www.fmz.com/strategy/174457

Terima kasih kerana membaca.


Berkaitan

Lebih lanjut