avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya...

Dibuat di: 2022-06-01 17:37:55, diperbarui pada: 2023-09-18 20:19:45
comments   6
hits   2992

Jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya…

Jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya…

Ada banyak sekali strategi open source di TradingView. Sayangnya, banyak sekali strategi, ide, dan indikator yang bagus yang tidak dapat dipraktikkan. Melihat hal ini, FMZ yang berkomitmen untuk mempopulerkan teknologi perdagangan kuantitatif kepada banyak pedagang, tentu tidak dapat menahan keinginan untuk menyelesaikan permintaan ini!

Tuntutan ini benar-benar tak tertahankan!

Jadi, di dunia kode pemrograman, saya melakukan perjalanan melalui pegunungan dan sungai, dan mengalami 9*9=81 pit, setelah mengalami malam-malam tanpa tidur yang tak terhitung jumlahnya, setumpuk kaleng Red Bull kosong menumpuk di sudut. Terakhir, FMZ mendukung dan kompatibel dengan bahasa Pine, dan berbagai skrip TradingView Pine dapat digunakan.

Berbicara tentang bahasa Pine, saya baru saja mempelajarinya sendiri. Namun sejujurnya, bahasa Pine untuk perdagangan kuantitatif sebenarnya sederhana, mudah digunakan dan mudah dipelajari. Apa? Tidak percaya? Lihat saya menulis strategi grid untuk Anda~

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利价差") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

Perdagangan real-time FMZ, alat pengujian ulang, berbagai fungsi, dan kemudahan penggunaan bahasa Pine bagaikan menambahkan sayap pada seekor harimau! Termasuk pengaturan parameter dan kode konfigurasi uji ulang, jumlah total kode tidak melebihi 50 baris. Pemula tidak perlu lagi khawatir tentang menulis kisi-kisi…

Tentu saja, strategi ini adalah strategi grid. Strategi grid juga memiliki kekurangan, dan bukan mesin pencetak uang yang pasti. Kuncinya terletak pada penggunaan dan parameternya. Saya tidak akan menguraikan lebih lanjut tentang hal ini. Mari kita lebih fokus pada cara menulis strategi dengan mudah, menerapkan logika perdagangan Anda sendiri, dan menghasilkan uang dengan menulis strategi Anda sendiri. Rasanya sangat menyenangkan tanpa meminta bantuan siapa pun! !

Penjelasan Kode

Izinkan saya menjelaskannya, kodenya sederhana dan mudah dipahami. Jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya akan…….. ……… …………………….Biarkan saya ceritakan lebih rinci!

Pada awalnya/*backtestDan*/Konten yang dibungkus adalah kode konfigurasi uji ulang FMZ, yang merupakan fungsi FMZ, bukan konten bahasa Pine. Tentu saja, Anda dapat memilih untuk tidak menulis bagian ini. Saat melakukan backtesting, Anda perlu mengklik kontrol parameter secara manual untuk mengatur konfigurasi dan parameter backtest.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

Kode berikut:

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利点数") / syminfo.mintick
  • strategy(overlay=true): Digunakan untuk mengatur beberapa opsi skrip, overlay=true, yang artinya memberikan parameteroverlayTetapkan nilai true untuk menggambar gambar pada gambar utama bagan (bagan garis K adalah gambar utama, dapat dipahami sesederhana ini).
  • varip beginPrice = 0: Variabel beginPrice dideklarasikan menggunakan kata kunci varip dan awalnya diberi nilai 0, yang digunakan sebagai harga awal grid.
  • var spacing = input.float(-1, title="间距价格"): Tetapkan parameter strategi. Nama parameternya adalah “harga interval”, yang merupakan interval antara setiap titik grid. Jika ditetapkan ke 100, artinya transaksi akan dilakukan setiap kali harga melebihi 100.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"]): Parameter strategi ditetapkan, bernama “arah”. Parameter ini adalah opsi dengan kotak drop-down, dan Anda dapat memilih long, short, atau keduanya. Masing-masing mengindikasikan bahwa grid hanya memperdagangkan posisi panjang, hanya memperdagangkan posisi pendek, atau memperdagangkan posisi panjang dan pendek.
  • var amount = input.float(-1, title="下单量"): Tetapkan parameter untuk mengontrol volume transaksi pada setiap transaksi titik grid.
  • var numbers = input.int(-1, title="网格数量"): Jumlah titik grid. Mengaturnya ke 20 berarti ada 20 titik grid dalam satu arah.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintick: Tetapkan parameter untuk mengendalikan perbedaan harga di mana posisi di setiap titik grid akan ditutup.

Selanjutnya, lihat kodenya:

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

Artinya, jika salah satu parameter seperti spasi, jumlah, angka, dan keuntungan tidak ditetapkan, nilai default-nya adalah -1, yang berarti strategi akan berhenti (Anda tidak dapat menjalankan strategi tanpa menetapkan parameter ~ haha!)

Go on !

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

Maksudnya adalah ketika strategi berada pada tahap K-line waktu nyata dan beginPrice == 0, ubah nilai beginPrice ke harga terkini. Dapat dipahami bahwa ketika strategi tersebut resmi berjalan, harga awal yang berlaku adalah harga awal grid. Karena skrip memiliki tahap BAR K-line historis, strategi akan menjalankan logika dalam tahap BAR historis. Tidak ada gunanya mengatur grid pada BAR historis.

Apa itu Fase BAR Historis?

Untuk memberikan contoh sederhana, pada saat A, strategi mulai berjalan, dan strategi memperoleh data dengan 100 BAR K-line. Seiring berjalannya waktu, 100 BAR tersebut pasti akan menjadi 101, 102… N. Ketika berjalan dari waktu A, BAR ke-101 adalah tahap K-line waktu nyata, yang merupakan data waktu nyata terkini. Jadi dari BAR ke-1 sampai dengan BAR ke-100, ini semua adalah kondisi pasar historis yang telah berlalu, tetapi strategi akan dijalankan juga berdasarkan kondisi pasar historis ini, sehingga tahapan ini adalah tahapan K-line historis.

barstate.ishistoryIni adalah variabel bawaan bahasa Pine. Jika BAR saat ini adalah BAR historis,barstate.ishistoryJika itu bukan BAR historis, maka itu salah. Oleh karena itu, jika barstate.ishistory tidak bernilai benar, maka ia berada pada tahap K-line waktu nyata.

Selanjutnya kita membuat sebuah fungsi

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

Fungsi dari fungsi ini adalah untuk mengetahui apakah ID tertentu ada di semua order yang sedang dibuka. Jika ada, fungsi findTradeId akan mengembalikan ID order yang ada saat dipanggil (perlu diingat bahwa ID ini bukan ID order pertukaran, tetapi ID yang ditetapkan ke pesanan oleh strategi). , atau ditafsirkan sebagai label), jika tidak ada, mengembalikan string “notFound”.

Selanjutnya, kita mulai membuat lembar mesh:

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

Perulangan for digunakan untuk menentukan jumlah perulangan berdasarkan nilai parameter angka, yaitu untuk mengatur jumlah pesanan yang sesuai. Tetapkan arah menurut parameter dir. Gunakan fungsi findTradeId untuk mengetahui apakah order label pada posisi grid saat ini telah dibuka. Tempatkan order terencana hanya jika belum dibuka (jika sudah dibuka, Anda tidak dapat menempatkan order duplikat). Saat melakukan pemesanan, gunakan fungsi strategy.order untuk menentukan parameter batas untuk membuat rencana pemesanan. Tempatkan order penutupan yang sesuai pada saat yang sama saat menempatkan order yang direncanakan. Untuk menutup posisi, gunakan fungsi strategy.exit, tentukan parameter keuntungan, dan tentukan poin keuntungan.

Jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya…

Jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya…

Jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya…

Jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya…

Jika kita melihat kurva imbal hasil, kita dapat melihat bahwa jaringan listrik juga memiliki risiko dan bukan jaminan kemenangan. Hanya saja risikonya relatif lebih kecil ketika jaringan listrik diperbesar dalam skala besar.

Baiklah, jika Anda masih belum bisa menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan digunakan, maka saya…