FMZ 퀀트 백테스트의 전략 프로그램은 완전한 제어 흐름이며, 프로그램은 특정 빈도에 따라 지속적으로 설문 조사를 받는다. 플랫폼 API가 반환하는 모든 시장 코트 및 데이터는 호출 시간에 따라 실제 실행 시기를 시뮬레이션한다. 백테스트는 다른 백테스트 시스템의 온바르 수준이 아니라 온틱 수준에 속한다. 그것은 틱커 데이터 (더 높은 운영 빈도의 전략) 에 기반한 전략의 백테스트를 더 잘 지원한다.
시뮬레이션 레벨 백테스트는 백테스트 시스템의 하층 K-라인 데이터에 기반합니다. 특정 알고리즘에 따라 기본 K-라인 바의 주어진 가장 높은 가격, 가장 낮은 가격, 오픈 가격 및 클로즈 가격으로 구성된 프레임 내에서, 이 바의 시간 계열에 틱어 데이터의 중입을 시뮬레이션합니다.
실제 시장 수준 백테스트는 바의 시간 계열의 실제 틱어 레벨 데이터입니다. 틱어 레벨 데이터에 기반한 전략의 경우 실제 시장 수준 백테스트를 사용하는 것이 현실에 더 가깝습니다. 실제 시장 수준의 백테스트에서는 실제로 기록된 데이터, 시뮬레이션된 것이 아닙니다.
실제 시장 수준의 백테스트를 위해 하층 K-라인 옵션이 없습니다 (티커 데이터가 실제이기 때문에 하층 K-라인은 시뮬레이션에 사용되지 않습니다). 시뮬레이션 레벨 백테스트에서, 틱어 데이터는 K-라인 데이터를 기반으로 시뮬레이션되고 생성된다. 이 K-라인 데이터는 하층 K-라인이다. 시뮬레이션 레벨 백테스트의 실제 동작에서, 전략이 실행될 때 API를 호출하는 기간보다 하층 K-라인의 기간이 작아야 한다. 그렇지 않으면 하층 K-라인의 큰 기간과 생성된 틱어 수가 충분하지 않기 때문에, API가 지정된 기간의 K-선을 얻기 위해 호출될 때, 데이터는 왜곡될 것이다. 하층 K-라인을 백테스트로 사용하는 경우, 하층 K-라인 기간을 적절히 더 크게 설정할 수 있다.
하층 K-라인 시뮬레이션 틱을 생성하는 메커니즘은 MT4와 동일합니다.관련 링크
하층 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
}
따라서 시뮬레이션 레벨 백테스트가 실행될 때 시간대에서 가격 이동이 있을 것입니다.