Chương trình FMZ nền tảng backtest là một quy trình kiểm soát hoàn chỉnh, và chương trình đang thăm dò không ngừng theo một tần số nhất định. Dữ liệu được trả về bởi mỗi thị trường và giao dịch API cũng mô phỏng thời gian chạy thực tế theo thời gian gọi.onTick
mức độ, không phảionBar
hỗ trợ tốt hơn cho việc kiểm tra lại các chiến lượcTicker
dữ liệu (các chiến lược với tần suất hoạt động cao hơn).
Tiêu chuẩn mô phỏng backtest dựa trên dữ liệu K-line dưới cùng của hệ thống backtest, và theo một thuật toán nhất định, các ticker dữ liệu can thiệp được mô phỏng trong khuôn khổ các giá trị của giá cao nhất, thấp nhất, mở, và đóng của K-line dưới cùng được cho Bar vàoBar
chuỗi thời gian.
Các backtest thị trường thực là các dữ liệu mức ticker thực trongBar
Đối với các chiến lược dựa trên dữ liệu cấp ticker, sử dụng backtest cấp thị trường thực là gần hơn với thực tế.
Không có tùy chọn đường K dưới cùng cho kiểm tra hậu quả thị trường thực (vì dữ liệu ticker là thực, không cần đường K dưới cùng để mô phỏng sản xuất).
Trong thử nghiệm ngược cấp độ mô phỏng, cácticker
Dữ liệu K-line được mô phỏng dựa trên dữ liệu đường K. Dữ liệu đường K này là đường K dưới cùng. Trong việc sử dụng thực tế của thử nghiệm ngược cấp mô phỏng, khoảng thời gian của đường K dưới cùng phải nhỏ hơn khoảng thời gian gọi API để có được đường K khi chiến lược đang chạy. Nếu không, do chu kỳ lớn của đường K dưới cùng và số lượng ticker được tạo không đủ, dữ liệu sẽ bị biến dạng khi gọi API để có được đường K của khoảng thời gian được chỉ định. Khi sử dụng thử nghiệm ngược đường K giai đoạn lớn, bạn có thể tăng chu kỳ đường K dưới cùng một cách thích hợp.
Cơ chế để tạo các dấu hiệu mô phỏng trên đường K dưới cùng là giống như phần mềm giao dịch nổi tiếng MetaTrader 4
thuật toán cụ thể để mô phỏng dữ liệu tick từ dữ liệu đường K dưới cùng:
function recordsToTicks(period, num_digits, records) {
// http://www.metatrader5.com/en/terminal/help/tick_generation
if (records.length == 0) {
return []
}
var ticks = []
var steps = [0, 2, 4, 6, 10, 12, 16, 18, 23, 25, 27, 29]
var pown = Math.pow(10, num_digits)
function pushTick(t, price, vol) {
ticks.push([Math.floor(t), Math.floor(price * pown) / pown, vol])
}
for (var i = 0; i < records.length; i++) {
var T = records[i][0]
var O = records[i][1]
var H = records[i][2]
var L = records[i][3]
var C = records[i][4]
var V = records[i][5]
if (V > 1) {
V = V - 1
}
if ((O == H) && (L == C) && (H == L)) {
pushTick(T, O, V)
} else if (((O == H) && (L == C)) || ((O == L) && (H == C))) {
pushTick(T, O, V)
} else if ((O == C) && ((O == L) || (O == H))) {
pushTick(T, O, V / 2)
pushTick(T + (period / 2), (O == L ? H : L), V / 2)
} else if ((C == H) || (C == L)) {
pushTick(T, O, V / 2)
pushTick(T + (period * 0.382), (C == L ? H : L), V / 2)
} else if ((O == H) || (O == L)) {
pushTick(T, O, V / 2)
pushTick(T + (period * 0.618), (O == L ? H : L), V / 2)
} else {
var dots = []
var amount = V / 11
pushTick(T, O, amount)
if (C > O) {
dots = [
O - (O - L) * 0.75,
O - (O - L) * 0.5,
L,
L + (H - L) / 3.0,
L + (H - L) * (4 / 15.0),
H - (H - L) / 3.0,
H - (H - L) * (6 / 15.0),
H,
H - (H - C) * 0.75,
H - (H - C) * 0.5,
]
} else {
dots = [
O + (H - O) * 0.75,
O + (H - O) * 0.5,
H,
H - (H - L) / 3.0,
H - (H - L) * (4 / 15.0),
H - (H - L) * (2 / 3.0),
H - (H - L) * (9 / 15.0),
L,
L + (C - L) * 0.75,
L + (C - L) * 0.5,
]
}
for (var j = 0; j < dots.length; j++) {
pushTick(T + period * (steps[j + 1] / 30.0), dots[j], amount)
}
}
pushTick(T + (period * 0.98), C, 1)
}
return ticks
}
Do đó, khi sử dụng backtest cấp độ mô phỏng, sẽ có những bước nhảy giá trong chuỗi thời gian.