4.2 Bagaimana untuk melaksanakan perdagangan strategik dalam bahasa JavaScript

Penulis:Kebaikan, Dicipta: 2019-04-27 11:53:15, Dikemas kini:

Ringkasan

Dalam artikel sebelumnya, kami memperkenalkan pengetahuan asas yang apabila menggunakan JavaScript untuk menulis program, termasuk tatabahasa asas dan bahan.

Pengenalan Strategi

Band Bollinger adalah salah satu penunjuk teknikal yang paling biasa digunakan, yang dicipta oleh John Bollinger pada tahun 1980-an. Secara teori, harga sentiasa turun naik di sekitar julat nilai tertentu. Band Bollinger berdasarkan asas teori ini dan memperkenalkan konsep saluran harga.

Kaedah pengiraan adalah menggunakan prinsip statistik, pertama mengira deviasi standard harga untuk tempoh masa, dan kemudian menambah atau mengurangkan 2 kali deviasi standard purata bergerak untuk mencari selang yang dipercayai harga. Jenis asas adalah saluran jalur yang terdiri daripada tiga jalur rel (rel tengah, rel atas, rel bawah). Rel tengah adalah harga purata, dan rel atas dan rel bawah mewakili garis tekanan dan garis sokongan harga, masing-masing. Seperti yang ditunjukkan di bawah:

img

Oleh kerana konsep penyimpangan standard, lebar Bollinger Band disesuaikan secara dinamik berdasarkan turun naik harga baru-baru ini. Apabila turun naiknya kecil, Bollinger Band akan lebih sempit; jika tidak, turun naiknya akan lebih besar dan Bollinger Band akan lebih luas. Apabila saluran BOLL berubah dari sempit ke lebar, harganya secara beransur-ansur kembali ke purata. Apabila saluran BOLL berubah dari lebar ke sempit, ini bermakna harga pasaran mula berubah. Jika harga melintasi rel atas, ini bermakna kuasa beli meningkat. Jika harga turun melintasi rel bawah, ini menunjukkan bahawa kuasa jual meningkat.

Kaedah Pengiraan Indikator Bollinger Band

Di antara semua penunjuk teknikal, kaedah pengiraan Bollinger Band adalah salah satu yang paling rumit, yang memperkenalkan konsep penyimpangan standard dalam statistik, yang melibatkan trajektori tengah (MB ), trajektori atas (UP ) dan pengiraan trajektori bawah (DN).

  • Rel tengah = purata bergerak mudah N tempoh masa

  • Rel atas = rel tengah + penyimpangan piawai tempoh masa K × N

  • Rel bawah = rel tengah − penyimpangan standard tempoh masa K × N

function main( ) { // program entry
    while (true) { // enter the loop
        exchange.SetContactType('this_week'); // set contact type
        var records = exchange.GetRecods(); // get the k line array
        var boll = TA.B0LL(records, 50); // get the 50-cycle BOLL indicator array
        var top = boll[0]; // get the upper-rail BOLL indicator array
        var ma = boll[l]; // get the middle-rail BOLL indicator array
        var bottom = boll[2]; // get the lower-rail BOLL indicator array
        Log(top); // print the upper-rail BOLL indicator array to the log
        Log(ma); // print the middle-rail BOLL indicator array to the log
        Log(bottom);// print the lower-rail BOLL indicator array to the log
    }
}

Logik strategi

Band Bollinger digunakan dalam pelbagai cara dan boleh digunakan secara bersendirian atau digabungkan dengan penunjuk lain. Dalam bahagian ini tutorial kita akan menggunakannya dengan cara yang paling mudah, iaitu: Apabila harga memecahkan melalui rel atas, buka kedudukan panjang; apabila harga memecahkan melalui rel bawah, buka kedudukan pendek.

img

Jika harga kembali ke tengah Bollinger Band selepas membuka kedudukan panjang, kita percaya bahawa kekuatan kuasa beli melemah, atau kekuatan kuasa jual menguat, oleh itu, ini adalah di mana isyarat kedudukan penutupan masuk. logika yang sama untuk kedudukan pendek.

Syarat Perdagangan

  • Posisi panjang terbuka: Jika tidak ada kedudukan, dan harga penutupan lebih besar daripada rel atas.

  • Posisi pendek: Jika tidak ada kedudukan, dan harga penutupan lebih rendah daripada rel bawah.

  • Penutupan kedudukan panjang: Jika memegang kedudukan panjang, dan harga penutupan adalah lebih rendah daripada rel tengah,

  • Penutupan kedudukan pendek: Jika memegang kedudukan pendek, dan harga penutupan lebih besar daripada rel tengah,

Pelaksanaan Kod Strategi

Untuk mencapai strategi, pertama kita perlu mempertimbangkan apa data yang kita perlukan? melalui mana API untuk mendapatkan? kemudian bagaimana untuk mengira logik perdagangan? Akhirnya, cara untuk meletakkan pesanan? mari kita melaksanakan langkah demi langkah:

Langkah 1: Gunakan Rangka Strategi CTA

Kerangka kerja yang dipanggil CTA Strategy adalah satu set kerangka kerja standard yang dirancang secara rasmi oleh FMZ Quant. Dengan menggunakan kerangka kerja ini, anda boleh mengabaikan masalah pengaturcaraan yang sepele dan memberi tumpuan langsung kepada logik pengaturcaraan. Sebagai contoh, jika anda tidak menggunakan kerangka kerja ini, anda perlu mempertimbangkan untuk mengalihkan harga pesanan, jenis pesanan, menarik balik pesanan dan sebagainya.

function main() {
    $.CTA("this_week", function(st) {
        // write your strategy here
    })
}

Di atas adalah kerangka strategi CTA menggunakan alat FMZ Quant. Ia adalah format kod tetap, dan semua kod logik perdagangan bermula dari baris 3.

Perhatikan bahawa kod pelbagai perdagangan di atas adalah this_week yang bermaksud ia mewakili menggunakan k-line mingguan, data perdagangan menggunakan data mingguan.

Langkah 2: Dapatkan semua jenis data

Dari logik perdagangan strategi kami, pertama-tama kita perlu mendapatkan status kedudukan semasa, dan kemudian bandingkan harga penutupan dengan rel atas, tengah dan bawah.

  • Dapatkan data garis K

Yang pertama adalah untuk mendapatkan array data K-line dan harga penutupan K-line sebelumnya, dengan array K-line, kita boleh mengira penunjuk Bollinger Band. ia boleh ditulis seperti ini:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

    })
}

Seperti yang ditunjukkan di atas:

Baris 4: Dapatkan array garis K, yang merupakan format tetap.

Garis 5: Menapis panjang garis K, kerana parameter untuk mengira penunjuk Bollinger Band adalah 20, apabila garis K kurang daripada 20, mustahil untuk mengira penunjuk Bollinger Band. Jadi di sini kita perlu menapis panjang garis K. Jika garis K kurang daripada 20, ia akan kembali terus dan terus menunggu garis K seterusnya.

Baris 6 : Dari array K-line yang diperoleh, mula-mula dapatkan objek K-line sebelumnya, dan kemudian dapatkan harga penutupan dari objek ini.

Unsur-unsur array K-line adalah semua objek, objek mengandungi harga pembukaan, tertinggi, terendah dan penutupan; juga jumlah dagangan dan masa.

Sebagai contoh, untuk mendapatkan harga penutupan, hanya menambah ". " diikuti oleh nama atribut (r[r.length - 2].Close).

  • Dapatkan data masa garis K

Oleh kerana ini adalah strategi intraday, kita perlu menutup semua kedudukan sebelum masa tertentu ((kebanyakkan bursa perdagangan kripto biasanya terbuka 24/7), jadi kita mesti menilai sama ada garis K semasa dekat dengan masa tertentu ketika kita harus berhenti berdagang atau berehat. Jika ia dekat dengan masa penutupan garis K, tutup semua kedudukan. Jika tidak, teruskan strategi. Kodnya ditulis seperti ini:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
    })
}

Seperti yang ditunjukkan di atas:

Baris 8: mendapatkan objek atribut timestamp baris K dan kemudian mencipta objek masa ((new Tanggal (timestamp)).

Garis 9: Hitung jam dan minit mengikut objek masa, dan tentukan sama ada masa garis K semasa adalah 14:45.

  • Dapatkan data kedudukan

Maklumat kedudukan adalah syarat yang sangat penting dalam strategi perdagangan kuantitatif. Apabila syarat perdagangan ditubuhkan, adalah perlu untuk menilai sama ada untuk meletakkan pesanan oleh status kedudukan dan bilangan kedudukan. Sebagai contoh, apabila syarat untuk membuka kedudukan panjang ditubuhkan, jika terdapat kedudukan pegangan, jangan meletakkan pesanan; jika tidak ada kedudukan pegangan, letakkan pesanan. seperti ini:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

    })
}

Seperti yang ditunjukkan di atas:

Baris 11: Dapatkan status kedudukan semasa. Jika terdapat kedudukan panjang, nilainya adalah 1; jika terdapat kedudukan pendek, nilainya adalah -1; jika tidak ada kedudukan, nilainya adalah 0.

  • Dapatkan data Bollinger Band

Seterusnya kita perlu mengira nilai rel atas, tengah dan bawah penunjuk Bollinger Band. kita perlu mendapatkan array Boolean terlebih dahulu, dan kemudian mendapatkan nilai rel atas, tengah, dan bawah dari array ini. Dalam alat kuant FMZ, sangat mudah untuk mendapatkan array Boolean, hanya hubungi API Bollinger Band secara langsung, ia adalah array dua dimensi.

adalah mudah untuk memahami array dua dimensi, yang merupakan array dalam array. Urutan untuk mendapatkan nilai adalah: mula-mula mendapatkan array yang ditentukan dalam array, dan kemudian mendapatkan elemen yang ditentukan dari array yang ditentukan, seperti yang ditunjukkan di bawah:

var arr = [[100, 200, 300],[10,20,30],[1,2,3]]; // this is a two-dimensional array
var test = arr[0]; //first obtain the specified array in the array and assign the value to variable "test"
var demo1 = test[0]; //then get a value from the test array
demo1; // the result is : 100

var demo2 = arr[0][0]; // you also can write like this
demo2; // the result is the same : 100

Di bawah, dari baris ke-13 hingga ke-19 mendapatkan bahagian pengekodan rel atas, tengah dan bawah Bollinger Band, Di mana baris ke-13 menggunakan alat FMZ Quant API, yang boleh mengakses array Bollinger band secara langsung; baris ke-14 hingga baris ke-16 memperoleh array dua dimensi masing-masing untuk array rel atas, tengah dan bawah; baris ke-17 hingga baris ke-19 mendapatkan nilai yang ditentukan dari array rel atas, tengah, dan bawah.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2];  // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

    })
}

Langkah 3: meletakkan pesanan dan perdagangan

Dengan data di atas, kita boleh menulis logik perdagangan dan meletakkan bahagian pesanan sekarang. Ia juga sangat mudah, yang paling biasa digunakan adalah pernyataan if, yang boleh digambarkan sebagai: jika syarat 1 dan syarat 2 benar, letakkan pesanan; jika syarat 3 atau syarat 4 benar, letakkan pesanan. Seperti yang ditunjukkan di bawah:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.

    })
}

Dalam gambar di atas, baris 21 hingga 24 adalah logik perdagangan dan meletakkan bahagian kod pesanan. Dari atas ke bawah mereka adalah: menutup kedudukan panjang, menutup kedudukan pendek, membuka kedudukan panjang dan membuka kedudukan pendek.

Ambil kedudukan panjang terbuka sebagai contoh. Ini adalah pernyataan if. Jika hanya satu baris kod dijalankan dalam pernyataan ini, kurung keriting " {} " boleh dihilangkan. Pernyataan diterjemahkan ke dalam teks yang bermaksud: jika kedudukan semasa adalah 0 dan harga penutupan lebih besar daripada rel atas, dan masa baris k bukan 14:45, maka " kembali 1 "

anda mungkin mendapati bahawa baris ini mempunyai " kembali 1 " dan " kembali -1 ", yang merupakan format tetap, yang bermaksud: jika ia adalah arah membeli, tulis " kembali 1 "; jika ia adalah arah menjual, tulis " kembali -1 ".

Kod Strategi Lengkap

Pada ketika ini, kod strategi lengkap ditulis. Jika kerangka perdagangan, data perdagangan, logika perdagangan dan meletakkan pesanan ditulis secara berasingan, ia sangat mudah? Berikut adalah kod keseluruhan strategi ini:

function main() {
    $.CTA("this_week", function(st) {
        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price
        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
        var mp = st.position.amount; // get the holding position information
        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value
        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.
    })
}

Ada dua perkara yang perlu diperhatikan:

  1. Cuba (tetapi tidak semestinya) menulis logik strategi seperti keadaan K-line semasa ditubuhkan, kemudian meletakkan pesanan pada k-line seterusnya. atau keadaan k-line sebelumnya ditubuhkan, meletakkan pesanan pada k-line semasa, dengan cara ini, hasil backtest dan prestasi pasaran sebenar tidak jauh berbeza.

  2. Secara amnya, logik kedudukan penutupan harus ditulis di hadapan logik kedudukan pembukaan. Tujuan ini adalah untuk cuba membuat logik strategi memenuhi jangkaan anda. Sebagai contoh, jika logik strategi hanya memenuhi keadaan di mana ia perlu melakukan arah yang bertentangan perdagangan selepas hanya menutup kedudukan, peraturan situasi jenis ini adalah untuk menutup kedudukan pertama dan kemudian membuka kedudukan baru. Jika kita menulis logik kedudukan penutupan di hadapan logik kedudukan pembukaan, ia akan sempurna memenuhi peraturan ini.

Ringkasnya

Di atas kita telah belajar setiap langkah untuk membangunkan strategi perdagangan kuantitatif intraday yang lengkap, termasuk: pengenalan strategi, kaedah pengiraan penunjuk Bollinger, logik strategi, syarat perdagangan, pelaksanaan kod strategi, dll. Melalui kes strategi ini, bukan sahaja kita biasa dengan kaedah pengaturcaraan alat FMZ Quant, tetapi juga boleh membina beberapa strategi lain yang disesuaikan mengikut templat ini.

Strategi perdagangan kuantitatif tidak lebih daripada ringkasan pengalaman atau sistem perdagangan subjektif. Jika kita menulis pengalaman atau sistem yang digunakan dalam perdagangan subjektif sebelum menulis strategi kuantitatif, dan kemudian menterjemahkannya ke dalam kod satu demi satu, anda akan mendapati bahawa menulis strategi kuantitatif akan menjadi lebih mudah.

Pengumuman Bahagian Seterusnya

Dalam pembangunan strategi perdagangan kuantitatif, jika hanya boleh memilih satu bahasa pengaturcaraan, tanpa ragu-ragu, ia mesti Python. Dari mendapatkan data untuk backtesting, walaupun bahagian meletakkan pesanan, Python telah meliputi keseluruhan rantaian perniagaan. Dalam bidang pelaburan kuantitatif kewangan, Python telah menduduki kedudukan yang sangat penting, bahagian seterusnya kursus kita akan mula mempelajari bahasa Python.

Latihan selepas sekolah

  1. Cuba gunakan pengetahuan dalam seksyen ini untuk melaksanakan strategi purata bergerak berganda.

  2. Cuba untuk melaksanakan strategi penunjuk KDJ menggunakan bahasa JavaScript pada platform FMZ Quant.


Lebih lanjut