Điều cơ bản đê lập trình expert trên ngôn ngữ NTL+ | IFCM Việt Nam
IFC Markets Online CFD Broker

Điều cơ bản đê lập trình expert trên ngôn ngữ NTL+

Giới thiệu

Bài viết này dành cho các lập trình viên mà dự định lập trình expert trên ngôn ngữ NTL+. Trong bài viết này sẽ kể đến các đặc tính khi lập trình expert để tránh gặp các lỗi và tích kiệm được thời gian khi viết script (script được hiểu trong ngôn ngữ NTL+ là các mã như: expert, indicator, utility).


Lập trình expert.

Để lập trình expert, Bạn hãy vào cửa sổ Navigator, và ấn vào nút chuột phải vào mục Advisors và chọn trong menu nút Create. Bạn sẽ được mời đặt tên mới cho expert. Tên gọi của expert có hạn chế như tên gọi cho phép trong Windows: tên gọi không được bao gồm ký hiệu: *|\:"<>?/ .


Sau khi tạo file cho expert mới, Bạn sẽ thấy 3 chức năng có sẵn Initialize(), Run(), DeInitialize(). 3 chức năng này sẽ khởi động trong từng giai đoạn của mình. Lập trình viên không cần kích hoạt chức năng hoạt động, vì chức năng này sẽ tự động chạy.


Sau khi khởi động expert thì chức năng Initialize(), dùng để thiết lập các thông số. Lưu ý rằng Initialize() không nên dùng để thực hiện các lệnh giao dịch, tại vì khi thực hiện lênh thì các thông số có thể chưa được thiết lập hết, ví dụ như giá BidAsk , các thông tin về tài khoản, những lệnh đã đặt.


Mỗi khi có biểu giá mới đên thì chức năng Run() khởi động và thực hiện các mã trong script. Trong phần đấy có thế bao gồm các mã phân tích và tính toán để quyết định thực hiện lệnh giao dịch. Tính toán dữ liệu sẽ thực hiện trong vòng 10 giây, nếu không thì chương trình sẽ tự động dừng expert.


Khi dùng expert thì chức năng DeInitialize(), sẽ thực hiện trước khi script ngừng hoạt động. Trong các script thì chức năng Initialize() và DeInitialize() có thế để trống hoặc xóa đi.


Thiết lập logic cho expert.

Bước đầu tiên sẽ là thiết lập logic. Logic phải có cấu trúc dễ hiểu và các lời ghi chúc, để sau này có thể đơn giản hóa việc nâng cấp và hữu ích hóa.


Phải đưa ra những điều kiện cho việc mở vị trí dài và ngắn, và sẽ đóng vị trí trong điều kiện nào, việc quản lý và giới hạn vị trí đang có. Nếu expert của Bạn đặt lệnh chờ đợi ( trong đấy OCO và tự kích hoạt), thì hãy đặt ra điều kiện khi nào cần xoa nhưng lệnh chờ đợi đấy.


Từ việc chọn các điều kiện giao dịch đúng, đặt lệnh sẽ quyết định hiệu quả của expert noi chúng, nên khi tạo expert, chiến thuật giao dịch rất quan trọng. Các điều kiện giao dịch có thể dựa trên các indicator kỹ thuật, phân tích mức giá và các tình toán khác mà bạn nghĩ sẽ hiểu quả cho việc giao dịch.


Đừng quên nghiên cứu xem nếu Bạn sẽ tự mình can thiệp vào trong quá trình chậy phân mềm: điều gì sẽ xẩy ra, nêu expert mở vị trí, còn bạn sẽ đóng lại ở trong terminal? Hãy nghĩ xem expert sẽ chuyển đổi sang trạng thái nào khác không, có thể dẫn đến sai lầm trong quá trình hoạt động.


Để đảm bảo hoạt động của expert, Bạn cần phân tích tình trạng của các vị trí mở và lệnh chờ đợi cho từng tích(mỗi một giây có báo giá mới) giá. Trong việc này chức năng Для корректной работы Вам понадобится анализировать состояние открытых позиций и установленных ордеров на каждом тике. В этом Вам помогут свойства Deals.TotalOrders.Total sẽ giúp bạn, sẽ trả lại số lượng vị trí và lệnh đang mờ, còn chức năng которые возвращают количество открытых позиций и установленных ордеров, а также методы Deals.Select() và Orders.Select() để chọn ra vị trí và lệnh.для выбора позиции или ордера.


Lưu ý thêm khi khởi động lại phần mêm thì expert sẽ làm việc như nào: expert sẽ trở lại trạng thái cũ? Hãy để ý thêm, sau khi quay lại làm việc thì một số vị trí có thể đã đóng theo lệnh lấy lãi hoặc cắt lỗ, hoặc khi lệnh chờ đợi hoạt động thì vị trí có thể đóng lại, hoặc là mở thêm vị trí.


Trong expert cần lưu ý tất cả các tình huống ngoại lệ có thể xẩy ra: ví dụ, không đủ vốn trong tài khoản để mở vị trí hoặc là đặt các lệnh chờ đợi quá ngần với giá thị trường.


Truy cập vào tình trạng tài khoản có thể thông qua chức năng Account và các điều chỉnh. Ví dụ, tính năng Account.Balance có thể dụng đề biết số tiền dư đang có trong tài khoản служит для получения баланса текущего счета, còn tính năng Account.MarginFree - có thể dùng để biết số tiền đảm bảo.


int Run() { // thêm dữ liệu volume – khối lượng đơn vị ngoại tệ gốc int volume = 10000; if(Account.MarginFree < volume/Account.Leverage) return -1; }

Lưu ý vào dòng «return -1» - khi thực hiện dòng này thì expert tự động ngừng hoạt động.


Làm việc với lịch sử biểu giá.

Sử dụng timeseria cho phép nhận lịch sử biểu giá cho ký hiệu cần thiết để phân tích thị trường. Timeseria là dữ liệu được lưu trong một nhóm dữ liệu: Open[] – giá mở của thanh bar, close[] – giá đóng của thanh bar, low[] – giá thấp nhất của thanh bar, time[] – thời gian mở của bar, Volume[] – khối lượng trong tick (Khối lương trong một thanh bar). Tất cả timeseria đều có thể sử dụng khi expert đang hoạt động . Trong timeseria index được đánh dấu ngược: từ mới nhất với index 0, còn cái cũ nhất với index sẽ là Bars.Total(Chart.Symbol,Chart.Interval)-1.


Nếu cần nhận thông tin cho ký hiệu bất kỳ thì sẽ cần object Bars. Phương pháp Open(), High(), Low(), Close(), Volume(), Time() tương đương cho timeseria, khác ở chỗ phải điền mã ký hiệu, kích cở bar (khoảng thời gian, timeframe) và số bar cần để lây thông tin. Trước khi hoạt động của script phải điền tất cả các ký hiệu. Để làm việc này hãy mở cửa sổ MarketWatch, ấn nút chuột phải vào ô trống, chọn lệnh Subscribe, đánh dấu tất cả các ký hiệu và ấn "OK".


Trong expert nhiều khi cần biết khi nào thanh bar mới sẽ mở ra hoặc đóng lại. Để biết điều này thì hãy dùng dữ liệu toàn cầu Volume. Cho mỗi tick giá trị Volume[0] sẽ thêm 1, và tích đầu thì bar mới sẽ bằng 1. Như vậy để biết lúc nào có bar mới có thể dùng mã như này:


int Run() { if(Volume[0]==1) { // mã này sẽ thực hiện khi có tích giá mới. } }

Hoặc là có thể ngừng hoạt động Run() bằng mã return cho tất cả giá trị Volume[0] ngoài bằng 1:


int Run() { if(Volume[0]>1) return (0); // mã này sẽ thực hiện khi có tích giá mới. }

Có cách khác để phân tích thời gian mở của Bar mới – nếu thời gian 2 tick cuối cùng trùng hợp thì ra khỏi script bằng lệnh return(0). Khi hình thành bar thì mính sẽ nhận được Time[0] cho bar hiện tại và bar mới – như vậy đấy là thời gian bar mới mở ra.


datetime lasttime=0; int Run() { if(lasttime == Time[0]) return(0); // mã này sẽ thực hiện khi có tích giá mới. lasttime = Time[0]; }

Thư nghiệm (tester) expert

Thử nghiệm chiến lược Advisor Tester dùng để phân tích hiểu quả và kiểm tra chức năng của expert. Tester có thể chạy từ menu chính View -> Advisor Tester. Bên trên cửa sổ tester có các mục như sau:


  • Parameters – các thông số tester
  • Results – kết quả cho từng vị trí hiển thị trong bảng
  • Equity Graph – hiển thị thay đổi vốn và số dư trong tài khoản
  • Journal – ghi chúc

Parameters

Trong mục Parameters có thể điền các thông số ảnh hưởng đến quá trình thử nghiệm:


  • Danh sách Advisor – chọn expert mà cần để thử nghiệm.
  • Nút Properties – xem thông số của expert để chỉnh đổi. Nếu trong expert không có thông số mà có thể chỉnh đổi với ký hiệu extern, thì nút đáy sẽ tự ẩn. вызов параметров эксперта для редактирования. Если в эксперте нет параметров объявленных с ключевым словом extern, то кнопка будет неактивной.
  • Symbol – ký hiệu để thử nghiệm *.
  • Interval – timeframe (thời gian từng Bar).
  • Spread – chọn giá trị spread. Giá trịCurrent spread tương ứng với giá trị thực. Trong ô Spread có thể điền bất kỳ giá trị nào ngoài giá trị âm.
  • Method – phương pháp thử nghiệm. Có thể chọn 1 trong 2 phương cách: Control Points hoặc Open Price Only. Khi chọn Control points sẽ tự động tạo 4 tích cho từng bar (theo thứ tự tiếp theo). Cho bar với giá mở thấp hơn giá đóng, tích sẽ tương Open, Low, High, Close; bar mở với giá cáo hơn dóng - Open, High, Low, Close.
    img
    Cho phương pháp Open Prices Only thì tất cả các lệnh giao dịch sẽ được thực hiện theo giá mở cửa. Khi đây timeseria với index bằng 0 sẽ bằng nhau Open[0] = High[0] = Low[0] = Close[0], còn giá trị các thành phần timeseria với index 0 thì các giá trị sẽ tương ứng theo phương pháp Control Points.
  • Lá cờ Limit Dates dùng để bật giới hạn khoản cách thời gián thử nghiệm .
  • Ô để điền thông tin vào FromTo dùng để điền khoảng cách của thời gian thư nghiệm vào. Giá trị theo cài đặt sẵn tương ứng với lịch sử tải về từ trước cho ký hiệu cần thiết.
  • Initial Deposit – số vốn khởi đầu cho thử nghiệm.
  • Lá cờ Enable visual mode dùng để đưa ký hiệu lên biểu đồ khi mở hoặc đóng vị trí và thêm khi đặt lệnh chờ đợi. служит для вывода графика, на котором отмечаются моменты открытия и закрытия позиций, а также момент установки ордера для последней открытой позиции.
  • Lá cờ Enable expert logs dùng để ghi các ghi chúc trong khi chậy expert vào trong mục Journal bằng chức năng System.Print.
  • Nút Start/Stop khởi động và ngừng tester.

Bật là cờ Enable visual modeEnable expert logs tác động đến tốc độ làm việc của tester, nên hãy bật no khi cần thiết.


* Hiện tại tester không hỗ trợ thử nghiệm đa ngoại tệ. Nếu bạn đang thử nghiệm expert vớ các vị trí với nhiều ký hiệu (dụng cụ) khác nhau và khoảng cách thời gian cho ký hiệu đấy khác nhau thì giá trị bid và ask, timeseria và các giá trị trả lại bằng phương pháp Bars , có thể bằng 0.


Results

Trong mục Results đưa ra thông tin cho tất cả các vị trí, mở và đóng được thực hiện trong quá trình thử nghiệm. Trong bảng với các vị trí đóng. Trong đấy hiển thị các thông tin như sau:


  • Số # - mã số đóng vị trí. Vị trí đóng đầu tiến sẽ có ký hiệu #1, thứ 2 #2 và tiếp theo.
  • Deal ID – mã số giao dịch.
  • Symbol – ký hiêu của vị trí.
  • Volume1 – khối lượng theo đơn vị ngoại tệ gốc
  • Volume2 - khối lượng theo đơn vị ngoại trích dẫn
  • Open rate – giá mở
  • Open time –thời gian mở
  • Stop loss – mức cắt lỗ (không hiển thị nếu không đặt)
  • Take profit – mức khớp lãi (không hiển thị nếu không đặt)
  • Last swap – giá trị swap cuối
  • Rate close – giá đóng
  • Time close – thời gian đóng
  • Profit – tiền lãi
  • Balance – số tiền dư sau khi đóng vị trí*.
  • Equity – vốn sở hữu sau khi đóng vị trí*.

* Thông số hiện thị theo ô dọc trong bảng nếu chọn chế độ mở rộng Show extended columns. Chế độ này được bật trong menu rời từ trong bảng.


Trong bảng ở phía dưới hiển thị các vị trí mà chưa đóng trong khi đã hết quá trình thử nghiệm. Tên của các ô dọc chùng tên với các ô dọc trong bảngВ нижней таблице отображаются позиции, которые не были закрыты на момент окончания тестирования. Наименования столбцов таблицы совпадают с соответствующими столбцами таблицы Closed Positions, ngoại các ô dọc mà khong có за исключением отсутствующих столбцов закрытия позиций.


Trong dòng thông tin bên dưới có ghi các thông tin về số tiền trong dư trong tài khoản, vốn sở hữu, số tiền đảm bảo đến lúc kết thúc thử nghiệm.


Equity graph

Hiển thì thay đổi số vốn sau khi đóng vị trí. 2 lần ấn nút chuột vào biểu đò sẽ hiển thị từng vị trí trong bảng Closed positions.


Journal

Hiển thị các ghi chúc vào nhật ký với phương pháp in System.Print, được sử dụng trong expert. Nếu lá cờ Enable expert logs trong mục Parameters đang trong trạng thái tắt, thì trong ghi chúc sẽ chỉ ghi 2 lệnh là lúc kích hoạt và lúc tắt expert.


Hưu ích hóa script

Làm mượt script sẽ rât khó nếu không sử dụng chức năng in System.Print, mà sẽ ghi lại các hoạt động vào nhật ký Journal cửa sổ Toolbox (hoặc vào Journal cửa số thử nghiệm). Nên biêt thêm, khi chạy expert thì các thông tin được ghi thêm vào «tên người dùng\Documents\ NeTTradeX Advisors\logs». File log có thể mở bằng phần mềm text thông thường. Trong file log có ghi lại thời gian xẩy ra sự kiện, mã hiện thực (0 –thực hiện thành công, 1 – lỗi) và comment ghi chúc.


Cho thêm tính năng System.LastError cho phep phân tích tình hình, khi expert của bạn làm việc không chuản. Tính năng này lưu giữ lại số lỗi cuối cùng, khi thực hiện lệnh giao dịch. Tính năng này có điều đặc biệt là chỉ ghi lại nhưng lệnh cuối thồi, có nghĩa là nếu lênh đầu của bạn có lỗi mà lệnh tiếp theo không bị lỗi thì System.LastError sẽ trả lại giá trị 0 (không có lỗi). Như vậy là Bạn cần xem lỗi trong tính năng System.LastError trước khi lệnh tiệp theo sẽ được đặt ra. Đẻ xem chi tiết về lỗi, Bạn có thể dùng chức năng System.ErrorDescription(),sẽ trả lại thông tin với chi tiết của lỗi, còn kỹ hiệu số sẽ là mã lỗi của chức năng System.LastError.


Khi hoàn thiện expert, có thể dùng thêm IsStopped của chức năng System. Nó có giá trị true, nếu sau khi có tích giá cuối, hệ thông mất hơn 7 giây để sử lý. Với chức tính năng đấy, ngưởi lập trình có thể biết là script sẽ sắp ngừng hoạt động (sau 3 giây nữa).


Tông quát

Trong lời kết thúc, khi tạo expert có thể nói một cách đơn gián là chia ra 2 quá trình: Thiết kế logic và lập trình. Tùy thuộc vào bước 1 được nghiên cứu rõ ràng thì bước 2 lập trình sẽ đơn giản đi. Trong bài viết này, chúng tôi đã xem xét các bước lập trình cơ bản và các lỗi có thể gặp, hi vọng đã giúp được các Bạn làm quen với ngôn ngữ và khả năng của NTL+ một cách đơn giản nhất.


Close support
Call to Skype Call to WhatsApp Call to telegram Call Back Call to messenger