Jika Anda belum menulis strategi dengan bahasa Pine yang mudah dipelajari, maka saya...

Penulis:Mimpi kecil, Dibuat: 2022-06-01 17:37:55, Diperbarui: 2023-09-18 20:19:45

img

Jika Anda belum menulis strategi dengan bahasa Pine yang mudah dipelajari, maka saya...

Sangat disayangkan bahwa banyak sekali strategi, ide, dan indikator yang sangat bagus yang tidak dapat diterapkan di TradingView. FMZ tidak dapat menahan dorongan untuk memecahkan masalah ini, karena mereka berusaha untuk memaksimalkan teknologi perdagangan kuantitatif kepada banyak pedagang.

Saya tidak bisa menerima permintaan ini!

Jadi, di dunia pengembangan kode, setelah menempuh jalan kaki di pegunungan, berjalan di gunung-gunung, melewati 9 * 9 = 81 lubang, dan tidur tanpa tidur selama malam, sudut dinding menumpuk kotak kosong red bull yang biasa di pegunungan kecil. Akhirnya FMZ mendukung kompatibel dengan bahasa Pine, berbagai skrip Pine TradingView dapat digunakan.

Saya juga baru belajar bahasa Pine sendiri. Tapi jujur saja, bahasa Pine yang digunakan untuk transaksi kuantitatif sangat sederhana dan mudah dipelajari. Apa? Tidak percaya? Lihat bawang 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)

FMZ memiliki banyak fitur, alat penyesuaian, dan bahasa Pine yang mudah digunakan, yang dapat dihitung seperti burung harimau! Menghitung pengaturan parameter, penyesuaian konfigurasi kode, total kode tidak melebihi 50 baris.

Tentu saja, strategi ini adalah strategi jaring, strategi jaring juga memiliki luka keras, bukan mesin cetak yang menang-menang, penting untuk melihat penggunaan, parameter. Ini tidak akan diuraikan, kami lebih fokus pada bagaimana mudah menulis strategi, mewujudkan logika perdagangan Anda sendiri, menulis strategi perdagangan sendiri untuk menghasilkan uang, tidak meminta orang merasa sangat menyenangkan!

Pengertian Kode

Saya datang untuk menjelaskan kepada Anda, kode sederhana dan mudah dipahami, dengan bahasa Pine yang mudah dipelajari dan jika Anda belum menulis strategi, maka saya akan... menjelaskan secara rinci!

Awalnya/*backtestdan*/Konten yang terbungkus adalah kode konfigurasi retargeting FMZ, yang merupakan fungsi FMZ, bukan konten bahasa Pine. Tentu saja, Anda dapat tidak menulis bagian ini, dan ketika retargeting, Anda harus mengklik kontrol parameter secara manual untuk mengatur konfigurasi dan parameter retargeting.

/*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)Beberapa opsi untuk mengatur skrip, overlay=true, adalah memberikan parameter:overlayAtribut true, agar ketika menggambar gambar, gambar pada gambar utama dari grafik (K garis gambar adalah gambar utama, sehingga mudah dimengerti).
  • varip beginPrice = 0Dengan kata kunci varip: menyatakan bahwa variabel beginPrice memiliki nilai awal 0, yang merupakan harga awal yang digunakan sebagai grid.
  • var spacing = input.float(-1, title="间距价格"): Mengatur parameter kebijakan, parameter yang disebut interval harga, yaitu interval setiap titik grid, dengan pengaturan 100 adalah harga setiap 100 transaksi.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"]): Mengatur parameter kebijakan, yang disebut arah kerucut kerucut, parameter ini adalah pilihan dengan kotak tarik, Anda dapat memilih panjang, pendek, dan keduanya.
  • var amount = input.float(-1, title="下单量"): Mengatur sebuah parameter untuk mengontrol jumlah transaksi pada setiap transaksi titik grid.
  • var numbers = input.int(-1, title="网格数量"): jumlah titik kisi, setel 20 adalah 20 titik kisi di satu arah.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintick: Mengatur suatu parameter untuk mengontrol berapa banyak keuntungan yang diperoleh dari setiap titik grid untuk menyeimbangkan harga.

Setelah itu, lihat kode:

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

Ini berarti bahwa jika parameter spacing, amount, numbers, profit tidak diatur, dan secara default adalah -1, maka kebijakan akan berhenti (tidak dapat berjalan dengan buta tanpa parameter).

Pergilah!

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

Ini berarti bahwa ketika strategi berada di fase garis K secara real-time dan beginPrice == 0, mengubah nilai ke beginPrice, mengubahnya menjadi harga terbaru saat ini. Hal ini dapat dimengerti bahwa ketika strategi berjalan secara resmi, harga saat ini awal adalah harga awal dari grid. Karena skrip memiliki tahap BAR garis K bersejarah, strategi akan melakukan logis di tahap BAR bersejarah, dan tidak ada gunanya untuk menempatkan grid pada BAR bersejarah.

Apa yang dimaksud dengan tahap BAR?

Sebagai contoh sederhana, misalnya pada saat A, strategi mulai berjalan, dan strategi mengambil data dari 100 garis K BAR, dan dengan waktu pasti 100 BAR menjadi 101, 102... N. Ketika mulai berjalan pada saat A, BAR ke-101 adalah fase garis K real-time, yang merupakan data real-time terbaru. Jadi dari BAR ke-100 adalah semua tren historis yang telah berlalu, tetapi strategi juga akan berjalan di semua tren historis ini, jadi ini adalah fase garis K historis.

barstate.ishistoryIni adalah variabel built-in dari bahasa Pine, dan jika BAR saat ini adalah BAR dari tahap sejarah,barstate.ishistoryJika true, maka BAR adalah false jika bukan dari tahap sejarah. Jadi not barstate.ishistory adalah true, maka berada pada tahap K-line real-time.

Dan selanjutnya kita membuat 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 ini berfungsi untuk mencari apakah suatu id ada di antara semua order yang saat ini telah dibuka, dan jika ada, ketika panggilan fungsi findTradeId akan mengembalikan ID yang ada (perhatikan bahwa ID ini bukan ID pesanan bursa, tetapi nama atau tag yang diberikan kepada pesanan), jika tidak ada, akan mengembalikan string "notFound".

Setelah itu, mulailah membuat halaman web:

// 实时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)

Menggunakan loop for, berdasarkan nilai parameter numbers, untuk menentukan jumlah putaran, yaitu penempatan order yang sesuai dengan jumlah individu. Menggunakan parameter dir, mengatur arah. Menggunakan fungsi findTradeId untuk mencari apakah order yang diberi label pada posisi grid saat ini sudah dibuka, dan hanya pergi ke daftar jadwal jika tidak dibuka. Menggunakan strategi.order untuk menentukan parameter limit sebagai daftar jadwal. Menggunakan strategi.order untuk menentukan titik keuntungan. Menggunakan strategi.exit untuk menentukan parameter profit.

img

img

img

img

Jika Anda melihat kurva keuntungan, Anda tahu bahwa jaring juga berisiko, bukan menang-menang, tetapi hanya sedikit risiko relatif untuk menarik jaring pada skala besar.

Jadi, dengan bahasa Pine yang mudah dipelajari ini, jika Anda belum menulis strategi, maka saya...


Berkaitan

Lebih banyak

StalkerTutorial tingkat bayi ini bisa lebih dari beberapa, sebaiknya khusus untuk tutorial pine ((pengetahuan berbayar)hhh 。 mimpi total v587

ArtronTerima kasih.

bbbwwed2009Total mimpi V5

Mimpi kecilYa, di stasiun B sudah ada serangkaian tutorial Pine: https://www.bilibili.com/video/BV1sU4y1B71i/

Mimpi kecilTidak sopan, terima kasih untuk mendukung FMZ.

Mimpi kecilDi stasiun B ada video pengenalan bahasa PINE.