4
tập trung vào
1076
Người theo dõi

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

Được tạo ra trong: 2022-05-30 16:23:43, cập nhật trên: 2022-09-28 17:10:21
comments   0
hits   8860

[TOC]

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

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:

  • 1., Chính sách Pine trên FMZ, mã đầu tiên của phiên bản//@versionVà mã bắt đầustrategyindicatorKhô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ợimportNhập khẩulibrarychứ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.

    • Mô hình giá đóng cửa so với mô hình giá thời gian thực Trong giao dịch xem, chúng ta có thể đi quastrategyChức năngcalc_on_every_tickCá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_tickCác tham số nên được đặt làtrue◦ Tính mặc địnhcalc_on_every_tickCác tham số làfalseCá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”.

    Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

    • 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ềnquarterCá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ố.

  • 3、runtime.debugruntime.logruntime.errorFMZ 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ộngoverlaytham số

Ngôn ngữ Pine trên FMZ, hàm vẽplotplotshapeplotcharThêm nữa.overlayChức năng hỗ trợ cho phép chỉ định hình ảnh trên đồ họa chính hoặc đồ họa phụ.overlaycài đặttrueHình vẽ trên bản đồ chính, thiết lập làfalseHì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.

  • 5、syminfo.mintickLấy giá trị của biến tích hợp

syminfo.mintickBiế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.mintickGiá trị là 0.01 .

  • 6/ Giá trung bình trong FMZ PINE Script bao gồm phí xử lý

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ý).

Khóa học ngôn ngữ Pine

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.

Thực hiện mô hình

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_indexDẫ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")

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

plotChứ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.收盘价模型实时价模型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.

  • Mô hình giá đóng cửa

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.

  • Mô hình giá thời gian thực

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实时Barcủa:

  • Lịch sử Bar

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历史BarChỉ 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历史BarChỉ 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.

  • Bar thời gian thực

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ợphighlowcloseTrong 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.closeNó luôn luôn là giá hiện tại.highlowLuô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")

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

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.ishistoryHạ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.logHà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 Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

Ảnh chụp màn hình của khoảnh khắc B Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

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ị.

  • Variable trong hàm context

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

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

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]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ếpcloseFunction 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]

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

Lý do là chỉ mục của K-lineBar, tức là biến tích hợpbar_indexTí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 số hàm tích hợp cần được tính trên mỗi Bar để tính đúng kết quả của nó

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.barssinceChứ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:

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

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)

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

Dòng thời gian

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.openlà 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àopenCấ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)openGiá 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ẫnopenGiá 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).

  • Các biến trên chuỗi thời gian rất dễ tính toán Chúng ta có một hàm tích hợpta.cumVí 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.cumCá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.cumChú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.

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

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_indexVậy là chúng ta có thể bắt đầu từ 0.bar_index + 1Thực tế là số lượng của dòng K.v2bar_indexNó là sự trùng hợp.

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

Tôi cũng có thể sử dụngta.cumChứ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.smaChức năng tìm trung bình.

  • Kết quả gọi hàm cũng để lại dấu vết của giá trị trong chuỗi thời gian
  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ấyv1v2Cá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)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.

Hướng dẫn giới thiệu ngôn ngữ PINE quantitative của Inventor

Cấu trúc kịch bản

Cấu trúc chung

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=5indicator()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.

Ghi chú

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.

  • Tuyên bố biến
  • Đặt lại giá trị của biến
  • Tuyên bố hàm
  • Gọi hàm được xây dựng, gọi hàm được định nghĩa bởi người dùng
  • ifforwhilehoặcswitchCấu trúc

Các câu có thể được sắp xếp theo nhiều cách

  • Một số câu lệnh có thể được thể hiện bằng một dòng, chẳng hạn như hầu hết các tuyên bố biến, chỉ chứa một dòng gọi hàm hoặc tuyên bố hàm một dòng. Những người khác, như cấu trúc, luôn cần nhiều dòng vì chúng cần một khối địa phương.
  • Các câu nói trong phạm vi toàn cầu của kịch bản (tức là những phần không thuộc khối địa phương) không thể được coi là空格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.
  • Một cấu trúc hay một hàm đa dòng luôn cần mộtlocal blockMộ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.
  • Nhiều câu đơn hàng có thể được nối tiếp trong một dòng bằng cách sử dụng dấu chấm ký ức ((,) làm dấu phân cách.
  • Một dòng có thể chứa các chú thích, hoặc chỉ là chú thích.
  • Các dòng cũng có thể được gói lại (như tiếp tục trên nhiều dòng).

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)  // 调用一个内置函数输出日志 (全局范围)

Thay đổi mã

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")

Biểu thức và toán tử

Biểu tượng

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ăngBiế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

  • 1. Nhãn hiệu phải được viết bằng chữ cái lớ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.
  • 2, ký tự tiếp theo sau ký tự đầu tiên có thể làChữ cáiGạch dướihoặcSố liệu
  • 3, tên của biểu tượng được viết bằng chữ viết lớn và chữ viết nhỏ.

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:

  • 1, toàn bộ chữ cái được viết to để đặt tên cho hằng số.
  • 2. Sử dụngQuy tắc Hồ HàmTên gọi cho các định danh khác.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0

Máy tính

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 * factorSau khi nhân, chúng ta sẽ cóseries intTuy nhiên,ta.emaCá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.


Điều toán định giá

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ácbcdNó 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=0Vì 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 > openVì 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:varvarip

  • var

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.varTừ khóa:

  a = close > open 
  var b = 0 
  if a
      b := b + 1

  plot(b)

varTừ 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

varipChú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?varvaripBiến số tuyên bốiiiMỗ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 + 1ii := ii + 1Tấ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 toán số
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.


So sánh toán tử

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ụ:closeopenChờ đợ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" >= 2Trê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.


Các toán tử logic
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ử
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