Adalah sangat memalukan bahawa terdapat banyak strategi, idea, dan indikator yang sangat baik di TradingView yang tidak dapat dilaksanakan. FMZ tidak dapat menahan keinginan untuk menyelesaikan masalah ini kerana mereka berusaha untuk menjadikan teknologi perdagangan kuantitatif popular kepada banyak peniaga.
Permintaan ini tidak boleh ditoleransi!
Oleh itu, dalam dunia pengembangan kod pemrograman, gunung-gunung bergelombang, berjalan di atas gunung-gunung, melalui 9 * 9 = 81 lubang, berjemur tanpa tidur malam yang tidak terhitung jumlahnya, dinding sudut menumpuk di atas bukit kecil. Akhirnya, FMZ menyokong bahasa yang serasi dengan Pine, dan pelbagai skrip Pine TradingView boleh diambil dan digunakan.
Saya juga baru belajar sendiri mengenai bahasa Pine. Tetapi sebenarnya, bahasa Pine sebagai transaksi kuantitatif sangat mudah digunakan 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 mempunyai banyak fungsi, alat penyesuaian semula, dan bahasa Pine yang mudah digunakan, yang boleh dikira sebagai sayap harimau! Mengira tetapan parameter, kod konfigurasi penyesuaian semula, jumlah kod tidak melebihi 50 baris.
Sudah tentu, strategi ini adalah strategi jaring, strategi jaring juga mempunyai luka keras, bukan mesin cetak yang menang-menang, penting untuk melihat kegunaan, parameter. Ini tidak akan digariskan, kami lebih memberi tumpuan kepada bagaimana mudah menulis strategi, mewujudkan logik perdagangan anda sendiri, menulis strategi perdagangan sendiri untuk membuat wang, tidak meminta perasaan orang sangat menyeronokkan!
Saya datang untuk menerangkan kepada anda, kodnya mudah difahami, dengan bahasa Pine yang mudah dipelajari dan jika anda belum menulis strategi, saya akan... memberitahu anda secara terperinci!
Permulaan/*backtest
dan*/
Kandungan yang dibungkus adalah kod konfigurasi ulangan FMZ, yang merupakan ciri FMZ, bukan kandungan bahasa Pine. Sudah tentu, anda boleh tidak menulis bahagian ini, anda perlu mengklik kawalan parameter secara manual untuk menetapkan konfigurasi dan parameter ulangan.
/*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 pilihan untuk menetapkan skrip, overlay=true, atau memberi parameteroverlay
Tugaskan nilai true, supaya gambar, gambar pada gambar utama grafik (K garis adalah gambar utama, mudah difahami).varip beginPrice = 0
: Mengisytiharkan nilai awal beginPrice kepada 0 dengan kata kunci varip; nilai ini adalah harga awal yang digunakan sebagai grid.var spacing = input.float(-1, title="间距价格")
: Tetapkan parameter dasar, yang dinamakan parameter harga selang selang, iaitu selang setiap titik grid, menetapkan 100 adalah harga setiap 100, satu dagangan.var dir = input.string("long", title="方向", options = ["long", "short", "both"])
: menetapkan satu parameter dasar, yang dipanggil arah arah, parameter ini adalah pilihan dengan kotak tarik, anda boleh memilih panjang, pendek, atau kedua-duanya.var amount = input.float(-1, title="下单量")
: menetapkan satu parameter untuk mengawal jumlah dagangan pada setiap dagangan titik grid.var numbers = input.int(-1, title="网格数量")
: bilangan titik grid, 20 adalah 20 titik grid dalam satu arah.var profit = input.int(-1, title="盈利价差") / syminfo.mintick
: Set parameter untuk mengawal keuntungan setiap titik grid untuk membetulkan harga yang berlainan.Di sini, lihat kod:
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("参数错误")
Ini bermakna jika sebarang parameter seperti spacing, amount, numbers, profit tidak ditetapkan secara lalai menjadi-1, maka polis akan berhenti (tidak boleh lari tanpa parameter ditetapkan - haha!)
Pergilah!
if not barstate.ishistory and beginPrice == 0
beginPrice := close
Ini bermaksud bahawa apabila strategi berada dalam tahap K baris masa nyata dan beginPrice == 0, untuk mengubah nilai kepada beginPrice, mengubahnya kepada harga terkini semasa. Apabila strategi dijalankan secara rasmi, harga semasa awal adalah harga awal grid. Oleh kerana skrip mempunyai tahap BAR baris K bersejarah, strategi akan menjalankan logik berulang pada tahap BAR bersejarah, meletakkan grid pada BAR sejarah pasti tidak ada gunanya.
Apakah fasa BAR dalam sejarah?
Sebagai contoh sederhana, seperti pada masa sekarang A, strategi bermula untuk menjalankan dan mengambil data yang mempunyai 100 garis K BAR, dengan masa pasti 100 BAR menjadi 101, 102... N. Apabila bermula pada masa A, bar ke-101 adalah tahap K baris masa nyata, yang merupakan data masa nyata terkini. Jadi dari bar 1 hingga 100 BAR, semua ini adalah sejarah yang telah berlalu, tetapi strategi juga akan berjalan berulang kali pada semua peristiwa sejarah ini, jadi tahap ini adalah tahap K baris sejarah.
barstate.ishistory
Ini adalah pemboleh ubah terbina dalam bahasa Pine, dan jika BAR semasa adalah BAR pada peringkat sejarah, maka ia adalah pemboleh ubah yang tidak boleh digunakan.barstate.ishistory
Jika ia adalah benar, BAR adalah salah jika ia bukan tahap sejarah. Oleh itu, not barstate.ishistory adalah benar jika ia berada dalam tahap garis K masa nyata.
Dan seterusnya, kita buat 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 sama ada id tertentu wujud di antara semua pesanan yang telah dibuka pada masa ini, dan jika wujud, apabila panggilan fungsi findTradeId, ia akan mengembalikan ID sel yang ada (ingat bahawa ID ini bukan ID pesanan bursa, tetapi nama atau tag yang digunakan untuk memberi pesanan), jika tidak, ia akan mengembalikan baris "notFound".
Di samping itu, mereka juga telah membuat perancangan untuk mengemas kini laman web mereka.
// 实时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 putaran for, berdasarkan nilai parameter numbers, untuk menentukan jumlah putaran, iaitu meletakkan pesanan yang sesuai dengan nombor individu. Menggunakan parameter dir, menetapkan arah. Menggunakan fungsi findTradeId untuk mencari sama ada pesanan yang diberi tag pada kedudukan grid semasa telah dibuka, dan hanya pergi ke bawah senarai pelan (jika tidak dibuka, pasti tidak boleh diulangi) Apabila pesanan menggunakan strategi.order fungsi menetapkan parameter limit sebagai senarai pelan. Menggunakan senarai pelan yang sama di bawah senarai pelan. Menggunakan fungsi strategi.exit, menetapkan parameter keuntungan, menetapkan titik keuntungan.
Jika dilihat dari kurva keuntungan, grid juga berisiko, bukan menang-menang, tetapi hanya sedikit risiko yang agak kecil untuk menarik grid besar pada skala besar.
Jadi, dengan bahasa Pine yang mudah dipelajari, jika anda belum menulis strategi, saya akan...
PenguntitTutorial peringkat bayi ini bolehkah lebih banyak, lebih baik khusus untuk tutorial pine ((pengetahuan berbayar)hhh 、 mimpi total v587
artronTerima kasih.
bbbwwed2009Rindu total V5
Pencipta Kuantiti - Impian KecilYa, di stesen B telah dibuat satu siri tutorial Pine: https://www.bilibili.com/video/BV1sU4y1B71i/
Pencipta Kuantiti - Impian KecilTidak sopan, terima kasih kerana menyokong FMZ.
Pencipta Kuantiti - Impian KecilTerdapat juga video pengenalan bahasa PINE di stesen B.