Jika kau tidak tahu bagaimana menulis strategi dalam bahasa Pine yang mudah dipelajari dan mudah digunakan...

Penulis:Lydia, Dibuat: 2023-02-16 14:55:00, Diperbarui: 2023-09-18 20:18:52

img

Jika kau tidak tahu bagaimana menulis strategi dalam bahasa Pine yang mudah dipelajari dan mudah digunakan...

Jumlah strategi open source di TradingView sangat besar. Sangat disayangkan bahwa begitu banyak strategi, ide, dan indikator yang sangat baik tidak dapat digunakan dalam bot nyata. Melihat ini, FMZ, yang berkomitmen untuk mempopulerkan teknologi perdagangan kuantitatif kepada banyak pedagang, secara alami tidak dapat menekan dorongan ini untuk memecahkan masalah!

Berbagi pengalaman ini benar-benar harus ditawarkan!

Jadi, setelah berjalan melalui dunia pemrograman dan pengembangan kode, melalui 9*9=81 lubang, bertahan hidup tanpa tidur malam yang tak terhitung jumlahnya, dan menumpuk gunung kaleng Red Bull kosong di sudut.

Ketika datang ke bahasa Pine, saya baru saja belajar sendiri. Tapi jujur, bahasa Pine untuk perdagangan kuantitatif sangat mudah digunakan dan mudah dipelajari. Aku akan 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="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit spreads") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("Parameter errors")

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 

// Real-time K-line stage
if not barstate.ishistory
    // Retrieve grid
    for i = 1 to numbers
        // Going long
        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)
        // Going short
        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 bot nyata, alat backtesting, dan banyak fungsi dikombinasikan dengan kesederhanaan bahasa Pine adalah tambahan yang bagus! Termasuk pengaturan parameter dan kode konfigurasi backtesting, total kode kurang dari 50 baris. Tidak ada lagi sakit kepala untuk menulis strategi grid untuk pemula.

Tentu saja strategi ini adalah strategi grid, yang juga memiliki kekurangan, dan itu bukan mesin pencetak uang yang selalu menang. Kuncinya tergantung pada penggunaan dan parameter. Kami akan lebih fokus pada cara menulis strategi dengan mudah untuk menerapkan logika perdagangan kita sendiri, dan menghasilkan uang dengan menulis strategi dan trading sendiri. Sangat keren untuk tidak meminta bantuan!

Penjelasan kode

Aku akan menjelaskan kepada Anda semua, kode yang sederhana dan mudah dipahami, dengan begitu mudah untuk belajar dan menggunakan bahasa Pine, jika Anda masih tidak bisa menulis strategi, maka saya akan... memberitahu Anda secara rinci!

Isi yang disertakan oleh/*backtestdan*/pada awalnya adalah kode konfigurasi backtest FMZ. Ini adalah fungsi FMZ, bukan isi bahasa Pine. Tentu saja, Anda dapat meninggalkan bagian ini, dan Anda akan mengklik kontrol parameter secara manual untuk mengatur konfigurasi backtest dan parameter selama backtesting.

/*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 berikutnya:

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit points") / syminfo.mintick
  • strategy(overlay=true): Ini digunakan untuk mengatur beberapa opsi skrip, overlay=true, yang adalah untuk menetapkan nilai benar untuk parameteroverlay, sehingga ketika menggambar grafik, itu digambar pada grafik utama (K-line chart adalah grafik utama, itu dapat dipahami begitu sederhana).
  • varip beginPrice = 0: Variabel startPrice dinyatakan dengan kata kunci varip dengan nilai awal 0, yang digunakan sebagai harga awal untuk grid.
  • var spacing = input.float(-1, title="Spacing prices"): Tetapkan parameter strategi, nama parameter adalah spacing price, yang merupakan jarak dari setiap titik grid, pengaturan 100 berarti bahwa harga akan diperdagangkan sekali setiap 100.
  • var dir = input.string("long", title="Directions", options = ["long", "short", "both"]): Tetapkan parameter strategi bernama direction, parameter ini adalah kotak drop-down dengan opsi panjang, pendek, dan keduanya, yang berarti bahwa kisi hanya panjang, pendek saja, dan keduanya, masing-masing.
  • var amount = input.float(-1, title="Order quantity"): Atur parameter untuk mengontrol volume perdagangan di setiap perdagangan titik grid.
  • var numbers = input.int(-1, title="Number of grids"): Jumlah titik grid, pengaturan 20 adalah 20 titik grid dalam satu arah.
  • var profit = input.int(-1, title="Profit spreads") / syminfo.mintick: Atur parameter untuk mengontrol margin keuntungan dari setiap posisi titik grid sebelum menutup posisi.

Selanjutnya, lihat kode:

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("Parameter errors")

Ini berarti bahwa jika parameter seperti jarak, jumlah, angka, dan keuntungan tidak ditetapkan, default adalah -1, dan strategi akan berhenti (Anda tidak dapat beroperasi secara membabi buta tanpa pengaturan parameter)

Pergilah!

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

Apa artinya di sini adalah bahwa ketika strategi berada di tahap K-line real-time dan startPrice == 0, ubah nilai startPrice ke harga terbaru saat ini. Hal ini dapat dipahami bahwa ketika strategi berjalan secara resmi, harga awal saat ini adalah harga awal dari grid. Karena skrip memiliki tahap BAR K-line historis, strategi akan mengeksekusi logika sekali di tahap BAR historis, dan jelas tidak masuk akal untuk mengatur grid pada BAR historis.

Apa tahap sejarah BAR?

Untuk memberikan contoh sederhana, pada saat A, strategi mulai berjalan, dan strategi memperoleh data dengan 100 K-line BAR. Seiring berjalannya waktu, 100 BAR akan menjadi 101, 102...N. Ketika mulai berjalan dari saat A, BAR ke-101 adalah tahap K-line real-time, dan waktu ini adalah data real-time terbaru. Kemudian dari BAR ke-1 ke BAR ke-100, ini adalah harga pasar historis yang telah berlalu, tetapi strategi juga akan berjalan pada harga pasar historis ini, jadi tahap ini adalah tahap K-line historis.

barstate.ishistoryini adalah variabel built-in dalam bahasa Pine,barstate.ishistoryadalah benar jika BAR saat ini adalah BAR historis, dan salah jika bukan BAR historis. jadi ketika bukan barstate.ishistory adalah benar, itu adalah pada tahap K-line real-time.

Selanjutnya, sebuah fungsi dibuat

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 

Peran fungsi ini adalah untuk mengetahui apakah id tertentu ada di semua pesanan yang saat ini telah membuka posisi. Jika ada panggilan fungsi findTradeId, itu akan mengembalikan ID pesanan yang ada (perhatikan bahwa ID ini bukan ID pesanan dari bursa, itu adalah nama yang diberikan kepada pesanan oleh strategi atau dipahami sebagai label), jika tidak ada, string notFound dikembalikan.

Langkah selanjutnya adalah memulai lembar grid:

// Real-time K-line stage
if not barstate.ishistory
    // Retrieve grid
    for i = 1 to numbers
        // Going long
        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)
        // Going short
        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)

Fungsi ini digunakan untuk menentukan apakah order label pada posisi grid saat ini telah dibuka, dan hanya menempatkan order yang direncanakan jika tidak ada posisi terbuka (jika posisi dibuka, itu tidak dapat diulang). Untuk menempatkan order, gunakan fungsi strategi.order untuk menentukan parameter batas sebagai order yang direncanakan. Letakkan order penutupan yang sesuai saat menempatkan order yang direncanakan.strategy.exitfungsi, menentukan parameter keuntungan, dan menentukan poin keuntungan.

img

img

Melihat kurva keuntungan, kita bisa melihat bahwa grid juga berisiko. Ini bukan kemenangan yang dijamin. Hanya saja risiko memperluas grid dalam skala besar sedikit lebih kecil.

Jika kau tak tahu cara menulis strategi dalam bahasa Pine yang mudah dipelajari dan mudah digunakan, maka aku...


Berkaitan

Lebih banyak