C# cho giao dịch thuật toán
C# là gì
C# là một ngôn ngữ lập trình hướng đối tượng được sử dụng để xây dựng nhiều loại dịch vụ và ứng dụng khác nhau. Cú pháp rõ ràng, có cấu trúc giúp nó dễ học và dễ đọc, ngay cả đối với người mới bắt đầu, đồng thời cung cấp cách tiếp cận có cấu trúc để viết mã ngắn gọn và có thể tái sử dụng.
Thuật toán C# trong một phút!
- Ngay cả khi bạn chưa từng làm việc với C# trước đây, việc tạo và triển khai robot đầu tiên của bạn hoặc chỉ báo chỉ mất vài phút.
- Vì C# dễ sử dụng, bạn có thể nhanh chóng viết lại bất kỳ đoạn mã nào từ tài liệu này để phù hợp với nhu cầu của mình.
- Khi sử dụng C#, bạn có thể truy cập vào một số lượng lớn thư viện chứa các lớp và phương thức được định nghĩa sẵn. Những phương thức này có thể xử lý hiệu quả các tác vụ phổ biến, giúp bạn tập trung vào việc giải quyết các vấn đề giao dịch phức tạp.
- Trong C#, bạn có thể viết mã không chặn các luồng máy chủ khi thực thi. Nói cách khác, bạn có thể bắt đầu một số tác vụ nhất định đồng thời với các tác vụ khác.
.NET là gì?
Để các chương trình C# chạy được, mã nguồn của chúng phải được biên dịch thành Ngôn ngữ Trung gian (IL). Mã IL này tuân theo đặc tả Cơ sở hạ tầng Ngôn ngữ Chung (CLI) và sau đó được biên dịch thành các lệnh máy gốc trong thời gian chạy. Framework .NET cung cấp một môi trường thực thi ảo được xây dựng trên các thư viện lớp mở rộng và Common Language Runtime (CLR), triển khai CLI của Microsoft.
Không đi sâu vào các chi tiết kỹ thuật, .NET thực hiện các chức năng sau:
- Tạo điều kiện thuận lợi cho việc phát triển và thực thi ứng dụng: SDK .NET đã chứa sẵn một số trình biên dịch và công cụ xây dựng tích hợp, loại bỏ nhu cầu tạo ra bất kỳ giải pháp tùy chỉnh nào.
- Cung cấp thư viện thời gian chạy: Khi thêm các kiểu dữ liệu hoặc bộ sưu tập mới vào mã của bạn, bạn sẽ thường thấy rằng .NET đã cung cấp sẵn các lớp và phương thức phù hợp cho nhiệm vụ đó.
Cơ bản về C#
Kiểu dữ liệu và khai báo biến
Kiểu dữ liệu là phương tiện để phân loại dữ liệu để C# biết chính xác cách xử lý các biến và thuộc tính. Trong khai báo biến/thuộc tính, kiểu dữ liệu luôn đứng trước tên biến/thuộc tính.
1 | |
Ngoài ra, bạn có thể sử dụng từ khóa var để tránh phải chỉ định kiểu dữ liệu.
1 | |
Đối tượng và lớp
Hãy nghĩ về đối tượng như là sự trừu tượng hóa của các thực thể hữu hình hoặc vô hình. Những thực thể này có thể có một số đặc điểm nhất định (thuộc tính) và có thể thực hiện các hoạt động khác nhau (phương thức). Đến lượt mình, các lớp đóng vai trò như các mẫu để tạo đối tượng.
Vì C# là ngôn ngữ hướng đối tượng, các lớp cũng có thể kế thừa thuộc tính và phương thức từ các lớp khác. Xem xét ví dụ sau trong đó chúng ta khai báo một lớp NewBot mới kế thừa từ lớp Robot. Chúng ta cũng định nghĩa một số thuộc tính lớp mới.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Kiểu dữ liệu
Vì C# là ngôn ngữ kiểu mạnh, cần phải chỉ định kiểu dữ liệu khi khai báo biến và thuộc tính của lớp. Tóm lại, kiểu dữ liệu tạo thành các lớp duy nhất với các tập hợp hành vi khác nhau. Xem xét các ví dụ sau trong đó các kiểu dữ liệu khác nhau được chỉ định cho các thuộc tính lớp và tham số liên quan khác nhau.
1 2 | |
Trong mã trên, kiểu dữ liệu DataSeries đại diện cho một danh sách chỉ đọc các giá trị và do đó thường được sử dụng để biểu diễn giá thị trường.
Khi cần tạo các tham số đa lựa chọn, bạn có thể sử dụng kiểu dữ liệu enum tích hợp sẵn như được mô tả chi tiết dưới đây. Bạn có thể coi enum như các lớp đặc biệt chứa các hằng số khác nhau.
1 2 3 4 5 6 7 8 9 | |
Để truy cập một hằng số chứa trong enum, hãy sử dụng cú pháp sau.
1 | |
Nếu một tham số hoặc thuộc tính cần là một số, bạn sẽ thường sử dụng kiểu dữ liệu int (số nguyên) hoặc double (số thập phân). Mặc dù kiểu double có độ chính xác thấp hơn kiểu decimal, nhưng nó cũng ít tốn tài nguyên hơn.
1 2 | |
Cuối cùng, kiểu bool thường đại diện cho đầu vào có hoặc không. Các giá trị có và không tương ứng với true và false.
1 2 | |
Không gian tên
Không gian tên hoạt động như các bộ sưu tập lớp được chỉ định. Khi bạn gán một lớp cho một không gian tên, sau đó nó có thể được truy cập bằng cách sử dụng ký hiệu Namespace.ClassName. Chúng ta sẽ gán NewBot của chúng ta vào không gian tên CoolTradingBots.
1 2 3 4 5 6 7 8 | |
Phương thức lớp
Các phương thức lớp được định nghĩa sau khi khai báo lớp. Tất cả các đối tượng của lớp NewBot của chúng ta sẽ có thể gọi phương thức CustomTradeOperation(). Nó nhận hai đối số, cụ thể là một đối tượng Symbol và một đối tượng double. Phương thức của chúng ta được cho là sẽ nhận một biểu tượng và thực hiện một số loại hành động giao dịch cho khối lượng được chỉ định
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Thư viện lớp
Các thư viện lớp (và sau đó là các phương thức lớp) có thể được truy cập bằng không gian tên của chúng như trong ví dụ dưới đây.
1 | |
Ngoài ra, bạn có thể nhập từ khóa using ở đầu mã của mình để chỉ định một số không gian tên nhất định và tránh dư thừa. Xem xét đoạn mã sau.
1 2 3 | |
Câu lệnh điều kiện
Để sử dụng câu lệnh điều kiện, hãy sử dụng một từ khóa theo sau là một biểu thức trong dấu ngoặc đơn. Ví dụ dưới đây sử dụng từ khóa if để hoàn thiện phương thức CustomTradingOperation() của chúng ta. Để làm điều đó, chúng ta sử dụng phương thức EvaluateMarket() được định nghĩa trong không gian tên Analytics.Actions.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Bộ sưu tập
Bộ sưu tập được định nghĩa là các vùng chứa có thể lưu trữ một hoặc nhiều đối tượng của một lớp cụ thể.
Bộ sưu tập có thể được lập chỉ mục đầy đủ, nghĩa là các thành viên của chúng có thể được truy cập bằng cách truyền một giá trị integer nhất định trong dấu ngoặc vuông. Xem xét ví dụ sau trong đó phương thức Calculate() in ra các thuộc tính của một thanh được truy cập thông qua chỉ mục của nó.
1 2 3 4 5 | |
Tạo tiện ích mở rộng cTrader
Trong đoạn mã dưới đây, chúng ta tạo một bot giao dịch cơ bản chỉ sử dụng kiến thức đã đề cập trong các phần trên.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Các hoạt động đồng bộ và bất đồng bộ
Như đã nêu trước đó, C# hỗ trợ đầy đủ các hoạt động bất đồng bộ. Sơ đồ dưới đây định nghĩa một ví dụ cơ bản về cách thực hiện các hoạt động giao dịch trong quá trình thực thi đồng bộ.
graph TD
A(Gặp tín hiệu kỹ thuật) ==> B(Thực hiện lệnh thị trường)
B ==> C(Đạt chốt lời/cắt lỗ)
C ==> D(Đóng vị thế)
D ==> A Thực thi đồng bộ có một nhược điểm quan trọng. Trong ví dụ trên, hành động thực hiện lệnh thị trường chiếm toàn bộ các luồng máy chủ, nghĩa là robot giao dịch của bạn không thể làm bất cứ điều gì khác trước khi hoạt động này hoàn tất.
Điều này không lý tưởng khi bạn muốn phản ứng nhanh với các sự kiện thị trường và biến động. Lý tưởng nhất là bot của bạn có thể lưu trữ các hành động khác nhau hoặc tạm dừng một số tác vụ nhất định để tham gia vào các hoạt động khác cấp bách hơn. Chúng ta sẽ mở rộng ví dụ của mình để phản ánh tốt hơn cách thực hiện các hoạt động bất đồng bộ.
graph TD
A([Gặp tín hiệu kỹ thuật]) ==> B([Đặt lệnh mua]) & C([Đặt lệnh bán để phòng <br>ngừa rủi ro]) ==> D([Một lệnh chạm mức chốt <br>lời/cắt lỗ])
D ==> E([Đóng vị thế])
E ==> A Trong ví dụ trên, robot giao dịch của chúng ta đồng thời đặt lệnh theo cả hai hướng để phòng ngừa rủi ro cho các vị thế của mình. Trái ngược với các hoạt động đồng bộ, không cần phải đợi một hoạt động hoàn thành trước khi tiếp tục với hoạt động khác. Điều này mở rộng đáng kể cơ hội cho các nhà phát triển trong việc tạo ra các robot giao dịch hiệu quả và đáng tin cậy.
Lưu ý rằng thực thi bất đồng bộ khác với đa luồng:
- Trong thực thi bất đồng bộ, tất cả các tác vụ được bắt đầu trên cùng một luồng. Khi chúng được lưu trữ hoặc tạm dừng, chúng giải phóng luồng này và khi tiếp tục thực thi sau đó, nó diễn ra trên một luồng khác được chọn từ nhóm luồng.
- Khi đa luồng, tất cả các tác vụ bắt đầu trên các luồng khác nhau và tiếp tục thực thi trên các luồng ban đầu của chúng. Không có sự xáo trộn luồng.
cTrader không bao giờ gọi các phương thức của bạn song song nên bạn không phải lo lắng về các vấn đề đa luồng.
