Программа FMZ платформы backtest является полным контрольным процессом, и программа опросов без остановки в соответствии с определенной частотой. Данные, возвращенные каждым рынком и торговых API также моделирует фактическое время работы в соответствии с времени вызова.onTick
уровень, а неonBar
Улучшенная поддержка для обратного тестирования стратегий, основанных наTicker
данные (стратегии с более высокой частотой работы).
Бакт-тест на уровне моделирования основан на данных нижней K-линии системы бакт-теста, и согласно определенному алгоритму интерполяция данных тикера моделируется в рамках значений наивысшей, самой низкой, открывающейся и закрывающейся цены данной нижней K-линии Bar в этомBar
временные ряды.
Реальный рыночный уровень обратного теста - это реальные данные уровня тикера вBar
Для стратегий, основанных на данных на уровне тикера, использование реального рыночного уровня обратного теста ближе к реальности.
Для реального рыночного бэкстеста не существует опции нижней линии K (поскольку данные тикера реальны, для моделирования генерации не требуется нижняя линия K).
В обратном тесте на уровне симуляции генерируемыеticker
Это K-линейные данные - это нижняя K-линия. При фактическом использовании симуляционного уровня backtest период нижней K-линии должен быть меньше, чем период вызова API для получения K-линии при запуске стратегии. В противном случае, из-за большого цикла нижней K-линии и недостаточного количества генерируемых тикеров, данные будут искажены при вызове API для получения K-линии указанного периода. При использовании большого периода K-линейного backtest вы можете должным образом увеличить нижний K-линейный цикл.
Механизм генерации имитируемых тикеров на нижней линии K такой же, как и в известном торговом программном обеспечении MetaTrader 4
Специфический алгоритм для моделирования данных о тиках из данных нижней линии K:
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
}
Таким образом, при использовании обратного теста на уровне симуляции будут наблюдаться скачки цен в временных рядах.