Người mới bắt đầu, kiểm tra nó đưa bạn đến giao dịch định lượng tiền điện tử (2)

Tác giả:Ninabadass, Tạo: 2022-04-19 16:46:53, Cập nhật: 2022-04-20 16:56:43

Người mới bắt đầu, kiểm tra nó đưa bạn đến giao dịch định lượng tiền điện tử (2)

Trong bài viết trước đây, chúng tôi đã nói về các kịch bản giao dịch được lập trình. Trên thực tế, chiến lược giao dịch là một chương trình kịch bản giao dịch. Bài viết chủ yếu nói về sự cần thiết của một nhà cung cấp phần cứng cho chương trình kịch bản giao dịch (nơi chương trình chạy), và chương trình giao dịch kịch bản có thể được viết bằng ngôn ngữ lập trình máy tính đó (danh sách ba ngôn ngữ lập trình được sử dụng trong FMZ Quant Trading Platform; tất nhiên, bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào để thực hiện các chiến lược trong giao dịch lập trình).

Phiên bản giao dịch lập trình

  • Loại chiến lược giao dịch Những người mới bắt đầu giao dịch lập trình và giao dịch định lượng có thể bị nhầm lẫn bởi các thuật ngữ khác nhau như chiến lược xu hướng, chiến lược tùy chọn nhị phân, chiến lược tần số cao, chiến lược lưới, v.v. Trên thực tế, các loại chiến lược phổ biến trong giao dịch lập trình và giao dịch định lượng chỉ đơn giản là theo nhiều hướng.

    • Chiến lược trọng tài Nói một cách đơn giản, một chiến lược về cơ bản nắm giữ các vị trí dài trong khi nắm giữ các vị trí ngắn có thể được phân loại là một chiến lược trọng tài. Có nhiều loại cụ thể của nó, chẳng hạn như giao dịch giao dịch chợ giao ngay, giao dịch tương lai giao dịch chợ giao ngay, giao dịch tương lai và giao dịch trọng tài giao ngay, và giao dịch trọng tài biểu tượng chéo, v.v.

    • Chiến lược xu hướng Nói một cách đơn giản, đó là chiến lược theo dõi xu hướng và đặt một vị trí duy nhất, chẳng hạn như đường trung bình động kép, MACD và các chiến lược khác.

    • Chiến lược trả lại Ví dụ, chiến lược lưới điện, kiếm lợi nhuận từ biến động giá trong thị trường biến động.

    • Chiến lược tần số cao Nói một cách đơn giản, đó là một chiến lược để tiến hành giao dịch tần số cao thông qua một số thuật toán để khám phá cấu trúc vi mô thị trường, quy tắc, cơ hội, v.v.

    Các loại trên được phân loại theo quan điểm chiến lược giao dịch; theo quan điểm thiết kế chiến lược trên FMZ Quant, các chiến lược cũng có thể được chia thành:

    • Chiến lược một biểu tượng Điều đó có nghĩa là chiến lược chỉ có thể vận hành một biểu tượng, chẳng hạn như thực hiện giao dịch BTC hoặc giao dịch ETH.

    • Chiến lược đa biểu tượng Nói một cách đơn giản, nó là để vận hành nhiều biểu tượng bằng một chiến lược logic.

    • Chiến lược đa tài khoản Nói một cách đơn giản, nó là để cấu hình nhiều đối tượng trao đổi trên một bot (khái niệm nền tảng đã được giới thiệu trong bài viết trước, và một đối tượng trao đổi được cấu hình bằng API KEY đại diện cho một tài khoản nền tảng).

    • chiến lược đa logic Ví dụ, chiến lược MACD, chiến lược trung bình động, chiến lược lưới, vv được thiết kế cùng một lúc trên một bot (tất nhiên, nó là để vận hành các đối tượng trao đổi khác nhau, và các đối tượng trao đổi với cùng một hoạt động phụ thuộc vào việc liệu chiến lược cụ thể có mâu thuẫn hợp lý hay không)

  • Giao diện API nền tảng Câu trả lời là thông qua giao diện API được mở bởi nền tảng. Vì vậy, các loại giao diện mở cho nền tảng là gì? Trong bài viết trước, chúng tôi đã nói về nền tảng thường có giao diện REST và Websocket trong phần Platform. Ở đây chúng tôi thêm một số khái niệm từ khía cạnh thủ tục chiến lược.

    • Giao diện không cần xác minh Nói chung, chúng được gọi là công ty giao diện; loại giao diện này không yêu cầu xác minhAPI KEY(nếu bạn không nhớ API KEY là gì, bạn có thể chuyển sang bài viết trước đó). Loại giao diện này thường là giao diện thị trường, chẳng hạn như truy vấn báo giá thị trường sâu, dữ liệu đường K, tỷ lệ tài trợ, thông tin về biểu tượng giao dịch, dấu thời gian máy chủ nền tảng, v.v. Nói một cách đơn giản, giao diện về cơ bản không liên quan đến tài khoản của bạn có thể được xác định là giao diện công khai (không cần xác minh). Trên nền tảng giao dịch FMZ Quant, khi gọi một hàm API chưa được xác minh (bao gồm giao diện chưa được xác minh của nền tảng; giao diện công khai), ngay cả khi cấu hình API KEY không chính xác, dữ liệu được trả về bởi giao diện có thể được thu thập bình thường (không cần xác minh).

    • Các giao diện cần xác minh Nói một cách đơn giản, chúng là các giao diện cần được xác minh (bằng API KEY). Loại giao diện này được gọi là giao diện riêng. Loại giao diện này thường liên quan đến một số hoạt động hoặc thông tin của tài khoản của bạn, chẳng hạn như truy vấn tài sản tài khoản, vị trí tài khoản, lệnh đang chờ, chuyển tiền, chuyển đổi tiền tệ, điều chỉnh đòn bẩy và thiết lập chế độ vị trí, v.v. Những hoạt động này phải được xác minh.

      Trên FMZ Quant, khi gọi các hàm API cần xác minh (các giao diện riêng, được đóng gói và cần xác minh nền tảng). Nếu cấu hình của API KEY là sai, gọi loại hàm này sẽ báo cáo lỗi và trả về null.

    Vậy, làm thế nào để sử dụng các giao diện trên nền tảng giao dịch lượng tử FMZ?

    FMZ Quant Trading Platform bao gồm các giao diện nền tảng với các hành động và định nghĩa thống nhất (như giao diện đường K, giao diện thị trường sâu, giao diện truy vấn tài sản hiện tại, giao diện lệnh, giao diện hủy lệnh, v.v.).https://www.fmz.com/api).

    Vì vậy, làm thế nào để sử dụng một số giao diện nền tảng mà không có các hành động thống nhất và định nghĩa trên FMZ Quant?

    Các giao diện nền tảng này bao gồm: chuyển giao tài sản, đặt hàng có điều kiện, đặt hàng hàng loạt, hủy đặt hàng hàng loạt, sửa đổi đặt hàng, vv Một số nền tảng có giao diện này, một số nền tảng không có và các chức năng và chi tiết sử dụng có thể khá khác nhau, do đó, các giao diện này có thể được truy cập thông quaexchange.IOchức năng trên FMZ Quant (đối với chi tiết, xem tài liệu API của nền tảng giao dịch FMZ Quant:https://www.fmz.com/api#exchange.io...). Ngoài ra còn có một số chiến lược ví dụ IO thực tế trong Square của FMZ Quant.

Tất cả các chức năng API trong tài liệu FMZ API có thể thực hiện yêu cầu mạng không?

Chúng ta cần phải nói rằng các API nền tảng có giới hạn về tần số truy cập (ví dụ, 5 lần trong 1 giây). Truy cập không thể quá thường xuyên, hoặc lỗi http 429 sẽ được báo cáo và truy cập sẽ bị từ chối (hầu hết các nền tảng báo cáo 429). Do đó, gọi các giao diện nền tảng được đóng gói trên FMZ Quant cũng có giới hạn, nhưng gọi các chức năng API không thực hiện yêu cầu mạng không có giới hạn như vậy.
Không phải tất cả các chức năng API trên FMZ Quant có thể thực hiện yêu cầu mạng; một số chức năng API trên FMZ chỉ sửa đổi một số cài đặt cục bộ, chẳng hạn như đặt cặp giao dịch hiện tại, mã hợp đồng và chức năng tính toán chỉ số, cũng như có được tên đối tượng trao đổi, v.v. Về cơ bản, từ việc sử dụng chức năng a, bạn có thể xác định liệu yêu cầu mạng sẽ được thực hiện hay không; miễn là nó là để có được dữ liệu nền tảng, hoặc vận hành tài khoản nền tảng, yêu cầu mạng sẽ được thực hiện; tất cả các giao diện này đều cần chú ý đến tần suất gọi.

  • Hãy nói về một số vấn đề phổ biến và kinh nghiệm sử dụng các chức năng API trên FMZ Quant.

    • Độ dung nạp lỗi Đây là lỗi phổ biến nhất, khiến vô số người mới bắt đầu gặp rắc rối. Thường thì backtest chiến lược là tốt và mọi thứ đều bình thường. Tại sao bot hoạt động bất thường sau khi bot chạy trong một thời gian (có thể được kích hoạt bất cứ lúc nào).

      img

      Ví dụ, mã nhận ticker trên FMZ Quant (tương tự như viết chương trình của riêng bạn để truy cập trực tiếp vào giao diện nền tảng):var ticker = exchange.GetTicker()Nếu chúng ta cần sử dụng các dữ liệu củaLast(giá cuối cùng) trong biếnticker(bạn có thể tham khảo cấu trúc trả về của hàm GetTicker), chúng tôi cần có được dữ liệu (nói gì là newPrice? new: mới nhất; Giá: giá; đó là đúng, kết hợp chúng lên!)

      Bây giờ, nó là tốt nếu chức năngGetTicker()trả về dữ liệu bình thường; nếu có một yêu cầu thời gianout, lỗi mạng, nền tảng kéo ra khỏi cáp, cáp bị gãy bởi đào, hoặc trẻ em tắt công tắc điện, chức năngGetTicker()sẽ trở lạinullHiện tại, giá trị củatickernull; khi tôi truy cập vàoLastcủa nó, chương trình chiến lược sẽ được dừng lại bởi chương trình ngoại lệ. Từ đó, có vẻ như sự thất bại của cuộc gọi giao diện (sự gọi của GetTicker thất bại và trả về null) không phải là nguyên nhân trực tiếp của việc dừng lại của bot chiến lược (vì nguyên nhân trực tiếp là một thuộc tính của mộtnullthay đổi được truy cập). Tình huống mà sự thất bại của cuộc gọi giao diện báo cáo một lỗi sẽ không gây ra bot để dừng lại (ghi chú thêm ở đây).

      Vậy, chúng ta nên làm gì để tránh sự ngừng hoạt động bất thường của bot?
      Câu trả lời là làm cho quá trình dung nạp lỗi cho dữ liệu được trả về bởi giao diện; nó rất đơn giản, và bạn chỉ cần đánh giá xem dữ liệu được trả về lànull(ở đây lấy JavaScript làm ví dụ, vì các ngôn ngữ khác tương tự). Viết một đoạn mã nhỏ (mà chỉ dành cho hướng dẫn, và không thể chạy trực tiếp!)

      var ticker = exchange.GetTicker()
      if (ticker) {
          var newPrice = ticker.Last
          Log("Print the latest price:", newPrice)
      } else {
          // data is null, so no operation will make no problem 
      }
      

      Không chỉGetTickergiao diện cần phải thực hiện xử lý dung nạp lỗi, nhưng giao diện với các yêu cầu mạng cần phải thực hiện xử lý dung nạp lỗi cho giá trị trả về (nếu bạn sử dụng giá trị trả về của hàm) Có rất nhiều phương pháp dung nạp lỗi._C()chức năng (xem tài liệu API FMZ) để viết chức năng chịu lỗi của riêng bạn và thiết kế cơ chế và logic chịu lỗi của riêng bạn.

      Về việc sử dụng_C()Chú ý rằng các tham số của các_C()function là một function reference, không phải là một function call._C(funcName, param1, param2); cuộc gọi là chính xác; funcName không có dấu ngoặc, và param1 và param2 là các tham số được nhập vào hàm funcName._C(funcName(param1, param2)); cuộc gọi là sai; thường nếu một người mới không đọc tài liệu FMZ API cẩn thận, nó sẽ được viết như thế này.

    • Số lượng lệnh mua thị trường giao ngay

      Người mới bắt đầu cũng dễ dàng mắc sai lầm trong số tiền đặt hàng của lệnh mua thị trường giao ngay. Như đã đề cập trong bài viết trước, số tiền đặt hàng của lệnh mua thị trường giao ngay thường là số tiền (chỉ một vài nền tảng có thể có các thiết lập khác, và nói chung các thiết lập nền tảng đặc biệt này sẽ được giải thích trong tài liệu API FMZ). Ví dụ, tôi đã sử dụng OKEX V5 robot mô phỏng để kiểm tra:

      Đặt cặp giao dịch như sau:LTC_USDT

      function main() {
          exchange.IO("simulate", true)   // switch to OKEX simulated bot 
          exchange.Buy(-1, 1)             // the price is -1, representing the placed order is market order; the amount of 1 means the order amount of 1 USDT
      }
      

      Vì các nền tảng thường có giới hạn về số tiền đặt hàng, các đơn đặt hàng với số tiền nhỏ hơn giới hạn sẽ không được đặt (ví dụ, Binance Spot chỉ yêu cầu các đơn đặt hàng với số tiền lớn hơn 5USDT có thể được đặt thành công).

      error	Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
      
    • Hướng lệnh tương lai

      Khi thực hiện các chiến lược tương lai, người mới bắt đầu thường mắc sai lầm trong hướng đặt hàng.https://www.fmz.com/api#exchange.setdirection...

      img

      Bởi vì chức năng đặt lệnh chỉ cóBuySellTuy nhiên, tương lai (tất nhiên, không có vấn đề cho chỗ, cho chỗ chỉ có mua và bán) có các hướng mở dài, đóng dài, mở ngắn, và đóng ngắn, do đó rõ ràng BuySell không thể thể hiện các hoạt động trong nhiều hướng, sau đó nó là cần thiết để giới thiệu các chức năngexchange.SetDirection()của việc thiết lập hướng giao dịch tương lai. Trên FMZ,exchange.SetDirection("buy")(được đặt đầu tiên hướng đầu tiên) được sử dụng cùng vớiexchange.Buy, có nghĩa là lệnh được đặt là lệnh mở các vị trí dài. Và tiếp tục như thế:

      Sử dụngexchange.SetDirection("sell")exchange.Sellcùng nhau, đại diện cho lệnh được đặt là một lệnh để mở các vị trí ngắn. Sử dụngexchange.SetDirection("closebuy")exchange.Sellcùng nhau, đại diện cho lệnh được đặt là một lệnh để đóng các vị trí dài. Sử dụngexchange.SetDirection("closesell")exchange.Buycùng nhau, đại diện cho lệnh được đặt là một lệnh để đóng các vị trí ngắn. Những người mới bắt đầu, thường sẽ sử dụngexchange.SetDirection("sell")exchange.BuySau đó, một lỗi sẽ được báo cáo (một lỗi không thể được báo cáo trong backtest, nhưng đó rõ ràng là một lỗi logic, mà không thể bị bỏ qua bởi những người bị ám ảnh-cưỡng chế như tôi.) Đây là một sai lầm khác mà những người mới bắt đầu thường mắc phải.

      function main() {
          exchange.SetContractType("quarter")   // set the current contract to a quarterly contract 
          exchange.SetDirection("sell")
          var id = exchange.Sell(-1, 1)    
          Log("placed market order, executed, get positions", exchange.GetPosition())    
          exchange.SetDirection("closebuy")   // use closebuy and Sell together, yes, no problem 
          exchange.Sell(-1, 1)
      }
      

      img
      Khi đến đây, bạn có thể hỏi:" Tôi có các vị trí, và sử dụng closebuy và bán cùng nhau, vậy tại sao một lỗi được báo cáo và tôi không thể đóng các vị trí? "Tôi sẽ nói:" hướng sai để đóng các vị trí! Hơn nữa, lỗi có thể ở một tình huống khác: cài đặt hướng vị trí gần là chính xác, việc sử dụng chức năng đặt lệnh cũng chính xác, và bạn cũng giữ các vị trí trong hướng, nhưng lỗi vẫn được báo cáo. Lý do có thể là: chương trình của bạn đã đặt nhiều lệnh, các lệnh ban đầu không được thực hiện, và các lệnh đóng các vị trí hiện đang ở thị trường và chờ thực hiện.

    • Hiển thị thông tin xuất khẩu & giao dịch Thiết kế và viết các chiến lược giao dịch được lập trình và định lượng là không thể tách rời khỏi thiết kế tương tác giữa con người và máy tính, chẳng hạn như hiển thị dữ liệu xuất nhật ký hoạt động . Thông thường sử dụng ngôn ngữ lập trình cục bộ để viết kịch bản bot và các chương trình chiến lược. Ví dụ: Python sử dụngprint. JavaScript sử dụngconsole.log. Sử dụng Golangfmt.Println(). Sử dụng C++cout.

      Hãy nói về màn hình thông tin trên FMZ. Trên FMZ Quant, chủ yếu có hai nơi để hiển thị thông tin.

      • Biểu trạng Sau khi bot được khởi động, trang bot được hiển thị như sau:

        img

        Phần hiển thị là thông tin thanh trạng thái. thanh trạng thái chủ yếu được sử dụng để hiển thị một số dữ liệu thay đổi thời gian thực (vì thay đổi thời gian thực cần được quan sát trong thời gian thực, và không thể in dưới dạng nhật ký mỗi lần, vì vậy loại dữ liệu này có thể được hiển thị trong thanh trạng thái. Nếu in nhật ký của mỗi người, sẽ có rất nhiều dữ liệu lặp lại vô nghĩa, ảnh hưởng đến truy vấn). Dữ liệu hiển thị trên thanh trạng thái sử dụngLogStatusĐể biết chi tiết, vui lòng tham khảo tài liệu FMZ API.

      • Dây gỗ Nó cũng có trên trang bot, như được hiển thị trong hình sau:

        img

        Phần hiển thị là thanh nhật ký. thanh nhật ký chủ yếu được sử dụng để ghi lại vĩnh viễn một số dữ liệu nhất định tại một thời điểm nhất định, hoặc ghi lại một hoạt động của một chiến lược nhất định tại một thời điểm nhất định. Cây gỗ được chia thành nhiều loại:

        1. log chung; chiến lược FMZ sử dụng hàm Log để xuất và in nó trong log chiến lược.

        img

        1. Lưu trữ đơn đặt hàng; sử dụngexchange.Sell/exchange.Buytrong một chiến lược FMZ sẽ tự động xuất bản bản ghi trong nhật ký.

        img

        1. Lịch hủy;exchange.CancelOrderđược sử dụng trong chiến lược FMZ, và nhật ký hủy sẽ tự động xuất ra trong nhật ký.

        img

        1. Lịch lỗi; khi chiến lược FMZ đang chạy, và giao diện yêu cầu mạng có lỗi gọi, và một ngoại lệ được ném (chẳng hạn như câu lệnh throw), nhật ký lỗi sẽ tự động xuất ra trong nhật ký.

        img

      Trong số các hàm FMZ API, các hàm có thể tạo ra đầu ra log, chẳng hạn như Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), vv, có thể được theo sau bởi một số tham số đầu ra bổ sung sau các tham số cần thiết, chẳng hạn như: exchange. CancelOrder ((order[j].Id, orders[j]); nó là để thêm đầu ra thông tin đặt hàng khi thứ tự của các đơn đặt hàng[j] bị hủy bỏ.

      function main() {
          Log("data1", "data2", "data3", "...")
          var data2 = 200
          var id = exchange.Sell(100000, 0.1, "additional data1", data2, "...")
          exchange.CancelOrder(id, "additional data1", data2, "...")
          LogProfit(100, "additional data1", data2, "...")
      }
      
    • Sử dụng các chức năng chỉ số Trước khi nói về chức năng chỉ số, trước tiên hãy hiểu chỉ số là gì. đơn giản, nó là một đường như đường trung bình động, MACD hoặc ATR.

      Hỏi: Các chỉ số đó được tạo ra như thế nào? Đáp: chắc chắn chúng được tạo ra bởi các tính toán.

      Hỏi: Chúng được tính bằng cái gì? A: Dữ liệu đường K.

      Q: Bạn có thể đưa ra một ví dụ không? A: lấy chỉ số trung bình động đơn giản nhất làm ví dụ. Nếu chúng ta sử dụng dữ liệu đường K hàng ngày (tức là đường yang hoặc đường yin đại diện cho một ngày) làm nguồn dữ liệu để tính toán chỉ số. Các thông số chỉ số trung bình động là 10, sau đó chỉ số trung bình động được tính toán là trung bình động 10 ngày.

      Q: nếu số lượng K-line BAR nhỏ hơn 10, chỉ số trung bình động có thể được tính không? A: Không chỉ chỉ số trung bình động không thể được tính toán, nhưng bất kỳ chỉ số nào cũng không thể tính toán giá trị chỉ số hiệu quả khi số lượng dữ liệu BAR đường K không đáp ứng tham số thời gian chỉ số và vị trí tương ứng của mảng tính toán sẽ được lấp đầy bằng các giá trị trống, chẳng hạn nhưnullhiển thị khiJavaScriptchiến lược in dữ liệu chỉ số được tính toán.

      Có một ví dụ dạy ở Quảng trường:https://www.fmz.com/strategy/125770Hãy kiểm tra lại chiến lược bài giảng này, và bạn có thể thấy biểu đồ được tạo ra bởi hệ thống kiểm tra lại và trung bình động 10 giai đoạn:

      img

      Theo chiến lược vẽ tùy chỉnh, K-đường vẽ và biểu đồ trung bình động:

      img

      Hỏi: nếu tôi muốn sử dụng một đường trung bình động 10 giờ thì sao? A: sử dụng dữ liệu đường K của một khoảng thời gian hàng giờ.

      Nói một cách đơn giản, K-line chúng ta thấy là một mảng sau khi chúng ta số hóa nó (nếu bạn không hiểu khái niệm mảng, bạn có thể tìm kiếm nó trên Baidu), và mỗi phần tử của mảng là một thanh K-line, được sắp xếp theo thứ tự. Thông thường thanh cuối cùng của dữ liệu đường K là thanh của giai đoạn hiện tại, thay đổi trong thời gian thực và không hoàn thành (bạn có thể quan sát các thay đổi bằng cách đăng nhập vào trang nền tảng và quan sát đường K của nó). Các chỉ số được tính toán cũng tương ứng một-một với các thanh đường K. Trong ví dụ trên, bạn có thể thấy rằng một giá trị chỉ số tương ứng với thanh đường K. Lưu ý rằng thanh đường K cuối cùng thay đổi trong thời gian thực, và chỉ số được tính toán cũng sẽ thay đổi với sự thay đổi của thanh đường K.

      Trên nền tảng giao dịch lượng tử FMZ, bạn có thể sử dụng thư viện TA (thư viện được thực hiện bởi FMZ, tích hợp trong docker và có thể được sử dụng trực tiếp trong nhiều ngôn ngữ) hoặc talib (thư viện chỉ số nổi tiếng cũ talib, tích hợp trong JS, C ++; Python cần được cài đặt thêm). Ví dụ, tính toán trung bình trong ví dụ trên: Sử dụng thư viện FMZ TA:

      function main() {
          var records = exchange.GetRecords()
          var ma = TA.MA(records, 10)
          Log(ma)       // print average
      }
      

      Sử dụng talib:

      function main() {
          var records = exchange.GetRecords()
          var ma = talib.MA(records, 10)
          Log(ma)       // print average 
      }      
      

      Dữ liệu chỉ số được tính toán ma là một mảng, và mỗi phần tử tương ứng với mảng đường K (đăng ký) một lần một lần, tức là,ma[ma.length -1]tương ứng vớirecords[records.length - 1], và vân vân.

      Điều này cũng tương tự đối với các chỉ số phức tạp hơn, và bạn cần phải chú ý đến các chỉ số như MACD.

      var macd = TA.MACD(records)   // In this way, only the K-line data is passed in, and no indicator parameters are passed in. The indicator parameters use the default values, and that is the same for other indicator functions
      

      Tại thời điểm này, biến macd là một mảng hai chiều (bạn có thể dùng Baidu, nếu bạn không hiểu khái niệm).

      Q: Tại sao dữ liệu chỉ số macd là một mảng hai chiều? A: Bởi vì chỉ số macd bao gồm hai đường (đường dif và đường dea) và một tập hợp các thanh khối lượng (dữ liệu thanh khối lượng macd, trên thực tế, cũng có thể được coi là một đường).

      var dif = macd[0]
      var dea = macd[1]
      var macdbar = macd[2]
      

      Đây cũng là một ví dụ giảng dạy sẵn sàng; nếu bạn quan tâm, bạn có thể nghiên cứu nó:https://www.fmz.com/strategy/151972

      img


Thêm nữa