avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya...

Dicipta dalam: 2022-06-01 17:37:55, dikemas kini pada: 2023-09-18 20:19:45
comments   6
hits   2992

Jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya…

Jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya…

Terdapat sejumlah besar strategi sumber terbuka di TradingView Sayang sekali bahawa begitu banyak strategi, idea dan penunjuk yang sangat baik tidak dapat dipraktikkan. Melihat perkara ini, FMZ, yang komited untuk mempopularkan teknologi dagangan kuantitatif kepada ramai peniaga, sememangnya tidak dapat menahan keinginan untuk menyelesaikan permintaan ini!

Permintaan ini benar-benar tidak dapat ditanggung!

Jadi, dalam dunia kod pengaturcaraan, saya mengembara melalui gunung dan sungai, dan mengalami 9*9=81 lubang, selepas mengharungi malam tanpa tidur yang tidak terkira banyaknya, segunung tin Red Bull kosong bertimbun di sudut. Akhirnya, FMZ menyokong dan serasi dengan bahasa Pine, dan pelbagai skrip Pine TradingView boleh digunakan.

Bercakap tentang bahasa Pine, saya baru sahaja mempelajarinya sendiri. Tetapi sejujurnya, bahasa Pine untuk perdagangan kuantitatif sangat mudah, mudah digunakan dan mudah dipelajari. apa? tak percaya? Lihatlah 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)

Dagangan masa nyata FMZ, alat ujian belakang, pelbagai fungsi dan kemudahan penggunaan bahasa Pine adalah seperti menambah sayap pada harimau! Termasuk tetapan parameter dan kod konfigurasi ujian belakang, jumlah bilangan kod tidak melebihi 50 baris. Pemula tidak lagi perlu risau tentang menulis grid…

Sudah tentu, strategi ini ialah strategi grid juga mempunyai kelemahannya, dan ia bukan mesin pencetak wang yang terjamin. Kuncinya terletak pada penggunaan dan parameternya. Saya tidak akan menghuraikan perkara ini Mari kita lebih fokus kepada cara menulis strategi dengan mudah, melaksanakan logik dagangan anda sendiri, dan membuat wang dengan menulis strategi anda sendiri tanpa meminta bantuan sesiapa. !

Penerangan Kod

Biar saya terangkan kepada anda, kodnya ringkas dan mudah difahami Jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya akan…….. ……… …………………….Biar saya beritahu anda secara terperinci!

Pada permulaannya/*backtestdan*/Kandungan yang dibalut ialah kod konfigurasi ujian belakang FMZ, yang merupakan fungsi FMZ, bukan kandungan bahasa Pine. Sudah tentu, anda boleh memilih untuk tidak menulis bahagian ini Semasa ujian belakang, anda perlu mengklik kawalan parameter secara manual untuk menetapkan konfigurasi dan parameter ujian belakang.

/*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]]
*/

Kod 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 menetapkan beberapa pilihan skrip, overlay=true, iaitu untuk memberikan parameteroverlayBerikan nilai benar untuk melukis gambar pada gambar utama carta (carta garis K adalah gambar utama, ia boleh difahami semudah ini).
  • varip beginPrice = 0: Harga permulaan pembolehubah diisytiharkan menggunakan varip kata kunci dan pada mulanya diberikan nilai 0, yang digunakan sebagai harga permulaan grid.
  • var spacing = input.float(-1, title="间距价格"): Tetapkan parameter strategi. Nama parameter ialah “harga selang”, iaitu selang antara setiap titik grid Jika ia ditetapkan kepada 100, ini bermakna transaksi akan dibuat setiap kali harga melebihi 100.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"]): Parameter strategi ditetapkan, dinamakan “arah”. Parameter ini ialah pilihan dengan kotak lungsur, dan anda boleh memilih panjang, pendek atau kedua-duanya. Mereka masing-masing menunjukkan bahawa grid hanya berdagang panjang, hanya berdagang pendek, atau berdagang panjang dan pendek.
  • var amount = input.float(-1, title="下单量"): Tetapkan parameter untuk mengawal volum transaksi pada setiap transaksi mata grid.
  • var numbers = input.int(-1, title="网格数量"): Bilangan mata grid Menetapkannya kepada 20 bermakna terdapat 20 mata grid dalam satu arah.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintick: Tetapkan parameter untuk mengawal perbezaan harga di mana kedudukan pada setiap titik grid akan ditutup.

Seterusnya, lihat kod:

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

Ini bermakna jika mana-mana parameter seperti jarak, jumlah, nombor dan keuntungan tidak ditetapkan, nilai lalai ialah -1, yang bermaksud strategi akan berhenti (anda tidak boleh berlari tanpa menetapkan parameter ~ haha!)

Go on !

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

Maksudnya ialah apabila strategi berada dalam peringkat K-line masa nyata dan beginPrice == 0, ubah suai nilai beginPrice kepada harga terkini semasa. Dapat difahami bahawa apabila strategi dijalankan secara rasmi, harga semasa awal ialah harga awal grid. Oleh kerana skrip mempunyai peringkat BAR K-line yang bersejarah, strategi ini akan melaksanakan logik dalam peringkat BAR sejarah Ia sememangnya tidak bermakna untuk mengatur grid pada BAR sejarah.

Apakah Fasa BAR Sejarah?

Untuk memberi contoh mudah, pada masa A semasa, strategi mula berjalan, dan strategi memperoleh data dengan 100 BAR garisan-K Apabila masa berlalu, 100 BAR pasti akan menjadi 101, 102… N. Apabila dijalankan dari masa A, BAR ke-101 ialah peringkat K-line masa nyata, iaitu data masa nyata terkini. Jadi dari BAR 1 hingga BAR ke-100, ini semua adalah keadaan pasaran sejarah yang telah berlalu, tetapi strategi juga akan dijalankan pada keadaan pasaran sejarah ini, jadi peringkat ini adalah peringkat K-line yang bersejarah.

barstate.ishistoryIni ialah pembolehubah terbina dalam bahasa Pine Jika BAR semasa ialah BAR sejarah,barstate.ishistoryJika ia bukan BAR bersejarah, ia adalah palsu. Oleh itu, apabila tidak barstate.ishistory adalah benar, ia berada dalam peringkat K-line masa nyata.

Seterusnya, kami mencipta 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 fungsi ini adalah untuk mengetahui sama ada ID tertentu wujud dalam semua pesanan yang sedang dibuka Jika ia wujud, fungsi findTradeId akan mengembalikan ID pesanan sedia ada apabila ia dipanggil (perhatikan bahawa ID ini bukan ID pesanan. pertukaran, tetapi ID yang diberikan kepada pesanan oleh strategi). , atau ditafsirkan sebagai label), jika ia tidak wujud, mengembalikan rentetan “notFound”.

Seterusnya, kami memulakan helaian 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)

A untuk gelung digunakan untuk menentukan bilangan gelung berdasarkan nilai parameter nombor, iaitu, untuk mengatur bilangan pesanan yang sepadan. Tetapkan arah mengikut parameter dir. Gunakan fungsi findTradeId untuk mengetahui sama ada susunan label pada kedudukan grid semasa telah dibuka Hanya buat pesanan yang dirancang jika ia belum dibuka (jika ia telah dibuka, anda tidak boleh membuat pesanan pendua). Apabila membuat pesanan, gunakan fungsi strategy.order untuk menentukan parameter had untuk membuat pesanan pelan. Letakkan pesanan penutup yang sepadan pada masa yang sama dengan meletakkan pesanan yang dirancang. Untuk menutup kedudukan, gunakan fungsi strategi.exit, tentukan parameter keuntungan dan tentukan mata keuntungan.

Jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya…

Jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya…

Jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya…

Jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya…

Hanya melihat keluk hasil, anda dapat melihat bahawa grid juga mempunyai risiko dan bukan kemenangan yang terjamin.

Nah, jika anda masih tidak boleh menulis strategi menggunakan bahasa Pine yang mudah dipelajari dan mudah digunakan, maka saya…