Thông thường khi phát triển EA, bạn sẽ sử dụng dữ liệu giá thanh cho một thanh cụ thể. Tìm hiểu cách viết Expert Advisor đầy đủ chức năng bằng cách sử dụng bốn cấp dữ liệu giá (giá mở cửa, giá cao nhất, giá thấp nhất, giá đóng cửa) để giúp bạn lập trình EA giao dịch của mình trong bài viết dữ liệu giá MQL4 hoàn chỉnh này.
Cấp độ | Hằng số dữ liệu giá/ Chức năng | Chức năng |
---|---|---|
1 | Giá cao, giá thấp, giá mở cửa, giá đóng cửa, Ngoài ra: đặt giá thầu, hỏi | Mức dễ nhất. Dữ liệu giá đề cập đến giá dữ liệu hiện tại của biểu tượng biểu đồ, khung thời gian biểu đồ và thanh hiện tại. |
2 | Cao[], thấp[], mở[], đóng[] | Lớp trước. Dữ liệu giá đề cập đến giá dữ liệu hiện tại của các loại trò chuyện và khung thời gian biểu đồ, nhưng điều linh hoạt hơn là nó có thể đề cập đến thanh lịch sử nào. Số trong ngoặc đề cập đến thanh lịch sử mà nó có thể tham chiếu. Ví dụ: Đóng[0] = giá đóng cửa của thanh hiện tại, Đóng[1] = giá đóng cửa của thanh trước đó. |
3 | iHigh(), iLow(), iOpen(), iClose() | Mức chức năng rất linh hoạt. Chức năng dữ liệu giá đề cập đến dữ liệu giá cho các ký hiệu và/hoặc khung thời gian và/hoặc thanh lịch sử tùy chỉnh. Ví dụ #1: iClose(NULL,0,0) = ký hiệu biểu đồ, phạm vi thời gian, giá đóng cửa của thanh hiện tại. Lưu ý: Cách sử dụng của nó gần giống như Đóng hoặc Trả giá hoặc thậm chí là iClose[0]. Ví dụ #2: iClose ("EURUSD",30,1) = Giá đóng của biểu tượng EURUSD, khung thời gian 30 phút, thanh trước đó. Lưu ý: Lần sử dụng này chức năng sẽ tăng gấp ba lần so với chức năng dữ liệu giá trước đó. |
4 | iHighest(), iLowest(), | Hàm dữ liệu giá được sử dụng để tìm giá trị dữ liệu giá tối đa trong một khoảng thời gian. Thích hợp để tìm giá trị dữ liệu cao nhất hoặc thấp nhất trong một phạm vi cụ thể. Ví dụ: Thấp[iLowest(Symbol(), 0, MODE_LOW, 3, 1)] = thanh thấp nhất trong ba thanh cuối cùng. |
Hãy xem xét riêng bốn cấp độ dữ liệu giá này.
Dữ liệu giá cấp 1: Dữ liệu giá được giới hạn ở các ký hiệu biểu đồ, khung thời gian biểu đồ và thanh hiện tại.
Nếu bạn chỉ muốn tham khảo dữ liệu giá cho thanh hiện tại của biểu đồ và khung thời gian hiện tại, bạn có thể sử dụng bất kỳ phương pháp dữ liệu giá nào sau đây: Cao, Thấp, Mở, Đóng , Trả giá, Hỏi .
Hãy nhớ rằng tất cả đều phải có chữ in hoa để chương trình có thể đọc được (giá thầu hợp lệ, giá thầu thì không). Nếu bạn muốn tham khảo giá đóng cửa hiện tại, bạn có thể sử dụng Close hoặc Bid, vì giá đóng cửa của MT4 mặc định là Bid. Ví dụ: nếu bạn muốn EA của mình tìm kiếm điều kiện là giá đóng cửa hiện tại phải lớn hơn đường trung bình động 200 kỳ, bạn có thể khai báo điều đó như sau:
Đóng> iMA ( NULL,0,200,0,MODE_EMA,PRICE_CLOSE,1)
Hoặc, hoặc, như:
Giá thầu> iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,1);
Lưu ý: Vui lòng hãy nhớ rằng mức dữ liệu Giá đơn giản này chỉ có thể được sử dụng trên các biểu tượng biểu đồ, khung thời gian biểu đồ và thanh hiện tại. Nếu bạn muốn sự linh hoạt khi sử dụng các thanh khác nhau, bạn phải sử dụng dữ liệu giá cấp 2 hoặc 3. Nếu bạn muốn sự linh hoạt khi sử dụng các biểu tượng biểu đồ khác nhau, các khung thời gian khác nhau và các thanh khác nhau, bạn phải sử dụng dữ liệu giá cấp 3.
Dữ liệu giá cấp 2: Dữ liệu giá đủ linh hoạt để sử dụng trên các thanh khác nhau
Nếu bạn muốn sử dụng dữ liệu giá từ biểu đồ hiện tại nhưng muốn kiểm soát Đối với thanh được chỉ định, bạn có thể sử dụng các mảng chuỗi được xác định trước: Cao[], Thấp[], Mở[] và Đóng [].
Mảng là một biến lưu trữ nhiều giá trị. Chúng hoạt động giống như danh sách, nơi bạn có thể nhóm các mục trong bảng và truy cập chúng theo số hàng, được gọi là chỉ mục. Các hàng hoặc chỉ số được đánh số bắt đầu từ 0 và tiến tới 1, 2, 3, v.v. Chỉ số của các số này được đặt trong dấu ngoặc đơn, trong trường hợp cụ thể ở trên, mỗi chỉ số được đánh số đề cập đến một thanh cụ thể theo thời gian và việc thay đổi số sẽ thay đổi thanh theo thời gian bạn muốn tham chiếu. Ví dụ: Close[0] là giá mở cửa của thanh hiện tại, trong đó 0 là chỉ số. Bằng cách thay đổi nó, chúng ta có thể nhận được giá đóng cửa của các thanh khác: Close[1] đề cập đến thanh trước đó của thanh hiện tại, Đóng [2] đề cập đến việc lùi lại 2 thanh so với thanh hiện tại, v.v.
Trong hầu hết các EA mà chúng tôi tạo, chúng tôi sẽ sử dụng giá trị của thanh hiện tại hoặc thanh trước đó. Tuy nhiên, nếu bạn muốn linh hoạt hơn trong việc xử lý dữ liệu giá không chỉ trên các thanh lịch sử khác nhau mà còn trên các ký hiệu khác nhau bên ngoài biểu đồ hiện tại hoặc trên các khung thời gian khác nhau bên ngoài biểu đồ hiện tại thì bạn phải chuyển sang dữ liệu giá Cấp 3.
Dữ liệu giá cấp 3: Dữ liệu giá linh hoạt nhất, sử dụng các tính năng hoạt động với các biểu tượng có thể tùy chỉnh, khung thời gian có thể tùy chỉnh và các thanh lịch sử có thể tùy chỉnh.
Nếu bạn muốn sử dụng dữ liệu giá (giá cao nhất, giá thấp nhất, giá mở cửa, giá đóng cửa) của các công cụ giao dịch ngoài biểu đồ hiện tại hoặc nếu bạn cần dữ liệu từ các khoảng thời gian khác Dữ liệu về giá, bạn có thể sử dụng các hàm dữ liệu giá sau: iHigh(), iLow(), iOpen() và iClose(). Những thứ này sẽ cung cấp cho bạn các giá trị dữ liệu về giá trên một biểu đồ thanh hoặc một khoảng thời gian.
Bảng sau minh họa cú pháp của hàm iClose():
< span jsaction="mouseup:Sxi9L,BR6jm; mousedown:qjlr0e" jsname="jqKxS">Thông số | Mô tả |
---|---|
Biểu tượng | Ký hiệu cặp tiền tệ được sử dụng |
Khung thời gian | < span jsaction="agoMJf:PFBcW;MZfLnc:P7O7bd;nt4Alf:pvnm0e,pfE8Hb,PFBcW;B01qod:dJXsye;H1e5u:iXtTIf;lYIUJf:hij5Wb;bmeZHc:iURhpf;Oxj3Xe:qAKMYb,yaf12d" js name="txFA lớp F" =" jCAhz ChMk0b" jscontroller="Gn4SMb">Thời gian gần đúng. Có thể là bất kỳ giá trị liệt kê Khung thời gian nào. Chọn (0) để hiển thị khoảng thời gian hiện đang hiển thị hoặc chọn một Một trong những giá trị sau: (1, 5, 15, 30, 60, 240, 1440, 10080, 43200) {Tất cả trong Phút< /span > |
Shift | Di chuyển trở lại so với thanh hiện tại |
Ví dụ: giả sử bạn mở một Biểu đồ 1 giờ nhưng bạn muốn xem giá đóng cửa của thanh trước đó trên biểu đồ hàng ngày.
Đây là mẫu giá cao nhất và thấp nhất của ngày hôm qua:
Double High= iHigh(NULL, PERIOD_D1, 1);
Thấp gấp đôi = iLow(NULL, PERIOD_D1, 1);
Biểu diễn tham số:< /p>
NULL = mã biểu đồ hiện tại.
PERIOD_D1 = D1 hoặc khoảng thời gian biểu đồ hàng ngày, cũng có thể là 1440.
1 = shift, 1 đại diện cho thanh trước đó.
Lưu ý: Hàm iHigh() và iLow() cho phép bạn di chuyển giá trị tối đa của một thanh. Nếu bạn muốn di chuyển giá trị tối đa trong phạm vi thanh, bạn phải sử dụng các hàm iHighest() và iLowest(), được thảo luận thêm bên dưới.
Bảng liệt kê thời gian biểu h3>
Có hai cách để đặt một phạm vi thời gian: một bằng hằng số tuần hoàn và cách kia bằng một giá trị số nguyên, như minh họa trong ví dụ bên dưới.
Chiều cao gấp đôi = iClose (NULL,Period_D1,1);
Chiều cao gấp đôi = iClose (NULL, 1440,1);< /p>
Bạn sẽ thấy PERIOD_D1 có thể được thay thế bằng 1440 — khoảng thời gian tính bằng phút tạo thành một ngày.
Đây là bảng hoàn chỉnh gồm các giá trị không đổi và số nguyên tương đương của chúng:
liên tục | giá trị | Mô tả |
---|---|---|
PERIOD_M1 | 1 | 1 phút |
5 | 5 Phút | |
PERIOD_M30 | 30 | 30 Phút |
PERIOD_H1 | 60 | 1 giờ |
PERIOD_H4 | 240 | 4 giờ |
PERIOD_D1 | 1440 | Hàng ngày |
PERIOD_W1 | 10080 | Hàng tuần |
PERIOD_MN1 | 43200 | Hàng tháng < /span> |
0 (không) | 0 | Phạm vi thời gian biểu đồ |
// vào phần biến ngoài
< p>Khung thời gian int bên ngoài = 30;// Đặt một vị trí nào đó trong mã của bạn
Double PreviousClose = iClose (NULL, TimeFrame , 1 );
TimeFrame là mã định danh của tôi, tham chiếu đến tham số khung thời gian. Giá trị mặc định của tôi là 30, tham chiếu đến thanh M30 trước đó. . Tôi biết đây là thanh trước đó vì tôi đã nhập 1 vào tham số shift. Nếu tôi muốn tham chiếu đến mức đóng M5 hiện tại, tôi chỉ cần nhập 5 ở tham số thứ hai, và nếu tôi muốn tham chiếu đến thanh hiện tại, tôi chỉ cần nhập 0 ở tham số thứ ba.
Giờ đây, bạn có thể dễ dàng làm cho EA của mình tham chiếu nhiều khung thời gian và nếu muốn, bạn thậm chí có thể thiết lập trình kiểm tra chiến lược để chạy tối ưu hóa giữa các khung thời gian.
Phương pháp thay thế tiền tệ thay thế
Điều tuyệt vời là bạn không chỉ có thể dễ dàng tham chiếu nhiều khung thời gian; cặp tiền tệ. NULL đại diện cho ký hiệu của biểu đồ hiện tại, nhưng nó có thể được thay thế bằng bất kỳ ký hiệu tiền tệ nào, ngay cả những tiền tệ nằm ngoài biểu đồ của EA. Làm như vậy rất đơn giản: bạn chỉ cần thay thế NULL bằng ký hiệu bạn muốn sử dụng (nó phải xuất hiện trong cửa sổ thị trường của bạn) và đưa nó vào thị trường báo giá.
Nếu bạn muốn trích dẫn ký hiệu EURUSD, vui lòng cho ví dụ:
double PreviousClose = iClose ("EURUSD", 30,1);
Ngoài ra, bạn có thể linh hoạt tạo một biến bên ngoài cho tham số này, như minh họa trong ví dụ sau:
//Đặt phần biến ngoài vào
Tên tiền tệ chuỗi ngoài = "EURUSD";
Khung thời gian int bên ngoài = 30;
// Đặt một vị trí nào đó trong mã của bạn
double PreviousClose = iClose (CurrencyName, TimeFrame , 0) ;
Như bạn có thể thấy, chúng tôi thay thế NULL bằng một biến chuỗi bên ngoài mà chúng tôi xác định là Tên tiền tệ và chúng tôi mặc định là "EURUSD" (mặc dù nó có thể là bất kỳ cặp tiền tệ nào bạn có thể nhìn thấy trong cửa sổ thị trường miễn là bạn đặt nó trong báo giá). Cũng lưu ý rằng tất cả tên tiền tệ được thêm vào biến bên ngoài phải sử dụng biến chuỗi bên ngoài.
Tại sao bạn cần tham chiếu một cặp tiền tệ khác với biểu đồ của mình?
Tôi có thể nghĩ ra nhiều lý do, nhưng lý do đầu tiên tôi nghĩ đến là khi bạn giao dịch thông qua mối tương quan. Ví dụ: giả sử bạn đang giao dịch GBPUSD, nhưng bạn tin rằng EURUSD là tiền tệ hàng đầu đối với hầu hết các loại tiền tệ chính, vì vậy trước tiên bạn muốn xem hướng xu hướng của EURUSD là điều kiện tiên quyết để mở giao dịch GBPUSD.
Dữ liệu giá cấp 4: Các hàm sử dụng giá trị dữ liệu giá tối đa trong một khoảng thời gian
Ngoài việc sử dụng các hàm dữ liệu giá như iHigh() và iLow trong một khoảng thời gian, nó cũng có thể sử dụng nhiều khoảng thời gian Các hàm dữ liệu giá cho giá trị tối đa trong phạm vi: iHighest() và iLowest(). Bằng cách sử dụng từng hàm này, bạn có thể xử lý h/l cho nhiều ô nhịp trong một phạm vi.
Hai hàm này có bộ tham số riêng:
int iHighest(string ký hiệu , khung thời gian int, loại int, int count=WHOLE_ARRAY, int start=0)
Thông số | Mô tả |
---|---|
Biểu tượng | Biểu tượng được sử dụng. NULL=biểu đồ hiện tại |
Khung thời gian | Thời gian gần đúng. Nó có thể được tính cho bất kỳ phạm vi thời gian nào. 0=Phạm vi thời gian hiện tại |
Loại | Định danh mảng chuỗi. Nó có thể là bất kỳ giá trị liệt kê định danh mảng Sê-ri nào |
Số thanh | < td style="word-break: break-all;">Số lượng thanh bạn muốn kiểm tra, từ thanh bắt đầu đến nơi thực hiện phép tính Hướng của cột phía sau.|
Start Bar | Shift hiển thị thanh tương ứng với thanh hiện tại mà dữ liệu sẽ được lấy từ đó |
Bảng định danh mảng chuỗi:
Không đổi | Giá trị | Mô tả |
---|---|---|
MODE_OPEN | < td> 0Giá mở cửa< /td > | |
MODE_LOW | 1 | Giá thấp |
MODE_HIGH | 2< /td> | Giá cao | tr>
MODE_CLOSE | 3 | Giá đóng |
MODE_VOLUME | 4< /td> | Khối lượng giao dịch, được sử dụng cho iLowest() và iHighest( ) chức năng. |
MODE_TIME | 5 | Thời gian mở thanh, được sử dụng cho hàm ArrayCopySeries(). |
Lưu ý: Có vẻ như bạn có thể chọn sử dụng bất kỳ loại nào ở trên, nhưng trong thực tế chung bạn sẽ sử dụng MODE_HIGH và iHighest() và MODE_LOW và iLowest().
Ví dụ về điểm thấp nhất và điểm cao nhất của 3 thanh dừng lỗ cuối cùng:
// stop = Mức thấp nhất của 3 thanh cuối cùng
if(dir == OP_BUY)
{
stopLoss = Low[iLowest(Symbol(), 0, MODE_LOW, 3, 1)];
}else if ( dir == OP_SELL)
{
stopLoss = Cao[iHighest(Symbol(), 0, MODE_HIGH, 3, 1)];
Trên đây là cách sử dụng khác nhau Một kỹ thuật thông minh so với các loại dừng lỗ thông thường.
Nếu bạn muốn nhận được giá trị thấp nhất trong khoảng từ 10 đến 20 thanh thì sao?
// Tính giá trị thấp nhất của 10 thanh liên tiếp trong phạm vi
// Chỉ số thứ 10 đến thứ 19 trên biểu đồ hiện tại ( Bao gồm)
double val=Low[iLowest(NULL,0,MODE_LOW,10,10)];