Thật đáng tiếc khi có rất nhiều chiến lược, ý tưởng và chỉ số tuyệt vời trên TradingView. Thật đáng tiếc khi thấy điều này, FMZ không thể kiềm chế được sự thúc đẩy để giải quyết nhu cầu này vì họ đang nỗ lực phổ biến công nghệ giao dịch định lượng cho nhiều nhà giao dịch.
Một số người cho rằng việc này không thể chấp nhận được.
Vì vậy, trong thế giới lập trình phát triển mã, sau khi đi bộ trên núi, đi qua hàng ngàn ngọn núi, trải qua 9 * 9 = 81 hố, trải qua vô số đêm không ngủ, các góc tường xếp chồng lên những chiếc hộp trống Red Bull của những ngọn núi nhỏ. Cuối cùng, FMZ hỗ trợ tương thích ngôn ngữ Pine, các kịch bản Pine của TradingView có thể được sử dụng.
Nói về ngôn ngữ Pine, tôi cũng chỉ mới học bản thân gần đây. Nhưng nói thật, ngôn ngữ Pine như một giao dịch định lượng thực sự đơn giản, dễ sử dụng, dễ học. Có gì không? Không tin? Nhìn kìa tôi viết cho bạn một chiến lược lưới
/*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 có nhiều tính năng thực tế, công cụ kiểm tra lại, nhiều tính năng cộng với ngôn ngữ Pine đơn giản và dễ sử dụng, có thể được coi là một cánh hổ! tính toán cài đặt tham số, kiểm tra lại cấu hình mã, tổng số mã không quá 50 dòng.
Tất nhiên, chiến lược này là một chiến lược lưới, chiến lược lưới cũng có vết thương, cũng không phải là máy in mang lại lợi nhuận, quan trọng là xem cách sử dụng, tham số. Điều này là không nói chi tiết, chúng tôi quan tâm nhiều hơn đến cách dễ dàng viết chiến lược, thực hiện logic giao dịch của riêng mình, viết chiến lược giao dịch để kiếm tiền, cảm giác vô cùng thú vị!
Tôi đến đây để giải thích với các quan chức, mã là đơn giản và dễ hiểu, với ngôn ngữ Pine dễ học như vậy nếu bạn chưa viết chiến lược, thì tôi sẽ... nói chi tiết với bạn!
Bắt đầu/*backtest
và*/
Nội dung được bao gồm là mã cấu hình truy cập của FMZ, đó là chức năng của FMZ, chứ không phải là nội dung của ngôn ngữ Pine. Tất nhiên, bạn có thể không viết phần này, bạn cần phải tự động nhấp vào bộ điều khiển tham số để thiết lập cấu hình truy cập và tham số khi truy cập.
/*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]]
*/
Có thể bạn có thể tìm thấy mã sau:
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)
Một số tùy chọn để thiết lập kịch bản, overlay=true, là cho các tham sốoverlay
Đặt giá trị true, để vẽ biểu đồ, vẽ trên biểu đồ chính của biểu đồ ((K đường đồ là biểu đồ chính, dễ hiểu như vậy).).varip beginPrice = 0
: Sử dụng từ khóa varip để tuyên bố một biến BeginPrice được gán giá ban đầu là 0, giá trị này là giá ban đầu được sử dụng làm lưới.var spacing = input.float(-1, title="间距价格")
: đặt một tham số chính sách, tên tham số là giá dao động dao động dao động, đó là khoảng cách của mỗi điểm lưới, đặt 100 là giá trên 100, giao dịch một lần.var dir = input.string("long", title="方向", options = ["long", "short", "both"])
: thiết lập một tham số chính sách, tên là đường dẫn con số, tham số này là một tùy chọn kéo xuống, bạn có thể chọn long, short, both.var amount = input.float(-1, title="下单量")
: Thiết lập một tham số để kiểm soát số lượng giao dịch trong mỗi lần giao dịch điểm lưới.var numbers = input.int(-1, title="网格数量")
: Số điểm lưới, đặt 20 là 20 điểm lưới một hướng.var profit = input.int(-1, title="盈利价差") / syminfo.mintick
: Thiết lập một tham số để kiểm soát mức độ lợi nhuận của mỗi điểm lưới và mức độ chênh lệch giá.Tiếp theo, hãy xem mã:
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("参数错误")
Điều đó có nghĩa là nếu không có bất kỳ một trong các tham số spacing, amount, numbers, profit được thiết lập theo mặc định là -1, thì chính sách sẽ dừng lại (không có tham số không thể chạy mù - haha!)
Nhanh lên!
if not barstate.ishistory and beginPrice == 0
beginPrice := close
Điều này có nghĩa là khi chính sách ở giai đoạn đường K thời gian thực và startPrice == 0, hãy thay đổi giá trị của startPrice thành giá mới nhất hiện tại. Khi chính sách được thực hiện chính thức, giá hiện tại ban đầu sẽ là giá ban đầu của lưới. Vì kịch bản có giai đoạn đường K lịch sử, chính sách sẽ thực hiện một lần nữa logic trong giai đoạn lịch sử BAR, nên sắp xếp lưới trên thanh lịch sử chắc chắn không có ý nghĩa gì.
Giai đoạn lịch sử BAR là gì?
Một ví dụ đơn giản, ví dụ như tại thời điểm hiện tại A, chiến lược bắt đầu chạy, chiến lược lấy một dữ liệu có 100 K-line BAR, và theo thời gian chắc chắn 100 BAR trở thành 101, 102... N. Khi bắt đầu chạy từ thời điểm A, BAR 101 là giai đoạn K-line thời gian thực, và đây là thời điểm dữ liệu thời gian thực mới nhất. Vì vậy, từ BAR 1 đến 100 BAR, tất cả đều là các hành động lịch sử đã qua, nhưng chiến lược cũng sẽ chạy trên các hành động lịch sử này một lần nữa, vì vậy giai đoạn này là giai đoạn K-line lịch sử.
barstate.ishistory
Đây là một biến tích hợp của ngôn ngữ Pine, nếu BAR hiện tại là BAR của giai đoạn lịch sử, bạn có thể sử dụng nó để tạo ra một số biến trong giai đoạn lịch sử.barstate.ishistory
TRUE là TRUE, và BAR là TRUE nếu không phải là giai đoạn lịch sử.
Sau đó, chúng ta tạo ra một hàm.
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
Nhiệm vụ của hàm này là tìm xem một id nào đó có tồn tại trong tất cả các lệnh hiện đang được giao dịch hay không, và nếu có, nó sẽ trả về ID của đơn vị tồn tại khi gọi hàm findTradeId (lưu ý rằng ID này không phải là ID lệnh của sàn giao dịch, đó là tên hoặc thẻ của chính sách cho lệnh), nếu không, nó sẽ trả về chuỗi "notFound".
Sau đó, bắt đầu xây dựng mạng lưới:
// 实时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)
Sử dụng vòng lặp for để xác định số lần vòng lặp dựa trên số lượng các tham số số, tức là đặt các đơn đặt hàng tương ứng với số lượng riêng lẻ. Dựa trên tham số dir, đặt direction. Sử dụng hàm findTradeId để tìm xem các đơn đặt hàng có nhãn vị trí lưới hiện tại đã được mở hay không, chỉ cần không mở để đi xuống danh sách kế hoạch (được mở chắc chắn không thể lặp lại) ; đặt hàng dưới sử dụng hàm strategy.order để chỉ định tham số limit làm danh sách kế hoạch.
Nhìn vào đường cong lợi nhuận, chúng ta biết rằng lưới cũng có rủi ro, không phải là một chiến thắng, chỉ là một chút rủi ro tương đối nhỏ khi kéo lưới lớn trên một quy mô lớn.
Nếu bạn chưa viết chiến lược bằng ngôn ngữ Pine dễ học này, thì tôi sẽ...
Kẻ theo dõiCác bài học ở cấp độ thai nhi có thể có nhiều hơn không, tốt nhất là dành riêng cho các bài học pine ((kiến thức trả tiền)hhh 、 giấc mơ tổng cộng v587
artronCảm ơn.
bbbwwed2009V5 tổng ước mơ
Những nhà phát minh định lượng - những giấc mơ nhỏCó, đã có một loạt các hướng dẫn về Pine tại trạm B: https://www.bilibili.com/video/BV1sU4y1B71i/
Những nhà phát minh định lượng - những giấc mơ nhỏXin cảm ơn vì đã ủng hộ FMZ.
Những nhà phát minh định lượng - những giấc mơ nhỏBạn cũng có thể xem video giới thiệu về ngôn ngữ PINE trên kênh B.