Hướng dẫn dưới đây trích từ sách HDSD Amibroker phiên bản 6.9 bản Tiếng Việt do team Ami X biên dịch. Để tìm đọc đầy đủ tải bản PDF full tại: HDSD Amibroker
QUAN TRỌNG: Các hàm TimeFrame KHÔNG nhằm mục đích thay thế cài đặt Periodicity. Để chuyển đổi Periodicity/khoảng thời gian, bạn chỉ nên sử dụng cài đặt Periodicity. Các hàm TimeFrame CHỈ dành cho các công thức TRỘN nhiều khoảng thời gian khác nhau cùng một lúc trong một công thức.
Phiên bản 4.41 mang đến khả năng sử dụng nhiều khung thời gian (khoảng thời gian thanh) trong một công thức duy nhất. Các hàm khung thời gian có thể được chia thành 3 nhóm chức năng:
1. chuyển đổi khung thời gian của các mảng O, H, L, C, V, OI, Avg tích hợp: TimeFrameSet, TimeFrameRestore
2. nén/mở rộng các mảng đơn lẻ thành/từ khoảng thời gian đã chỉ định: TimeFrameCompress, TimeFrameExpand
3. truy cập ngay vào các mảng giá/khối lượng trong khung thời gian khác: TimeFrameGetPrice
Nhóm đầu tiên được sử dụng khi công thức của bạn cần thực hiện một số phép tính trên các chỉ báo trong khung thời gian khác với khung thời gian hiện tại đã chọn. Ví dụ: nếu bạn cần tính trung bình động 13 thanh trên dữ liệu 5 phút và trung bình mũ 9 thanh từ dữ liệu hàng giờ trong khi khoảng thời gian hiện tại là 1 phút, bạn sẽ viết:
TimeFrameSet( in5Minute); // chuyển sang khung 5 phút
/* MA hiện hoạt động trên dữ liệu 5 phút, ma5_13 giữ MA 13 thanh nén theo thời gian của các thanh 5 phút */
ma5_13 = MA( C, 13);
TimeFrameRestore(); // khôi phục khung thời gian về TimeFrameSet( inHourly); // chuyển sang giờ
mah_9 = EMA( C, 9); // trung bình động 9 thanh từ dữ liệu hàng giờ TimeFrameRestore(); // khôi phục khung thời gian về gốc
Plot( Close, “Price”, colorWhite, styleCandle);
// vẽ trung bình mở rộng
Plot(TimeFrameExpand( ma5_13, in5Minute), “trung bình động 13 thanh từ các thanh 5 phút”, colorRed);
Plot( TimeFrameExpand( mah_9, inHourly), “trung bình động 9 thanh từ các thanh hàng giờ”,colorRed);
TimeFrameSet( interval ) – thay thế các mảng giá/khối lượng tích hợp hiện tại: open, high, low, close, volume, openint, avg bằng các thanh nén thời gian của khoảng thời gian đã chỉ định sau khi bạn chuyển sang khung thời gian khác, tất cả các phép tính và chỉ báo tích hợp đều hoạt động trên khung thời gian đã chọn. Để quay lại khoảng thời gian ban đầu, hãy gọi hàm TimeFrameRestore(). Nếu bạn muốn gọi lại TimeFrameSet với khoảng thời gian khác,
trước tiên bạn phải khôi phục khung thời gian gốc bằng TimeFrameRestore(). Interval là khoảng thời gian tính bằng giây. Ví dụ: 60 là thanh một phút. Bạn nên sử dụng hằng số thuận tiện cho các khoảng thời gian phổ biến: in1Minute, in5Minute, in15Minute, inHourly, inDaily, inWeekly, inMonthly.
Với phiên bản 4.70, bạn cũng có thể chỉ định khoảng thời gian N-tick. Điều này được thực hiện bằng cách truyền giá trị ÂM làm khoảng thời gian. Ví dụ -5 sẽ nén thanh 5 tích tắc và -133 sẽ nén 133 tích tắc. Xin lưu ý rằng việc sử dụng khoảng thời gian N-tick chỉ hoạt động nếu cơ sở dữ liệu của bạn sử dụng khoảng thời gian cơ sở Tick được đặt trong hộp thoại File -> Database Settings.
TimeFrameSet( -133 ); // chuyển sang khoảng thời gian 133-tick
QUAN TRỌNG: TimeFrameSet() KHÔNG tương đương với thiết lập chu kỳ trong Analysis Settings. Công dụng duy nhất của các hàm khung thời gian là khi bạn muốn có các quy tắc giao dịch dựa trên NHIỀU khung thời gian cùng một lúc. Xem chi tiết trong “Cách thức hoạt động bên trong” bên dưới.
TimeFrameRestore() – khôi phục các mảng giá được thay thế bằng SetTimeFrame. Lưu ý rằng chỉ các biến tích hợp OHLC, V, OI và Avg mới được khôi phục về khung thời gian gốc khi bạn gọi TimeFrameRestore(). Tất cả các biến khác được tạo khi ở trong khung thời gian khác vẫn được nén. Để giải nén chúng về khoảng thời gian gốc, bạn phải sử dụng TimeFrameExpand.
Khi bạn chuyển đổi khung thời gian bằng TimeFrameSet, tất cả các hàm AFL đều hoạt động trên khung thời gian này cho đến khi bạn chuyển lại khung thời gian về khoảng thời gian ban đầu bằng TimeFrameRestore hoặc đặt lại thành khoảng thời gian khác bằng TimeFrameSet. Tốt nhất là LUÔN gọi TimeFrameRestore khi bạn hoàn tất quá trình xử lý trong các khung thời gian khác.
Khi khung thời gian được chuyển sang khoảng thời gian khác ngoài khoảng thời gian ban đầu, kết quả của tất cả các hàm được gọi vì TimeFrameSet cũng được nén theo thời gian. Nếu bạn muốn hiển thị chúng trong khung thời gian ban đầu, bạn sẽ cần phải ‘mở rộng’ chúng như mô tả sau. Các biến được tạo và gán trước khi gọi TimeFrameSet() vẫn giữ nguyên trong khung thời gian chúng được tạo. Hành vi này cho phép kết hợp không giới hạn các khung thời gian khác nhau trong một công thức.
LƯU Ý rằng bạn chỉ có thể nén dữ liệu từ khoảng thời gian ngắn hơn sang khoảng thời gian dài hơn. Vì vậy, khi làm việc với dữ liệu 1 phút, bạn có thể nén thành dữ liệu 2, 3, 4, 5, 6, N phút. Nhưng khi làm việc với dữ liệu 15 phút, bạn không thể có được thanh dữ liệu 1 phút. Tương tự như vậy, nếu bạn chỉ có dữ liệu EOD, bạn không thể truy cập vào khung thời gian trong ngày.
Nhóm thứ hai: TimeFrameCompress/TimeFrameExpand cho phép nén và mở rộng các mảng đơn lẻ sang/từ các khung thời gian khác nhau. Đặc biệt đáng đề cập là TimeFrameExpand được sử dụng để giải nén các biến mảng được tạo trong các khung thời gian khác nhau. Giải nén là bắt buộc để hiển thị đúng mảng được tạo trong các khung thời gian khác nhau. Ví dụ, nếu bạn muốn hiển thị đường trung bình động hàng tuần, thì phải ‘mở rộng’ để dữ liệu của một thanh hàng tuần bao gồm năm thanh hàng ngày (Thứ Hai-Thứ Sáu) của tuần tương ứng.
TimeFrameExpand(array, interval, mode = expandLast ) – mở rộng mảng nén thời gian từ khung thời gian ‘interval’ sang khung thời gian cơ sở (‘interval’ phải khớp với giá trị được sử dụng trong TimeFrameCompress hoặc TimeFrameSet)
Các chế độ khả dụng:
expandLast – giá trị nén được mở rộng bắt đầu từ thanh cuối cùng trong khoảng thời gian nhất định (ví dụ giá đóng/cao/thấp hàng tuần khả dụng trên thanh của Thứ Sáu)
expandFirst – giá trị nén được mở rộng bắt đầu từ thanh đầu tiên trong khoảng thời gian nhất định (ví dụ giá mở hàng tuần khả dụng trên thanh của Thứ Hai)
expandPoint – mảng kết quả chỉ nhận được các giá trị không rỗng cho thanh cuối cùng trong khoảng thời gian nhất định (tất cả các thanh còn lại đều là Null (trống)).
Lưu ý: expandFirst được sử dụng trên giá khác với giá mở có thể xem xét trong tương lai. Ví dụ, nếu bạn tạo chuỗi HIGH hàng tuần, hãy mở rộng chuỗi này thành khoảng thời gian hàng ngày bằng cách sử dụng expandFirst để biết được vào MONDAY, giá trị cao nhất trong toàn bộ tuần là bao nhiêu.
QUAN TRỌNG: TimeFrameExpand LÀ YÊU CẦU đối với bất kỳ công thức nào sử dụng hàm TimeFrame*. Nếu bạn không mở rộng dữ liệu nén theo thời gian, bạn sẽ có dấu thời gian không chính xác (xem mô tả bên dưới trong “Cách thức hoạt động”).
TimeFrameCompress được cung cấp để hoàn thiện và có thể sử dụng khi bạn muốn nén một mảng mà không ảnh hưởng đến các mảng OHLC, V tích hợp sẵn. Nếu bạn gọi TimeFrameCompress, nó sẽ không ảnh hưởng đến kết quả của các hàm khác.
wc = TimeFrameCompress( Close, inWeekly );
/* bây giờ khung thời gian vẫn không thay đổi (ví dụ như hàng ngày) và MA của chúng ta sẽ hoạt động trên dữ liệu hàng ngày */
dailyma = MA( C, 14 );
/* nhưng nếu chúng ta gọi MA trên mảng đã nén, nó sẽ cung cấp MA từ khung thời gian khác
*/
weeklyma = MA( wc, 14 ); // lưu ý rằng đối số là mảng nén theo thời gian Plot( dailyma, “DailyMA”, colorRed );
weeklyma = TimeFrameExpand( weeklyma, inWeekly ); // mở rộng để hiển thị Plot( weeklyma, “WeeklyMA”, colorBlue );
Trong công thức này, khung thời gian vẫn giữ nguyên thiết lập ban đầu, chúng tôi chỉ nén một mảng.
TimeFrameCompress( array, interval, mode = compressLast )
– nén một mảng thành một khoảng thời gian nhất định bằng cách sử dụng các chế độ nén có sẵn: compressLast – giá trị cuối cùng (đóng) của mảng trong khoảng thời gian
compressOpen – giá trị mở của mảng trong khoảng thời gian compressHigh – giá trị cao nhất của mảng trong khoảng thời gian compressLow – giá trị thấp nhất của mảng trong khoảng thời gian compressVolume – tổng các giá trị của mảng trong khoảng thời gian
Graph0 = TimeFrameExpand( TimeFrameCompress( Close, inWeekly, compressLast ),
inWeekly, expandLast );
Graph1 = TimeFrameExpand( TimeFrameCompress( Open, inWeekly, compressOpen ),
inWeekly, expandFirst );
Nhóm thứ ba chỉ bao gồm một hàm hữu ích: TimeFrameGetPrice cho phép tham chiếu giá và khối lượng từ các khung thời gian khác mà không cần chuyển đổi /nén/mở rộng khung thời gian. Chỉ cần một lệnh gọi hàm để lấy giá từ khung thời gian cao hơn. Nó cũng cho phép tham chiếu không chỉ các thanh hiện tại mà cả các thanh trước đó từ các khung thời gian khác nhau.
TimeFrameGetPrice( pricefield, interval, shift = 0, mode = expandFirst );
– tham chiếu các trường OHLCV từ các khung thời gian khác. Điều này hoạt động ngay lập tức mà không cần phải gọi TimeFrameSet.
Trường giá là một trong những trường sau: “O”, “H”, “L”, “C”, “V”, “I” (lãi suất mở). Interval là khoảng thời gian thanh tính bằng giây. shift cho phép tham chiếu dữ liệu quá khứ (giá trị âm) và tương lai (giá trị dương) trong khung thời gian cao hơn. Ví dụ -1 cung cấp dữ liệu của thanh trước đó (giống như trong hàm Ref nhưng điều này hoạt động trong khung thời gian cao hơn).
Ví dụ:
TimeFrameGetPrice( “O”, inWeekly, -1) // cung cấp cho bạn giá mở cửa tuần trước TimeFrameGetPrice( “C”, inWeekly, -3) // cung cấp cho bạn giá đóng cửa tuần trước 3 tuần trước
TimeFrameGetPrice( “H”, inWeekly, -2) // cung cấp cho bạn giá cao tuần trước 2 tuần trước TimeFrameGetPrice( “O”, inWeekly, 0) // cung cấp cho bạn giá mở cửa tuần này.
TimeFrameGetPrice( “H”, inDaily, -1) // cung cấp giá cao trong ngày trước khi làm việc trên dữ liệu trong ngày
Shift hoạt động như trong hàm Ref() nhưng được áp dụng cho khung thời gian nén.
Lưu ý các hàm này hoạt động giống như 3 hàm lồng nhau này
TimeFrameExpand( Ref( TimeFrameCompress( array, interval, compress(tùy thuộc vào trường được sử dụng)), shift), interval, expandFirst)
do đó nếu shift = 0 dữ liệu nén có thể nhìn vào tương lai (mức cao hàng tuần có thể được biết vào thứ hai). Nếu bạn
muốn viết một hệ thống giao dịch bằng hàm này, vui lòng đảm bảo tham chiếu dữ liệu QUÁ KHỨ bằng cách sử dụng giá trị shift âm.
Điểm khác biệt duy nhất là TimeFrameGetPrice nhanh hơn 2 lần so với Expand/Compress lồng nhau.
Lưu ý về hiệu suất của các hàm TimeFrame:
a) Các phép đo được thực hiện trên Athlon 1,46 GHz, 18500 thanh hàng ngày được nén thành khung thời gian hàng tuần
TimeFrameGetPrice( “C”, inWeekly, 0 ) – 0,0098 giây (9,8 mili giây) TimeFrameSet( inWeekly ) – 0,012 giây (12 mili giây) TimeFrameRestore( ) – 0,006 giây (6 mili giây)
TimeFrameCompress( Close, inWeekly, compressLast ); – 0,0097 giây (9,7 mili giây) TimeFrameExpand( array, inWeekly, expandLast ); – 0,0098 giây (9,8 mili giây)
b) Các phép đo được thực hiện trên Athlon 1,46 GHz, 1000 thanh hàng ngày được nén thành khung thời gian hàng tuầntất cả các hàm đều dưới 0,0007 giây (0,7 mili giây)
Nó hoạt động như thế nào bên trong?
Các hàm khung thời gian không thay đổi BarCount – chúng chỉ nén các mảng để bạn có N-bar đầu tiên được điền bằng các giá trị NULL và sau đó – phần cuối cùng của mảng chứa các giá trị nén thời gian thực tế.
Đây là lý do tại sao việc mở rộng dữ liệu trở lại khung ban đầu bằng TimeFrameExpand là điều cần thiết.
Khám phá đơn giản sau đây cho thấy những gì xảy ra sau khi bạn chuyển sang khung thời gian cao hơn. Chạy Khám phá trên ký hiệu hiện tại, tất cả các báo giá, chu kỳ được đặt thành hàng ngày và bạn sẽ thấy cột “weekly close compress” chứa các giá trị trống ở đầu và dữ liệu nén hàng tuần ở cuối mảng.
Filter = 1;
AddColumn(Close, “Daily close”);
TimeFrameSet(inWeekly);
AddColumn(wc = Close, “weekly close compress”); TimeFrameRestore();
AddColumn( TimeFrameExpand(wc, inWeekly), “weekly close extended”);
VÍ DỤ
VÍ DỤ 1: Vẽ MACD hàng tuần và mũi tên chéo từ dữ liệu hàng ngày
TimeFrameSet( inWeekly);
m = MACD(12, 26); // MACD từ dữ liệu TUẦN TimeFrameRestore();
m1 = TimeFrameExpand( m, inWeekly); Plot( m1, “Weekly MACD”, colorRed);
PlotShapes( Cross( m1, 0 ) * shapeUpArrow, colorGreen ); PlotShapes( Cross( 0, m1 ) * shapeDownArrow, colorGreen );
VÍ DỤ 2: biểu đồ nến hàng tuần chồng lên biểu đồ giá hàng ngày theo đường
wo = TimeFrameGetPrice( “O”, inWeekly, 0, expandPoint ); wh = TimeFrameGetPrice( “H”, inWeekly, 0, expandPoint ); wl = TimeFrameGetPrice( “L”, inWeekly, 0, expandPoint ); wc = TimeFrameGetPrice( “C”, inWeekly, 0, expandPoint );
PlotOHLC( wo, wh, wl, wc, “Weekly Close”, colorWhite, styleCandle ); Plot( Close, “Daily Close”, colorBlue );
VÍ DỤ 3: Hệ thống màn hình ba đơn giản
/* chuyển sang khung thời gian hàng tuần */ TimeFrameSet( inWeekly );
whist = MACD( 12, 26 ) – Signal( 12, 26, 9 );
wtrend = ROC( whist, 1 ); // xu hướng hàng tuần – thay đổi một tuần của biểu đồ histogram macd hàng tuần
TimeFrameRestore();
/* mở rộng MACD được tính toán thành hàng ngày để chúng ta có thể sử dụng nó với các tín hiệu hàng ngày */ wtrend = TimeFrameExpand( wtrend, inWeekly );
/* elder ray */
bullpower= Cao – EMA(Đóng,13); bearpower= Thấp – EMA(Đóng,13);
Mua = wtrend > 0 /* Màn hình thứ nhất: xu hướng hàng tuần tích cực */
VÀ
bearpower < 0 VÀ bearpower > Tham chiếu( bearpower, -1 ) /* Màn hình thứ hai bear power âm nhưng đang tăng */
VÀ
H > Tham chiếu( H, -1 ); /* Màn hình thứ 3, nếu giá đạt mức cao mới */
BuyPrice = Tham chiếu( H, -1 ); // mức dừng mua;
Sell = 0; // chỉ thoát khi dừng
ApplyStop( stopTypeProfit, stopModePercent, 30, True); ApplyStop( stopTypeTrailing, stopModePercent, 20, True)