Sumber dimuat naik... memuat...

Perdagangan kuantitatif dalam lingkaran mata wang adalah sesuatu yang baru - membawa anda lebih dekat kepada kuantitatif dalam lingkaran mata wang.

Penulis:Pencipta Kuantiti - Impian Kecil, Dicipta: 2021-04-19 14:16:21, Dikemas kini: 2024-12-04 21:21:43

img

Perdagangan kuantitatif lingkaran wang yang baru nampaknya membawa anda lebih dekat dengan kuantitatif lingkaran wang.

Dalam artikel sebelum ini, kita telah membincangkan skrip dagangan berprogram. Sebenarnya, strategi dagangan adalah skrip dagangan, dan artikel ini terutamanya membincangkan skrip dagangan yang memerlukan pembawa perkakasan (di mana program berjalan), skrip dagangan yang boleh ditulis dalam bahasa pengaturcaraan komputer (menyenaraikan tiga bahasa pengaturcaraan yang digunakan oleh pencipta di platform dagangan kuantitatif, tentu saja perdagangan berprogram sendiri boleh digunakan untuk melaksanakan strategi bahasa pengaturcaraan apa pun). Dalam artikel ini, kita terus membincangkan kuantitatif lingkaran syiling, memahami pengetahuan kuantitatif lingkaran syiling.

Skrip urus niaga berprogram

  • Jenis strategi dagangan Pemula perdagangan berprogram, perdagangan kuantitatif mungkin akan terpesona dengan pelbagai istilah strategi trend, strategi pertukaran, strategi frekuensi tinggi, strategi grid, dan lain-lain.

    • Strategi lindung nilai Secara ringkasnya, strategi seperti memegang banyak kedudukan melihat dan memegang kedudukan melihat boleh dikategorikan sebagai strategi leverage. Terdapat banyak jenis yang spesifik, cross-market, cross-future, futures leverage, cross-variety leverage, dan lain-lain.
    • Strategi trend Secara ringkasnya, ini adalah strategi untuk mengikuti trend, seperti binari, MACD, dan sebagainya.
    • Strategi Kembali Sebagai contoh, strategi grid untuk mengambil keuntungan daripada turun naik harga dalam pasaran yang bergolak.
    • Strategi frekuensi tinggi Secara ringkasnya, ia adalah strategi untuk melakukan perdagangan frekuensi tinggi dengan menggunakan beberapa algoritma untuk menggali struktur mikro pasaran, peraturan, peluang, dan lain-lain.

    Di atas, strategi perdagangan boleh dipisahkan dari segi strategi, tetapi dari segi reka bentuk strategi pada platform dagangan kuantitatif pencipta, strategi juga boleh dibahagikan kepada:

    • Strategi Unisex Ini bermaksud bahawa strategi ini hanya beroperasi pada satu jenis, seperti berdagang BTC atau berdagang ETH.
    • Strategi pelbagai Secara ringkasnya, ia adalah untuk mengendalikan pelbagai jenis mengikut satu logik strategi.
    • Dasar pelbagai akaun Secara ringkasnya adalah objek pertukaran yang banyak dikonfigurasikan di atas papan (yang telah diperkenalkan dalam artikel sebelumnya, objek pertukaran dengan API KEY yang dikonfigurasikan mewakili satu akaun bursa). Sebagai contoh, beberapa dasar senarai, beberapa akaun bersama-sama mengikuti operasi (mungkin satu bursa yang sama, mungkin juga berlainan bursa), secara ringkasnya menguruskan beberapa objek bursa di atas papan (akun).
    • Strategi Multi Logik Pada satu cakera sebenar, contohnya, strategi MACD, strategi rata-rata, strategi grid, dan lain-lain direka pada masa yang sama ((Sudah tentu, adalah untuk mengendalikan objek pertukaran yang berbeza, mengendalikan objek pertukaran yang sama untuk melihat apakah strategi tertentu bertentangan secara logik)
  • Antara muka API pertukaran Bagaimana skrip dagangan berprogram beroperasi dengan akaun bursa? Jawapannya adalah melalui API yang dibuka oleh bursa. Jadi, apa jenis antara muka yang terbuka di bursa? Dalam artikel sebelumnya, kita telah membincangkan mengenai REST, Websocket, dan lain-lain. Di sini kita menambah sedikit konsep dari peringkat program dasar.

    • Antara muka yang tidak memerlukan pengesahan Selalunya dikenali sebagai kerangka antarmuka awam kerangka, yang tidak memerlukan pengesahanAPI KEY(Lupakan apa yang API KEY boleh menggulingkan artikel sebelumnya). Antara muka seperti ini biasanya antara muka pasaran, seperti menyiasat pasaran yang mendalam, menyiasat data K-line, menyiasat kadar dana, menyiasat maklumat mengenai jenis dagangan, menyiasat waktu pelayan bursa, dan lain-lain. Secara ringkasnya, antara muka yang hampir tidak berkaitan dengan akaun anda boleh dipastikan adalah antara muka awam (tidak memerlukan pengesahan).
      Dalam platform dagangan kuantitatif pencipta, apabila memanggil fungsi API yang tidak disahkan (mengemas pertukaran antara muka yang tidak disahkan, antara muka awam) data yang dikembalikan ke antara muka dapat diperoleh dengan normal walaupun konfigurasi API KEY salah.

    • Antara muka yang perlu disahkan Secara ringkasnya, antara muka yang memerlukan pengesahan (pengesahan melalui API KEY) yang dipanggil antara muka peribadi. Antara muka ini biasanya berkaitan dengan beberapa tindakan atau maklumat akaun anda, seperti menyiasat aset akaun, menyiasat pemantauan akaun, menyiarkan pertanyaan, memindahkan permintaan tunggal, memindahkan wang, menyesuaikan tumpuan mata wang, menetapkan mod pemantauan, dan lain-lain. Operasi ini mesti disahkan. Pada platform dagangan kuantitatif pencipta, apabila memanggil fungsi API yang memerlukan pengesahan (pembungkusan pertukaran yang memerlukan pengesahan antara muka, antara muka peribadi), jika API KEY dikonfigurasikan dengan salah, ia akan memberikan kesalahan apabila memanggil antara muka, mengembalikan nilai kosong.

    Jadi, bagaimana antara muka ini digunakan dalam platform perdagangan kuantitatif pencipta?

    Platform perdagangan kuantitatif pencipta dibungkus dengan tingkah laku pertukaran, yang menentukan antara muka yang konsisten (seperti antara muka K-line, antara muka perdagangan mendalam, antara muka carian aset semasa, antara muka bawah, antara muka pencabutan pesanan, dan lain-lain) yang dipanggil fungsi API platform perdagangan kuantitatif pencipta di platform perdagangan kuantitatif pencipta, yang boleh dilihat dengan menanyakan dokumentasi API.https://www.fmz.com/api )。

    Jadi bagaimana antara muka pertukaran yang tidak selari dengan tingkah laku dan definisi boleh digunakan dalam platform dagangan kuantitatif pencipta?

    Antara muka pertukaran ini adalah antara lain: pemindahan aset, penugasan bersyarat, pesanan dalam jumlah, penarikan jumlah, pesanan penyesuaian, dan lain-lain. Antara muka ini ada di beberapa bursa, dan beberapa bursa tidak mempunyai, dan ciri, butiran penggunaan mungkin berbeza-beza, jadi antara muka ini boleh digunakan di platform dagangan kuantitatif pencipta.exchange.IOUntuk mendapatkan maklumat lanjut mengenai fungsi ini, anda boleh lihat dokumentasi API Platform Perdagangan Kuantitatif Pencipta:https://www.fmz.com/api#exchange.io.....................

    Adakah semua fungsi API dalam dokumentasi API inventor menghasilkan permintaan rangkaian?

    Jika kita katakan bahawa antara muka API bursa mempunyai had kelajuan akses (contohnya 5 kali sesaat dan sebagainya), akses tidak boleh terlalu kerap atau akan melaporkan kesalahan http 429 dan ditolak untuk mengakses (kebanyakkan bursa melaporkan 429); maka antara muka pertukaran yang dikemas dalam platform dagangan kuantitatif pencipta juga mempunyai had ini, tetapi fungsi API yang tidak menghasilkan permintaan rangkaian pada platform dagangan kuantitatif pencipta tidak mempunyai had ini. Tidak semua fungsi API di platform dagangan kuantitatif pencipta menghasilkan permintaan rangkaian, dan beberapa fungsi API pencipta hanya mengubah beberapa tetapan tempatan, seperti menetapkan pasangan dagangan semasa, menetapkan kod kontrak, fungsi pengiraan penunjuk, mendapatkan nama objek dagangan, dan lain-lain. Pada asasnya, penggunaannya dapat menentukan sama ada permintaan rangkaian berlaku, selagi mendapatkan data bursa, operasi ke atas akaun bursa dan lain-lain yang menghasilkan permintaan rangkaian, antara muka ini memerlukan perhatian terhadap kekerapan panggilan.

    • Berikut adalah beberapa soalan dan pengalaman yang biasa berlaku apabila pencipta menggunakan fungsi API untuk platform dagangan kuantitatif.

      • Bersalah Ini adalah kesilapan yang paling biasa, yang mengganggu banyak inovasi, kerap menggunakan strategi untuk mengesan semula semuanya baik-baik saja, mengapa cakera sebenar berjalan untuk sementara waktu (mungkin mencetuskan) cakera sebenar akan hang ~

        img

        Apabila menulis dasar, kita perlu menilai semua data yang dikembalikan oleh antara muka, contohnya, mendapatkan perdagangan di platform perdagangan kuantitatif pencipta (seperti menulis sendiri untuk mengakses antara muka pertukaran secara langsung):var ticker = exchange.GetTicker()Jika kita perlu menggunakan ini,tickerVariabel (lihat struktur yang dikembalikan oleh fungsi GetTicker)Last(Harga terkini) data ini, kita perlu gunakan.var newPrice = ticker.LastDengan cara ini, anda akan mendapat data ((newPrice adalah???new: terbaru,Price: harga,ya!bergabung!) pada masa ini, jikaGetTicker()Fungsi ini mengembalikan data yang normal, tetapi ia akan berlaku jika permintaan terlambat, kesalahan rangkaian, pertukaran menarik talian, menggali kabel, anak beruang menarik lilin, dan lain-lain.GetTicker()Fungsi kembalinull❖ Pada masa initickerNilai ini ialahnullSaya akan melawatnya lagi.LastJika anda membuat kesalahan, anda akan mengalami kecacatan prosedur yang menyebabkan proses dasar berhenti. Ini menunjukkan bahawa kegagalan panggilan antara muka (GetTicker gagal memanggil kembali null) bukan sebab langsung mengapa dasar disk berhenti (kesan langsung adalah mengakses satu)nullSifat-sifat pembolehubah), panggilan antara muka gagal melaporkan kesilapan yang tidak menyebabkan cakera sebenar berhenti (menarik keutamaan). Jadi, apa yang boleh kita lakukan untuk mengelakkan pemadaman cakera sebenar yang luar biasa? Jawapannya adalah dengan membocorkan data yang dikembalikan oleh antara muka, dan ia adalah mudah dengan hanya menilai apakah data yang dikembalikan adalah benar atau salah.null(Contoh bahasa JavaScript, bahasa lain hampir sama) Menulis satu petikan kod kecil untuk menerangkan (ini hanya satu petikan, berjalan terus adalah satu masalah yang tidak dapat diatasi!)

        var ticker = exchange.GetTicker()
        if (ticker) {
            var newPrice = ticker.Last
            Log("打印最新价格:", newPrice)
        } else {
            // 数据为null,不做操作就不会出问题
        }
        

        Bukan sahajaGetTickerAntara muka memerlukan pengesahan kesalahan, antara muka yang mempunyai permintaan rangkaian memerlukan pengesahan kesalahan untuk nilai pulangan (jika anda menggunakan nilai pulangan fungsi) Ada banyak cara untuk memaafkan kesilapan._C()Fungsi (lihat dokumentasi FMZ API), menulis sendiri fungsi yang boleh menerima kesilapan, merancang sendiri mekanisme yang boleh menerima kesilapan, logik. Mengenai_C()Jika anda menggunakan fungsi, banyak pelajar baru yang mungkin salah, perhatikan._C()Parameter fungsi adalah rujukan fungsi, bukan panggilan fungsi._C(funcName, param1, param2), dipanggil dengan betul, funcName tanpa tanda kurung kecil, param1, param2 adalah parameter yang akan dihantar kepada fungsi funcName._C(funcName(param1, param2))Dalam bahasa Inggeris, ini adalah perkataan yang digunakan untuk menyebut sesuatu yang tidak betul, tetapi tidak boleh digunakan untuk menyebut sesuatu yang tidak betul.

      • Jumlah pesanan pesanan harga pasaran segera Jumlah pesanan pesanan pesanan pasaran segera juga mudah keliru, seperti yang telah disebutkan dalam artikel sebelumnya, jumlah pesanan pesanan pesanan pasaran segera biasanya adalah jumlah (pertukaran yang sangat berbeza mungkin ditetapkan dengan cara yang lain, biasanya pengaturan pertukaran khusus ini akan dinyatakan dalam dokumen API FMZ), sebagai contoh, saya menguji dengan OKEX V5: Pasangan urus niaga ditetapkan sebagai berikut:LTC_USDT

        function main() {
            exchange.IO("simulate", true)   // 切换为OKEX交易所的模拟盘
            exchange.Buy(-1, 1)             // 价格是-1,表示下的订单为市价单,数量为1表示下单量是1USDT
        }
        

        Oleh kerana bursa umumnya mempunyai had jumlah pesanan, pesanan yang kurang daripada had tidak diisytiharkan terlebih dahulu (misalnya, Binance Cash memerlukan setiap pesanan lebih besar daripada 5 USDT untuk berjaya diisytiharkan); jadi pesanan ini akan memberikan kesalahan:

        错误	Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
        
      • Arah masa hadapan Dalam membuat strategi niaga hadapan, satu-satunya hala tuju adalah bahawa pemula sering membuat kesilapan yang menyebabkan masalah, sebagai contoh, pencipta menulis strategi di platform dagangan kuantitatif. Di sini, kita akan melihat apa yang dikatakan dalam dokumen API:https://www.fmz.com/api#exchange.setdirection...

        img

        Oleh kerana fungsi ini hanyaBuy,SellWalau bagaimanapun, jika masa hadapan (tidak ada masalah, hanya membeli dan menjual) mempunyai arah terbuka, terbuka, terbuka, kosong, maka jelas Buy/Sell tidak menunjukkan banyak arah operasi, maka perlu memperkenalkan fungsi untuk menetapkan arah perdagangan masa hadapan.exchange.SetDirection()Saya tidak tahu apa yang berlaku. Di FMZexchange.SetDirection("buy")(Pengaturan Arah) danexchange.BuyJika digunakan bersama, maka tanda di bawah menunjukkan bahawa pesanan itu adalah pesanan yang banyak. Di bawah ini adalah contohnya:exchange.SetDirection("sell")danexchange.SellJika digunakan bersama, maka tanda di bawah menunjukkan pesanan untuk simpanan kosong.exchange.SetDirection("closebuy")danexchange.SellJika digunakan bersama, maka tanda berikut menunjukkan pesanan yang berjumlah besar.exchange.SetDirection("closesell")danexchange.BuyJika digunakan bersama, maka tanda berikut menunjukkan pesanan kosong. Perjumpaan yang biasaexchange.SetDirection("sell")danexchange.BuyPenggunaan bersama, atau gabungan kesalahan lain. Kemudian anda akan melaporkan kesalahan. (Mungkin pengulangan semula tidak akan melaporkan kesalahan, tetapi ini jelas merupakan kesalahan logik, obsesi tidak boleh diterima...). Satu lagi kesilapan yang sering dilakukan oleh Liu Xiaobo

        function main() {
            exchange.SetContractType("quarter")   // 设置当前合约为季度合约
            exchange.SetDirection("sell")
            var id = exchange.Sell(-1, 1)    
            Log("看我市价单下单了,成交了,就有持仓了", exchange.GetPosition())    
            exchange.SetDirection("closebuy")   // closebuy 和Sell 搭配使用,嗯没错~
            exchange.Sell(-1, 1)
        }
        

        img
        Lihat di sini akan bertanya: kenapa saya mempunyai pegangan dan closebuy dan sell juga digunakan bersama, bagaimana untuk melaporkan kesalahan, tidak boleh pegangan? Kesalahan ini juga mungkin berlaku apabila kedudukan kedudukan yang ditetapkan betul, penggunaan fungsi bawah juga betul, dan memegang kedudukan di arah ini, tetapi masih melaporkan kesilapan ini. Ini mungkin kerana program anda telah membuat banyak pesanan, pesanan awal tidak ditangani, pesanan lebaran tergantung di piring menunggu transaksi, ketika ini program akan meneruskan untuk lebaran, maka ia akan menunjukkan kesalahan di luar kedudukan lebaran.

      • Pengeluaran log, paparan maklumat transaksi Reka bentuk, penulisan, pengaturcaraan, pengukuran strategi transaksi, dan lain-lain. Reka bentuk interaksi mesin daripada data yang tidak terbuka untuk memaparkan kerucut, log operasi kerucut, output kerucut. Biasanya menggunakan bahasa pengaturcaraan asli untuk menulis skrip cakera sebenar, program dasar. Contohnya: menggunakan pythonprintSaya tidak tahu apa yang berlaku. menggunakan javascriptconsole.logSaya tidak tahu apa yang berlaku. Golangfmt.Println()Saya tidak tahu apa yang berlaku. Penggunaan C++cout

        Di samping itu, maklumat di platform FMZ menunjukkan bahawa terdapat dua lokasi utama di mana maklumat dipaparkan di platform perdagangan kuantitatif pencipta.

        • Tanda keadaan Apabila cakera sebenar berjalan, halaman cakera sebenar kelihatan seperti ini

          img

          Tanda-tanda ini adalah sebahagian daripada maklumat tab status, yang mana tab status adalah untuk menunjukkan beberapa perubahan data dalam masa nyata (kerana perubahan masa nyata memerlukan pemerhatian masa nyata dan tidak boleh dicetak ke dalam log setiap kali, data seperti ini boleh ditunjukkan di tab status, jika setiap log dicetak akan banyak data berulang yang tidak bermakna, mempengaruhi pertanyaan). Menunjukkan penggunaan data pada tetingkap statusLogStatusFungsi, secara khusus boleh dilihat dalam dokumentasi API FMZ.

        • Jadual hari Di laman web ini juga terdapat gambar seperti di bawah:

          img

          Tanda-tanda ini menunjukkan bahagian sebagai log tab, yang digunakan untuk merakam secara kekal data tertentu pada satu masa, atau untuk merakam tindakan tertentu yang dirancang pada satu masa. Di bawah ini adalah beberapa jenis log: 1, log biasa, output log menggunakan fungsi log dalam dasar FMZ, cetak dalam log dasar.

          img

          2, log bawah, digunakan dalam strategi FMZexchange.Sell/exchange.BuyIa akan mengeluarkan rekod secara automatik di log.

          img

          3. Menggunakan log penarikan, dalam strategi FMZexchange.CancelOrder, akan mengeluarkan log penarikan secara automatik di log.

          img

          4, log ralat, apabila dasar FMZ berjalan, apabila antara muka yang membuat permintaan rangkaian mengalami panggilan yang salah, apabila mengeluarkan sesuatu yang luar biasa (seperti kalimat seperti membuang), ia akan mengeluarkan log ralat secara automatik di log.

          img

        Fungsi API FMZ, yang boleh menghasilkan output log seperti Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id) dan lain-lain boleh disertakan dengan beberapa parameter output, seperti: exchange.CancelOrder ((orders[j].Id, orders[j]) selepas parameter yang diperlukan.

        function main() {
            Log("数据1", "数据2", "数据3", "...")
            var data2 = 200
            var id = exchange.Sell(100000, 0.1, "附带数据1", data2, "...")
            exchange.CancelOrder(id, "附带数据1", data2, "...")
            LogProfit(100, "附带数据1", data2, "...")
        }
        
      • Penggunaan fungsi penunjuk Sebelum kita bercakap tentang fungsi penunjuk, kita perlu memahami apa yang merupakan penunjuk, iaitu garis rata, MACD, ATR, dan lain-lain. Soalan: Dari mana datangnya indikator ini? Jawapan: Sudah tentu. Soalan: Berdasarkan apa? Jawapan: Mengikut data garis K. T: Contoh? Jawapan: Sebagai contoh yang paling mudah, jika kita menggunakan garis K hari (iaitu satu garis matahari atau garis kemerahan yang mewakili satu hari) sebagai sumber data untuk pengiraan penunjuk. Parameter penunjuk rata-rata adalah 10, maka penunjuk rata-rata yang dikira adalah garis rata 10 hari. Soalan: Jika bilangan garis K BAR kurang daripada 10 bit, bolehkah anda mengira penunjuk garis rata? Jawapan: Bukan sahaja penunjuk rata-rata tidak boleh dikira, mana-mana penunjuk tidak boleh dikira dengan nilai penunjuk yang berkesan apabila jumlah data BAR pada K-line tidak memenuhi parameter kitaran penunjuk, dan di tempat yang sesuai dengan array yang dikira akan diisi dengan nilai kosong, sepertiJavaScriptKaedah bahasa akan memaparkan data penunjuk yang dicetaknull

        Contoh pengajaran di Dataran Strategy Square:https://www.fmz.com/strategy/125770Untuk mengkaji semula strategi contoh pengajaran ini, anda boleh melihat grafik yang dihasilkan oleh sistem pengkaji semula dan garis purata 10 kitaran:

        img

        Rancangan untuk membuat rajah, garis K dan rajah rata:

        img

        Soalan: Bagaimana jika saya mahu garis rata 10 jam? Jawapan: Data K-line boleh digunakan untuk data K-line dengan kitaran jam.

        Secara lumrah, garis K yang kita lihat, dan kita datai selepas itu adalah satu matriks (konsep matriks tidak difahami, boleh turun), di mana setiap elemen adalah tiang garis K, yang disusun mengikut urutan, elemen pertama matriks adalah yang paling jauh dari masa kini, dan elemen terakhir matriks adalah yang paling dekat dari masa kini. Selalunya, barisan garis terakhir data garis K adalah barisan garis untuk kitaran semasa, berubah dalam masa nyata, tidak selesai (menonton halaman yang masuk ke bursa untuk melihat garis Knya, perubahan dapat dilihat). Indikator yang dikira juga sepadan dengan barisan K, contoh di atas dapat melihat nilai indikator yang sepadan dengan barisan K. Perhatikan bahawa barisan K terakhir berubah dalam masa nyata, dan indikator yang dikira juga akan berubah mengikut perubahan barisan K.

        Di platform perdagangan kuantiti pencipta, anda boleh menggunakan TA library (pemalam yang dilaksanakan oleh FMZ platform, bersepadu di hoster, pelbagai bahasa boleh digunakan secara langsung) atau menggunakan talib library (talib index library, JS, C ++ integrasi, Python memerlukan pemasangan sendiri). Contohnya, dalam contoh di atas, garis rata dihitung: Menggunakan TA:

        function main() {
            var records = exchange.GetRecords()
            var ma = TA.MA(records, 10)
            Log(ma)       // 打印均线
        }
        

        Penggunaan Talib Library:

        function main() {
            var records = exchange.GetRecords()
            var ma = talib.MA(records, 10)
            Log(ma)       // 打印均线
        }      
        

        Data penunjuk yang dikira ma adalah satu susunan yang mana setiap elemen mempunyai satu susunan K baris (rekod), iaituma[ma.length -1]Bersepadurecords[records.length - 1], dan sebagainya.

        Indikator lain yang lebih rumit juga sama, perlu diperhatikan seperti MACD.

        var macd = TA.MACD(records)   // 这样只传入K线数据,不传入指标参数,指标参数采用的就是默认值,其它指标函数也是同理
        

        Pada masa ini, macd adalah suatu matriks dua dimensi (tidak faham konsepnya), dan matriks dua dimensi hanya merupakan satu matriks yang setiap elemennya juga merupakan satu matriks. Soalan: Mengapa data Macd adalah aritmatika dua dimensi? Jawapan: Oleh kerana penunjuk macd terdiri daripada dua baris (garis dif, garis dea) dan satu set tiang kuantiti (garis kuantiti macd, yang sebenarnya data tiang kuantiti ini juga boleh dilihat sebagai satu baris); maka pembolehubah macd boleh dipecah menjadi:

        var dif = macd[0]
        var dea = macd[1]
        var macdColumn = macd[2]
        

        Di sini juga terdapat satu contoh pengajaran siap pakai, kajian yang menarik:https://www.fmz.com/strategy/151972

        img


Berkaitan

Lebih lanjut