[TOC]
Video hướng dẫn: Khó khăn trong việc giao dịch theo khối lượng? sử dụng giao dịch xem ngôn ngữ Pine từ nhỏ đến quan trọng - người mới bắt đầu ngôn ngữ Pine
Nền tảng giao dịch định lượng của nhà phát minh hỗ trợ các chiến lược viết ngôn ngữ Pine, hỗ trợ phản hồi, vận hành thực tế các chiến lược ngôn ngữ Pine, tương thích với các phiên bản thấp hơn của ngôn ngữ Pine. Trên nền tảng giao dịch định lượng của nhà phát minh (FMZ.COM)Quảng trường Chiến lượcCó rất nhiều chiến lược và kịch bản của Pine đã được thu thập và di chuyển.
FMZ không chỉ hỗ trợ ngôn ngữ Pine, mà còn hỗ trợ chức năng vẽ mạnh mẽ của ngôn ngữ Pine. Các tính năng trên nền tảng FMZ, các công cụ thực tế phong phú, quản lý dễ dàng và hiệu quả, cũng tăng cường thêm tính thực tế của chiến lược và kịch bản của Pine. FMZ dựa trên khả năng tương thích với ngôn ngữ Pine, đồng thời cũng đã mở rộng, tối ưu hóa và cắt xén ngôn ngữ Pine. Trước khi chính thức vào hướng dẫn, chúng ta hãy cùng nhau xem những thay đổi nào trong ngôn ngữ Pine trên FMZ và bản gốc của Pine.
Một số sự khác biệt rõ ràng:
//@version
Và mã bắt đầustrategy
、indicator
Không có yêu cầu bắt buộc để viết câu nói, FMZ tạm thời không hỗ trợimport
Nhập khẩulibrary
chức năng.Một số chiến lược có thể được viết như sau:
//@version=5
indicator("My Script", overlay = true)
src = close
a = ta.sma(src, 5)
b = ta.sma(src, 50)
c = ta.cross(a, b)
plot(a, color = color.blue)
plot(b, color = color.black)
plotshape(c, color = color.red)
Hoặc là:
//@version=5
strategy("My Strategy", overlay=true)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
Trong FMZ, nó có thể được rút gọn thành:
src = close
a = ta.sma(src, 5)
b = ta.sma(src, 50)
c = ta.cross(a, b)
plot(a, color = color.blue, overlay=true)
plot(b, color = color.black, overlay=true)
plotshape(c, color = color.red, overlay=true)
Hoặc:
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
2 , chiến lược ((script)) một số thiết lập liên quan đến giao dịch được thiết lập bởi tham số “Pine language transaction class library” trên giao diện chiến lược FMZ.
strategy
Chức năngcalc_on_every_tick
Các tham số để thiết lập kịch bản chiến lược thực hiện logic chiến lược trong thời gian thực mỗi khi giá thay đổi, tại thời điểm nàycalc_on_every_tick
Các tham số nên được đặt làtrue
◦ Tính mặc địnhcalc_on_every_tick
Các tham số làfalse
Các logic của chiến lược sẽ được thực hiện khi chiến lược hiện tại K BAR hoàn toàn đi qua.
Trên FMZ, bạn có thể cài đặt thông qua các tham số của mẫu “Pine language transaction class library”.Kiểm soát chính xác các giá trị như giá cả, số lượng đặt hàng dưới khi thực hiện chiến lược cần được chỉ định trên FMZ Trong giao dịch xem vì chỉ có thể thử nghiệm mô phỏng, do đó không có vấn đề về độ chính xác đặt hàng thời gian thực. Trên FMZ có thể chạy chiến lược pin trên thực. Sau đó, bạn cần chiến lược có thể linh hoạt chỉ định giá chính xác của loại giao dịch, số lượng đặt hàng chính xác. Những thiết lập chính xác này là kiểm soát số lượng nhỏ của dữ liệu liên quan, tránh dữ liệu không phù hợp với yêu cầu báo cáo của sàn giao dịch và do đó không thể đặt hàng.
Mã hợp đồng tương lai
Các loại giao dịch trên FMZ nếu là hợp đồng, sẽ có 2 thuộc tính: “cặp giao dịch” và “mã hợp đồng”. Ngoài việc cần thiết phải thiết lập các cặp giao dịch rõ ràng khi thực thi và phản hồi, bạn cũng cần thiết lập mã hợp đồng cụ thể trong tham số “mã hợp đồng” của mẫu “Pine Language Trading Library”. Ví dụ như hợp đồng vĩnh viễn chỉ cần điền vàoswap
, mã hợp đồng để xem cụ thể giao dịch hoạt động có hợp đồng này không. Ví dụ, có giao dịch tất cả các hợp đồng hàng quý, ở đây có thể được điềnquarter
Các mã hợp đồng này tương ứng với mã hợp đồng tương lai được định nghĩa trong tài liệu Javascript/python/c++ của FMZ.
Các thiết lập khác như số lượng đơn hàng tối thiểu, số lượng đơn hàng mặc định, v.v. có thể được xem trong tài liệu ngôn ngữ Pine vềThư viện giao dịch ngôn ngữ PineThông tin về tham số.
runtime.debug
、runtime.log
、runtime.error
FMZ là một hàm mở rộng được sử dụng để khởi động.3 chức năng được thêm vào nền tảng FMZ để khởi động.
runtime.debug
: Chức năng này thường không được sử dụng để in thông tin biến trên bàn điều khiển.
runtime.log
: xuất nội dung trong nhật ký │ FMZ PINE có chức năng riêng │
runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
runtime.error
: khi được gọi, sẽ gây ra lỗi chạy và có thông báo lỗi được chỉ định trong tham số message.
runtime.error(message)
4, phần của hàm vẽ đã được mở rộngoverlay
tham số
Ngôn ngữ Pine trên FMZ, hàm vẽplot
、plotshape
、plotchar
Thêm nữa.overlay
Chức năng hỗ trợ cho phép chỉ định hình ảnh trên đồ họa chính hoặc đồ họa phụ.overlay
cài đặttrue
Hình vẽ trên bản đồ chính, thiết lập làfalse
Hình vẽ trên phụ. Cho phép các chiến lược Pine trên FMZ có thể vẽ cả hình chính và hình phụ cùng một lúc.
syminfo.mintick
Lấy giá trị của biến tích hợpsyminfo.mintick
Biến tích hợp được định nghĩa là giá trị đo tối thiểu của giống hiện tại. Trong FMZLời đề nghị chắc chắn/Kiểm tra ngượcCài đặt chính xác giá trị tiền tệ 2 nghĩa là giá trị giao dịch chính xác đến số nhỏ thứ hai, tại thời điểm đó giá trị thay đổi nhỏ nhất là 0.01syminfo.mintick
Giá trị là 0.01 .
Ví dụ: giá đặt hàng là 8000, bán hướng, số lượng 1 tay (một tờ), giá trung bình sau khi giao dịch không phải là 8000, thấp hơn 8000 (chi phí bao gồm phí xử lý).
Khi bắt đầu học nền tảng của ngôn ngữ Pine, có thể trong một số ví dụ, chúng ta không quen thuộc với các lệnh, ngữ pháp mã. Không hiểu thì không sao, chúng ta có thể quen thuộc với các khái niệm, hiểu mục đích của bài kiểm tra, hoặc có thể truy cập tài liệu ngôn ngữ Pine của FMZ để xem hướng dẫn. Sau đó, theo hướng dẫn từng bước một để dần dần quen thuộc với các ngữ pháp, lệnh, hàm, biến tích hợp.
Khi bắt đầu học ngôn ngữ Pine, rất cần thiết để hiểu các khái niệm liên quan như quá trình thực hiện chương trình kịch bản ngôn ngữ Pine. Chiến lược ngôn ngữ Pine được vận hành dựa trên biểu đồ, có thể hiểu là chiến lược ngôn ngữ Pine là một loạt các tính toán và thao tác, được thực hiện trên biểu đồ theo thứ tự thời gian theo thứ tự thời gian, bắt đầu từ dữ liệu đầu tiên đã được tải lên biểu đồ.bar_index
Dẫn đến giá trị chỉ mục của dòng K Bar hiện tại khi thực thi kịch bản Pine.
plot(bar_index, "bar_index")
plot
Chức năng là một trong những chức năng chúng ta sẽ sử dụng nhiều hơn trong tương lai. Nó rất đơn giản để sử dụng, chỉ cần vẽ một đường trên biểu đồ dựa trên các tham số được truyền, và dữ liệu được truyền làbar_index
, dòng tên làbar_index
。 Bạn có thể thấy trên Bar đầu tiên, dòng có tên là bar_index có giá trị là 0, và tăng 1 。 khi Bar tăng về phía bên phải.
Các thiết lập khác nhau của chính sách và cách thức thực hiện mô hình chính sách khác nhau.收盘价模型
Và实时价模型
Các mô hình giá đóng cửa, mô hình giá thời gian thực đã được giới thiệu trước đây.
Khi mã chiến lược được thực hiện, chu kỳ của Bar K hiện tại được thực hiện hoàn toàn, khi K đóng thì chu kỳ K đã kết thúc. Tại thời điểm này, logic chiến lược Pine được thực hiện một lần nữa, và tín hiệu giao dịch được kích hoạt sẽ được thực hiện khi K Bar tiếp theo bắt đầu.
Khi mã chiến lược được thực hiện, Bar K hiện tại sẽ thực hiện logic chiến lược Pine một lần cho mỗi lần thay đổi, bất kể có đóng hay không, và tín hiệu giao dịch được kích hoạt sẽ được thực hiện ngay lập tức.
Khi chiến lược ngôn ngữ Pine được thực hiện từ trái sang phải trên biểu đồ, K-bar trên biểu đồ được chia thành历史Bar
Và实时Bar
của:
Khi chiến lược được thiết lập là “Mô hình giá thực” bắt đầu thực hiện, tất cả các K-bar trên biểu đồ ngoại trừ một K-bar ở bên phải nhất历史Bar
◦ Lập luận chiến lược trong mỗi cột历史Bar
Chỉ thực hiện một lần.
Khi chiến lược được thiết lập là “Mô hình giá đóng cửa” bắt đầu thực hiện, tất cả các Bar trên biểu đồ đều là历史Bar
◦ Lập luận chiến lược trong mỗi cột历史Bar
Chỉ thực hiện một lần.
Tính toán dựa trên lịch sử Bar: Mã chiến lược được thực hiện một lần trong trạng thái đóng lịch sử Bar, sau đó mã chiến lược tiếp tục được thực hiện trong lịch sử Bar tiếp theo cho đến khi tất cả các lịch sử Bar được thực hiện một lần.
Khi chiến lược được thực hiện trên Bar K cuối cùng ở bên phải, Bar đó là Bar thời gian thực. Khi Bar thời gian thực đóng cửa, Bar này sẽ trở thành một Bar thời gian thực đã qua (thay đổi thành Bar lịch sử).
Khi chiến lược được đặt thành “Mô hình giá thời gian thực” bắt đầu thực hiện, mỗi lần thay đổi hành động trên thanh thời gian thực sẽ thực hiện một logic chiến lược. Khi chiến lược được đặt thành “Mô hình giá đóng cửa” bắt đầu thực hiện, biểu đồ sẽ không hiển thị Bar thực.
Dựa trên tính toán của Bar:
Nếu thiết lập chiến lược là “Mô hình giá đóng cửa” biểu đồ không hiển thị Bar thực tế, mã chiến lược chỉ được thực hiện một lần khi Bar hiện tại đóng cửa.
Nếu thiết lập một chiến lược là “mô hình giá cổ phiếu thực” thì tính toán và lịch sử Bar trên thực tế Bar hoàn toàn khác nhau, mỗi lần thay đổi hành động trên Bar thực tế sẽ thực hiện một mã chiến lược. Ví dụ: biến tích hợphigh
、low
、close
Trong lịch sử Bar là xác định, trong thời gian thực Bar có thể mỗi khi hành động thay đổi những giá trị này sẽ thay đổi. Vì vậy, các chỉ số dựa trên các giá trị tính toán dữ liệu cũng sẽ thay đổi trong thời gian thực.close
Nó luôn luôn là giá hiện tại.high
Vàlow
Luôn đại diện cho các điểm cao nhất và thấp nhất đạt được kể từ khi Bar hiện tại bắt đầu. Các biến tích hợp này đại diện cho các giá trị cuối cùng khi Bar hiện tại được cập nhật lần cuối.
Cơ chế quay trở lại khi thực hiện chiến lược trên Bar thời gian thực (trong mô hình giá thời gian thực): Trong thực hiện Bar trong thời gian thực, mỗi lần lặp lại của chiến lược thực hiện biến định nghĩa của người dùng trước khi đặt lại được gọi là quay trở lại. Để hiểu cơ chế quay trở lại bằng một ví dụ, chúng ta hãy kiểm tra mã như sau.
Để ý:
/*backtest
...
..
.
*/
Nội dung của gói là thông tin cấu hình phản hồi được lưu trữ dưới dạng mã trên nền tảng FMZ.
/*backtest
start: 2022-06-03 09:00:00
end: 2022-06-08 15:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
var n = 0
if not barstate.ishistory
runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
n := n + 1
runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
plot(n, title="n")
Chúng tôi chỉ xem xét các cảnh được thực hiện trong thời gian thực của Bar, vì vậy chúng tôi sử dụngnot barstate.ishistory
Hạn chế biểu thức chỉ tích lũy n biến trong thời gian thực Bar và được sử dụng trước và sau khi thực hiện hoạt động tích lũyruntime.log
Hàm xuất thông tin trong nhật ký chính sách. Từ việc sử dụng hàm đồ họaplot
Đường cong n được vẽ có thể thấy là 0 trong khi chiến lược đang ở trong lịch sử Bar chạy. Khi thực hiện đến Bar thực tế kích hoạt hoạt động n tích lũy 1, và mỗi lần thực hiện chiến lược trên Bar thực tế thực hiện n tích lũy 1. Từ thông tin nhật ký, có thể thấy rằng mỗi lần thực hiện lại mã chiến lược n được đặt lại vào giá trị mà chiến lược thực hiện Bar trước đó cuối cùng đã gửi.
Tóm lại: 1 , Chiến lược thực hiện một mã chiến lược mỗi lần cập nhật tình huống khi Bar thực hiện. 2 Khi thực hiện trên Real-time Bar, mỗi lần thực hiện mã chính sách sẽ xoay ngược các biến. 3, khi thực hiện trên thực tế Bar, biến được gửi một lần khi cập nhật kết thúc.
Các thao tác vẽ như đường cong trên biểu đồ cũng có thể gây ra việc vẽ lại, vì dữ liệu sẽ quay ngược, ví dụ như chúng ta sửa đổi mã thử nghiệm trước đó, thử nghiệm ổ cứng:
var n = 0
if not barstate.ishistory
runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
n := open > close ? n + 1 : n
runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
plot(n, title="n")
Bức ảnh chụp màn hình tại thời điểm A
Ảnh chụp màn hình của khoảnh khắc B
Chúng tôi chỉ sửa đổi câu này:n := open > close ? n + 1 : n
, Bar hiện tại trong thời gian thực là âm ((nghĩa là giá mở cửa cao hơn giá đóng cửa) chỉ khi n được tích lũy 1. Bạn có thể thấy rằng trong biểu đồ đầu tiên ((thời điểm A) vì giá mở cửa cao hơn giá đóng cửa ((thời điểm âm)) vì vậy n được tích lũy 1, đường cong n hiển thị giá trị là 5 . Sau đó, thay đổi, giá cập nhật như trong biểu đồ thứ hai ((thời điểm B) hiển thị.
Dưới đây chúng ta cùng nghiên cứu các biến trong hàm ngôn ngữ Pine. Theo mô tả trên một số hướng dẫn của Pine, các biến trong hàm khác với các biến ngoài hàm như sau:
Lịch sử của các biến chuỗi được sử dụng trong hàm Pine được tạo ra bằng mỗi lần gọi liên tiếp của hàm. Nếu không có hàm được gọi trên mỗi cột trong kịch bản, điều này sẽ dẫn đến sự khác biệt giữa các giá trị lịch sử của chuỗi bên trong và bên ngoài khối hàm. Do đó, nếu không có hàm được gọi trên mỗi cột, các chuỗi được sử dụng cùng một giá trị chỉ mục trong và bên ngoài hàm sẽ không tham khảo cùng một điểm lịch sử.
Có gì khó hiểu không? Không có vấn đề gì, chúng tôi đã tìm hiểu vấn đề này bằng cách chạy một đoạn mã thử nghiệm trên FMZ:
/*backtest
start: 2022-06-03 09:00:00
end: 2022-06-08 15:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
f(a) => a[1]
f2() => close[1]
oneBarInTwo = bar_index % 2 == 0
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
plot(close[2], title = "close[2]", color = color.red, overlay = true)
plot(close[1], title = "close[1]", color = color.green, overlay = true)
Chụp ảnh chụp lại hoạt động
Mã kiểm tra khá đơn giản, chủ yếu là để xem xét dữ liệu được trích dẫn theo hai cách, đó là:f(a) => a[1]
Vàf2() => close[1]
。
f(a) => a[1]
: cách sử dụng tham số truyền, hàm cuối cùng trả vềa[1]
。
f2() => close[1]
: Sử dụng biến tích hợp trực tiếpclose
Function cuối cùng được trả về.close[1]
。
[]
Biểu tượng được sử dụng để tham chiếu các giá trị lịch sử của các biến trong chuỗi dữ liệu, close[1] là trích dẫn dữ liệu giá đóng cửa trên Bar trước giá đóng cửa hiện tại.
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
Vẽ một ký tự từ A đến B, màu đỏ, chỉ vẽ khi oneBarInTwo là đúng, và vị trí vẽ trên trục Y là:f(close)
Giá trị trả về:
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
Vẽ một ký tự B, màu xanh lá cây, khi oneBarInTwo là đúng, và vị trí của nó (trên trục Y) là:f2()
Giá trị trả về:
plot(close[2], title = "close[2]", color = color.red, overlay = true)
Đường vẽ, màu đỏ, vị trí vẽ (trên trục Y) là:close[2]
Đó là giá đóng cửa trên Bar hiện tại số 2 trước của Bar ((2 số trái của Bar)).
plot(close[1], title = "close[1]", color = color.green, overlay = true)
Đường vẽ, màu xanh lá cây, vị trí vẽ (trên trục Y) là:close[1]
Đó là giá đóng cửa trên Bar hiện tại.
Các chức năng được sử dụng cho các thẻ vẽ A mặc dù bạn có thể nhìn thấy các hình ảnh chụp hoạt động của chiến lược phản hồif(a) => a[1]
và các hàm được sử dụng để đánh dấu Bf2() => close[1]
Tất cả đều được sử dụng.[1] để tham khảo dữ liệu lịch sử trên chuỗi dữ liệu, nhưng vị trí của dấu “A” và “B” trên biểu đồ hoàn toàn khác nhau. Vị trí của dấu “A” luôn nằm trên đường màu đỏ, tức là mã trong chiến lượcplot(close[2], title = "close[2]", color = color.red, overlay = true)
Dưới đây là một ví dụ về một con số được vẽ trên một đường và sử dụng nó để vẽ một đường.close[2]
。
Lý do là chỉ mục của K-lineBar, tức là biến tích hợpbar_index
Tính liệu có vẽ dấu “A” và “B” không. Chữ “A” và “B” không được vẽ trên mỗi thanh K.f(a) => a[1]
Giá trị được trích dẫn theo cách này sẽ tương ứng với hàm nếu hàm không được gọi trên mỗi Bar.f2() => close[1]
Các giá trị được trích dẫn theo cách này khác nhau[1] cùng một chỉ mục như vậy) [2].
Một ví dụ đơn giản cho thấy điều này:
res = close > close[1] ? ta.barssince(close < close[1]) : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
Chúng ta sẽ gọi hàmta.barssince(close < close[1])
Viết trong một toán tử ba chiềucondition ? value1 : value2
Điều này dẫn đến việc chỉ cóclose > close[1]
Khi gọi hàm ta.barssince.ta.barssince
Chức năng được tính từ lần gần nhấtclose < close[1]
Số lượng dòng K khi tạo ra. Khi gọi hàm ta.barssince, tất cả các hàm đều là close > close[1], tức là giá đóng cửa hiện tại lớn hơn giá đóng cửa của Bar trước đó, khi hàm ta.barssince được gọi thì điều kiện của nó là close < close[1] không được thành lập, và không có vị trí thành lập gần đây nhất.
ta.barssince: Khi được gọi, hàm này sẽ trả về na。 nếu điều kiện này chưa bao giờ được đáp ứng trước dòng K hiện tại.
Như thể hiện trong hình:
Vì vậy, khi vẽ, chúng ta chỉ vẽ dữ liệu khi biến res có giá trị ((-1) }}.
Để tránh vấn đề này, chúng ta chỉ cần sử dụngta.barssince(close < close[1])
Gọi hàm lấy từ toán tử tri, viết bên ngoài bất kỳ nhánh điều kiện nào có thể. Cho phép nó thực hiện tính toán trên mỗi dòng K Bar.
a = ta.barssince(close < close[1])
res = close > close[1] ? a : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
Khái niệm về trình tự thời gian rất quan trọng trong ngôn ngữ Pine, và là một khái niệm chúng ta phải hiểu khi học ngôn ngữ Pine. trình tự thời gian không phải là một loại mà là cấu trúc cơ bản để lưu trữ các giá trị liên tục của các biến theo thời gian, chúng ta biết rằng kịch bản Pine dựa trên biểu đồ, và nội dung cơ bản nhất được hiển thị trong biểu đồ là biểu đồ K. trình tự thời gian trong đó mỗi giá trị được liên kết với mốc thời gian của một thanh K.open
là một biến trong ngôn ngữ Pine (built-in), cấu trúc của nó là một chuỗi thời gian để lưu trữ giá mở cửa của mỗi dòng K Bar. Nó có thể được hiểu làopen
Cấu trúc trình tự thời gian này đại diện cho giá mở của tất cả các Bar của K trong K hiện tại từ Bar đầu tiên bắt đầu đến Bar hiện tại. Nếu K hiện tại là chu kỳ 5 phút, chúng tôi sẽ trích dẫn trong mã chiến lược Pine (hoặc sử dụng)open
Giá mở cửa của K-Line Bar khi sử dụng mã chiến lược hiện tại. Nếu muốn tham khảo các giá trị lịch sử trong chuỗi thời gian, cần sử dụng[]
Điều khiển: Khi chính sách Pine được thực hiện trên một K-line Bar, nó được sử dụngopen[1]
Hiển thị trích dẫnopen
Giá mở đầu của K-bar trước của K-bar hiện tại của kịch bản hiện tại trong chuỗi thời gian ((đó là giá mở đầu của K-bar trước).
ta.cum
Ví dụ: ta.cum
Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
ta.cum(source) → series float
RETURNS
Total sum series.
ARGUMENTS
source (series int/float)
SEE ALSO
math.sum
Mã kiểm tra:
v1 = 1
v2 = ta.cum(v1)
plot(v1, title="v1")
plot(v2, title="v2")
plot(bar_index+1, title="bar_index")
Có rất nhiều tương tựta.cum
Các hàm tích hợp như vậy có thể xử lý trực tiếp dữ liệu trên chuỗi thời gian, chẳng hạn nhưta.cum
Chúng ta có thể sử dụng một biểu đồ để dễ hiểu hơn.
Hướng dẫn hoạt động của chiến lược | - | - | - | - | Chiến lược này được thực hiện trên đường K-bar 0 và 1 và 1. Chiến lược này được thực hiện trên đường K-bar thứ hai là 1, 2, 3. Chiến lược này được thực hiện trên đường thứ ba, K-bar, và nó có 2 và 1 và nó có 3. |…|…|…|…| Chiến lược này được thực hiện trên n+1 gốc K, n-thanh, n-thanh, n-thanh.
Bạn có thể thấy rằng v1, v2 và thậm chí bar_index đều là cấu trúc theo trình tự thời gian, mỗi Bar có dữ liệu tương ứng. Mã thử nghiệm này không phân biệt giữa mô hình giá thực hoặc mô hình giá đóng cửa chỉ để hiển thị Bar thực trên biểu đồ. Để đo lại tốc độ, chúng tôi sử dụng thử nghiệm phản hồi mô hình giá đóng cửa.
Vì biến v1 trên mỗi thanh là 1ta.cum(v1)
Khi hàm được thực hiện trên dòng Bar đầu tiên của K, vì chỉ có dòng Bar đầu tiên, nó được tính là 1, và được gán giá trị cho biến v2.
Khita.cum(v1)
Khi thực hiện trên Bar K thứ hai, đã có 2 Bar K ((bar_index của biến nén tương ứng đầu tiên là 0, bar_index của biến nén tương ứng thứ hai là 1), vì vậy kết quả tính toán là 2, gán giá trị cho biến v2, v.v.). Thực tế có thể thấy rằng v2 là số lượng Bar K trong biểu đồ, vì chỉ số của Kbar_index
Vậy là chúng ta có thể bắt đầu từ 0.bar_index + 1
Thực tế là số lượng của dòng K.v2
Vàbar_index
Nó là sự trùng hợp.
Tôi cũng có thể sử dụngta.cum
Chức năng này sẽ tính tổng giá trị đóng cửa của tất cả các Bar trên biểu đồ hiện tại, và chỉ có thể viết như sau:ta.cum(close)
, khi chiến lược chạy đến thanh thời gian thực ở bên phảita.cum(close)
Kết quả tính toán là tổng giá đóng cửa của tất cả các Bar trên biểu đồ (không chạy đến bên phải, chỉ cộng thêm vào Bar hiện tại).
Các biến trên chuỗi thời gian cũng có thể được tính toán bằng các toán tử, chẳng hạn như mã:ta.sma(high - low, 14)
và thay đổi các biến tronghigh
(K-line Bar giá cao nhất) trừ đilow
(Giá thấp nhất của K-Line Bar), sử dụng cuối cùngta.sma
Chức năng tìm trung bình.
v1 = ta.highest(high, 10)[1]
v2 = ta.highest(high[1], 10)
plot(v1, title="v1", overlay=true)
plot(v2, title="v2", overlay=true)
Mã thử nghiệm này được thực hiện khi thử nghiệm lại và có thể quan sát thấyv1
Vàv2
Các giá trị của các hàm là giống nhau, và các đường được vẽ trên biểu đồ cũng trùng khớp hoàn toàn. Các kết quả tính toán của hàm gọi sẽ để lại dấu vết của các giá trị trong chuỗi thời gian, chẳng hạn như mãta.highest(high, 10)[1]
Trong số đó,ta.highest(high, 10)
Kết quả tính toán của hàm gọi cũng có thể được sử dụng[1] để trích dẫn giá trị lịch sử của nó.ta.highest(high, 10)
Kết quả là:ta.highest(high[1], 10)
Vì thế.ta.highest(high[1], 10)
Vàta.highest(high, 10)[1]
Giá tương đương.
Chứng thực thông tin đầu ra bằng hàm phác họa khác:
a = ta.highest(close, 10)[1]
b = ta.highest(close[1], 10)
plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red, overlay=true)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)
Bạn có thể thấy các giá trị của biến a và biến b trong chuỗi thời gian được hiển thị ở trên và dưới Bar tương ứng. Bạn có thể giữ mã vẽ này trong quá trình học, vì khi kiểm tra, thử nghiệm, thông tin có thể thường xuyên cần xuất trên biểu đồ để quan sát.
Trong phần đầu của hướng dẫn, chúng tôi đã tóm tắt một số điểm khác nhau về việc sử dụng ngôn ngữ Pine trên FMZ và trên Trading View.indicator()
、strategy()
Và, tạm thời, không hỗ trợ.library()
Tất nhiên, để tương thích với phiên bản trước của kịch bản Pine, khi viết chiến lược, hãy viết những điều như://@version=5
,indicator()
,strategy()
Một số thiết lập chính sách cũng có thể được cài đặt trong các trang web khác.strategy()
Cài đặt tham số truyền trong hàm ◦
<version>
<declaration_statement>
<code>
<version>
Thông tin kiểm soát phiên bản có thể bị bỏ qua.
Ngôn ngữ Pine//
Cụm chú thích đơn dòng, bởi vì ngôn ngữ Pine không có chú thích đa dòng./**/
Nó được sử dụng cho nhiều dòng chú thích.
Một câu lệnh có thể là một trong những nội dung này.
if
,for
,while
hoặcswitch
Cấu trúcCác câu có thể được sắp xếp theo nhiều cách
空格
hoặc制表符
(Tab) bắt đầu. Các ký tự đầu tiên của chúng cũng phải là ký tự đầu tiên của dòng. Các dòng bắt đầu ở vị trí đầu tiên của dòng, theo định nghĩa trở thành một phần của phạm vi toàn cầu của kịch bản.local block
Một khối địa phương phải được thu nhỏ thành một dấu biểu thức hoặc bốn khoảng trống (trừ khi nó được phân tích thành chuỗi liên kết của dòng trước, tức là được coi là nội dung liên tục của dòng trước), mỗi khối địa phương xác định một phạm vi địa phương khác nhau.Ví dụ, bao gồm ba khối địa phương, một trong các tuyên bố hàm tùy chỉnh và hai trong các tuyên bố biến sử dụng cấu trúc if, như sau:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
Các dòng dài có thể được chia thành nhiều dòng hoặc được “bọc” lên. Các dòng được bọc phải được thu hẹp vào bất kỳ số lượng khoảng trống nào, miễn là nó không phải là nhân của 4 (các biên giới này được sử dụng để thu hẹp vào các khối cục bộ).
a = open + high + low + close
Có thể được đóng gói thành (lưu ý rằng số khoảng trống mỗi dòng không phải là nhân của 4):
a = open +
high +
low +
close
Một cuộc gọi plot (()) dài có thể được đóng gói thành ▽.
close1 = request.security(syminfo.tickerid, "D", close) // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close) // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100), // 一行长的plot()调用可以被包装
color = color.new(color.purple, 40),
style = plot.style_area,
trackprice = true)
Các câu trong tuyên bố hàm được định nghĩa bởi người dùng cũng có thể được đóng gói. Tuy nhiên, vì khối địa phương phải bắt đầu bằng dấu rút gọn theo ngữ pháp ((4 khoảng trống hoặc 1 biểu tượng), khi chia nó thành hàng tiếp theo, phần tiếp tục của câu phải bắt đầu bằng một hoặc nhiều dấu rút gọn ((không bằng số nhân của 4 khoảng trống). Ví dụ:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
Trước khi hiểu về biến, chúng ta cần hiểu khái niệm về ký tự nhận diện hàm.chức năngVàBiến sốTên của ((được sử dụng để đặt tên cho biến, hàm) chức năngChúng ta sẽ tìm hiểu trong các bài học tiếp theo, chúng ta sẽ bắt đầu bằng việc học các ký hiệu nhận diện
(A-Z)
Hoặc viết nhỏ(a-z)
Chữ hoặc gạch chéo(_)
Bắt đầu, là ký tự đầu tiên trong nhận dạng.Ví dụ như tên của các biểu tượng:
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // 错误的命名!使用了数字字符作为标识符的开头字符
Giống như hầu hết các ngôn ngữ lập trình khác, ngôn ngữ Pine cũng có đề xuất viết. Thường được đề xuất khi đặt tên cho các định danh:
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7
// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0
Các toán tử là một số ký hiệu hoạt động trong ngôn ngữ lập trình được sử dụng để xây dựng biểu thức, và biểu thức là quy tắc tính toán được thiết kế cho một số mục đích tính toán khi chúng ta viết chiến lược. Các toán tử trong ngôn ngữ Pine được phân loại theo chức năng:
Các toán tử định giá, toán tử số, toán tử so sánh, toán tử logic,? :
Máy tính ba chiều.[]
Hoạt động trích dẫn lịch sử.
Các toán tử tính toán*
Ví dụ, để phân biệt các loại vấn đề do kết quả trả về của toán tử ngôn ngữ Pine trên Trading View, có mã kiểm tra sau:
//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength) // Compilation error!
plot(ma)
Nếu bạn có thể làm điều này, bạn sẽ nhận được một lỗi biên dịch khi chạy kịch bản này trên Trình xem giao dịch vì:adjustedLength = lenInput * factor
Sau khi nhân, chúng ta sẽ cóseries int
Tuy nhiên,ta.ema
Các tham số thứ hai của hàm không hỗ trợ loại này. Tuy nhiên, trên FMZ không có những hạn chế nghiêm ngặt như vậy, các mã trên có thể hoạt động bình thường.
Sau đây chúng ta sẽ xem xét cách sử dụng các toán tử khác nhau.
Có hai loại toán tử định giá:=
、:=
Chúng ta đã thấy nó trong một vài ví dụ ở phần đầu của bài học.
=
Hoạt động được sử dụng để ban đầu hóa hoặc tuyên bố giá trị cho biến.=
Các biến sau khi định giá sẽ bắt đầu với giá trị đó trên mỗi Bar sau đó. Đây là các tuyên bố biến có hiệu lực:
a = close // 使用内置变量赋值给a
b = 10000 // 使用数值赋值
c = "test" // 使用字符串赋值
d = color.green // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)
Để ýa = close
Định nghĩa định giá, trong mỗi Bar biến a là giá đóng cửa hiện tại của Bar đó ((close) ⋅ các biến khácb
、c
、d
Nó không thay đổi, có thể được thử nghiệm trong hệ thống phản hồi trên FMZ, và kết quả có thể được nhìn thấy từ bản đồ.
:=
Nó được sử dụng để gán lại giá trị cho một biến hiện có, có thể được hiểu đơn giản là sử dụng:=
Các toán tử được sử dụng để thay đổi giá trị của các biến đã được khai báo và khởi tạo.
Nếu sử dụng:=
Hình thức gán giá trị cho một biến chưa được khởi tạo hoặc tuyên bố sẽ gây ra lỗi, ví dụ:
a := 0
Vì vậy,:=
Các toán tử định giá thường được sử dụng để định giá lại các biến đã có, ví dụ:
a = close > open
b = 0
if a
b := b + 1
plot(b)
Xác địnhclose > open
(tức là BAR hiện tại là đường dương) và biến a là giá trị thực ((true)) sẽ thực hiện mã trong khối địa phương của câu nói ifb := b + 1
, sử dụng toán tử định giá:=
Đặt giá trị lại cho b, cộng thêm một 1 ◦ và sau đó sử dụng hàm plot để vẽ trên biểu đồ các giá trị của biến b trên mỗi BAR trong chuỗi thời gian, kết nối các dòng ◦
Chúng ta có nghĩ rằng nếu có một trục BAR, b sẽ tiếp tục tích lũy 1 không? Tất nhiên là không, ở đây chúng ta không sử dụng bất kỳ từ khóa nào khi chúng ta tuyên bố biến b và khởi tạo nó là 0b=0
Vì vậy, bạn có thể thấy rằng kết quả của việc chạy mã này là mỗi lần b được đặt lại là 0 nếu a là giá trị thực.close > open
Vì vậy, khi thực hiện vòng mã này, b sẽ cộng 1, khi vẽ hàm plot, b là 1, nhưng khi thực hiện vòng mã tiếp theo, b sẽ được định giá lại là 0. Đây cũng là nơi mà người mới bắt đầu ngôn ngữ Pine dễ bị mắc kẹt.
Nói về toán tử định giá, chúng ta phải mở rộng về hai từ khóa:var
、varip
Từ khóa này, chúng ta đã thấy và sử dụng trong các hướng dẫn trước đó, nhưng chúng ta không tìm hiểu chi tiết về nó.
var là từ khóa được sử dụng để phân bổ và khởi tạo biến một lần. Thông thường, ngữ pháp gán giá trị biến mà không bao gồm từ khóa var sẽ dẫn đến giá trị biến được che phủ mỗi khi dữ liệu được cập nhật. Ngược lại, khi sử dụng từ khóa var để phân bổ biến, chúng vẫn có thể giữ trạng thái trơ trẽn mặc dù dữ liệu được cập nhật
Chúng ta vẫn dùng ví dụ này, nhưng chúng ta dùng nó khi chúng ta định giá cho b.var
Từ khóa:
a = close > open
var b = 0
if a
b := b + 1
plot(b)
var
Từ khóa cho phép biến b chỉ thực hiện định giá ban đầu lần đầu tiên, sau đó không đặt lại b là 0 mỗi khi thực hiện logic chính sách, vì vậy từ đường vẽ khi chạy có thể quan sát được b, tức là số lượng đường dương BAR đã xuất hiện khi đo lại đường K hiện tại BAR.
Các biến trong tuyên bố var không chỉ có thể được viết trong phạm vi toàn cầu mà còn có thể được viết trong các khối mã, ví dụ như ví dụ này:
strategy(overlay=true)
var a = close
var b = 0.0
var c = 0.0
var green_bars_count = 0
if close > open
var x = close
b := x
green_bars_count := green_bars_count + 1
if green_bars_count >= 10
var y = close
c := y
plot(a, title = "a")
plot(b, title = "b")
plot(c, title = "c")
Biến số ‘a’ giữ giá đóng cửa của cột đầu tiên trong chuỗi. Biến số ‘b’ giữ giá đóng cửa của thanh giá thạch anh xanh đầu tiên trong chuỗi. Biến số ‘c’ giữ giá đóng cửa của 10 quả khoai tây xanh trong chuỗi.
varip
Chúng ta có thể nhìn thấy từ khóa này lần đầu tiên, và chúng ta có thể thấy mô tả của từ khóa này:
varip ((var intrabar persist) là từ khóa được sử dụng để phân bổ và khởi tạo biến một lần. Nó tương tự như từ khóa var, nhưng biến sử dụng tuyên bố varip giữ giá trị của nó giữa các bản cập nhật K-line trong thời gian thực.
Có khó hiểu hơn không? Không sao, chúng tôi sẽ giải thích bằng ví dụ, rất dễ hiểu.
strategy(overlay=true)
// 测试 var varip
var i = 0
varip ii = 0
// 将策略逻辑每轮改变的i、ii打印在图上
plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)
// 每轮逻辑执行都给i、ii递增1
i := i + 1
ii := ii + 1
Mã thử nghiệm này hoạt động khác nhau trên mô hình giá đóng cửa và mô hình giá thực tế:
Mô hình giá thực tế:
Bạn có nhớ chúng tôi đã nói trước đây rằng khi thực hiện chiến lược, chúng ta sẽ phân chia thời gian thành thời gian BAR lịch sử và thời gian BAR thực?var
、varip
Biến số tuyên bối
、ii
Mỗi lần thực hiện mã chiến lược sẽ thực hiện các hoạt động gia tăng. Vì vậy, bạn có thể thấy rằng các con số được hiển thị trên đường KBAR của kết quả đo lường lại đều tăng dần 1. Khi giai đoạn K-line lịch sử kết thúc, giai đoạn K-line thời gian thực bắt đầu. Các biến trong tuyên bố var, varip bắt đầu thay đổi.i := i + 1
Vàii := ii + 1
Tất cả sẽ được thực hiện một lần. Sự khác biệt là ii sẽ được sửa đổi mỗi lần. Mặc dù i cũng được sửa đổi mỗi lần, nhưng nó sẽ khôi phục giá trị trước đó khi thực hiện chiến lược logic vòng tiếp theo (nhớ cơ chế cuộn màng mà chúng tôi đã giải thích trong chương “Hiến pháp thực hiện mô hình” trước đây?) cho đến khi dòng KBAR hiện tại được hoàn thành để cập nhật giá trị xác định của i (nghĩa là không còn khôi phục giá trị trước khi thực hiện chiến lược logic vòng tiếp theo).
Mô hình giá đóng cửa: Vì mô hình giá đóng cửa chỉ thực hiện một logic chiến lược khi mỗi dòng K BAR đi qua. Vì vậy, trong mô hình giá đóng cửa, giai đoạn K-đường lịch sử và giai đoạn K-đường thời gian thực, các biến trong tuyên bố var, varip trong ví dụ trên đã tăng lên hoàn toàn, mỗi dòng K-đường BAR tăng lên 1.
Máy tính | minh họa |
---|---|
+ | Thêm |
- | Phương pháp trừ |
* | Nhân |
/ | Phá bỏ luật |
% | Tìm gương mẫu |
+
、-
Các toán tử có thể được sử dụng như các toán tử nhị phân hoặc một toán tử đơn vị. Các toán tử số khác chỉ có thể được sử dụng như các toán tử nhị phân, nếu được sử dụng như một toán tử đơn vị sẽ bị lỗi.
1, toán tử số là cả hai bên là loại giá trị số, kết quả là loại giá trị số, nguyên loại hoặc số điểm nổi tùy thuộc vào kết quả hoạt động.
2, nếu trong số đó có một số là một chuỗi, thì hàm là+
Nếu là một toán tử số khác, nó sẽ cố gắng chuyển đổi chuỗi thành giá trị số và sau đó hoạt động.
3, Nếu số hoạt động trong đó là na, kết quả tính là giá trị không na, sẽ hiển thị NaN khi in trên FMZ.
a = 1 + 1
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na
runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN
Ngôn ngữ Pine trên FMZ có một chút khác biệt so với ngôn ngữ Pine trên Trading View, ngôn ngữ Pine trên FMZ không quá khắc nghiệt về yêu cầu loại biến. Ví dụ:
a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A"
plot(a)
plot(b)
plot(c)
Nó có thể được thực hiện trên FMZ, nhưng sẽ báo cáo lỗi kiểu trên giao dịch xem. Đối với các toán tử số toán là chuỗi, hệ thống sẽ chuyển đổi chuỗi thành giá trị số sau khi tính toán. Nếu chuỗi không có giá trị không thể được tính toán, hệ thống kết quả hoạt động sẽ là giá trị không na.
Các toán tử so sánh là các toán tử nhị phân.
Máy tính | minh họa |
---|---|
< | Ít hơn |
> | Hơn |
<= | nhỏ hơn bằng |
>= | Lớn hơn bằng |
== | Tương đương |
!= | Sự bất bình đẳng |
Ví dụ kiểm tra:
a = 1 > 2
b = 1 < 2
c = "1" <= 2
d = "1" >= 2
e = 1 == 1
f = 2 != 1
g = open > close
h = na > 1
i = 1 > na
runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false
Bạn có thể thấy rằng điều khiển so sánh rất đơn giản, nhưng nó cũng là điều khiển chúng ta sử dụng nhiều nhất khi viết chiến lược. Bạn có thể so sánh cả các giá trị và các biến tích hợp, ví dụ:close
、open
Chờ đợi.
Cũng giống như các điều khiển hoạt động, trên FMZ có sự khác biệt với Pine trong Trading View, FMZ không có loại yêu cầu đặc biệt nghiêm ngặt, vì vậy các câu nói như vậyd = "1" >= 2
Trên FMZ không có báo lỗi, khi thực hiện, chuỗi sẽ được chuyển đổi thành giá trị số trước khi so sánh. Trên Trading View sẽ báo lỗi.
Máy tính | Biểu tượng mã | minh họa |
---|---|---|
Không | not | Là một toán tử, không phải là một toán tử |
Và | and | Hoạt động nhị phân, với (và) |
hoặc | or | Các toán tử nhị phân, hoặc các toán tử |
Nói về toán tử logic, thì chắc chắn phải nói về bảng giá trị thực. Cũng giống như chúng ta học ở trường trung học, chỉ là ở đây chúng ta thử nghiệm và h