El programa de backtest de la plataforma FMZ es un proceso de control completo, y el programa está realizando encuestas sin parar de acuerdo con una cierta frecuencia.onTick
el nivel, no elonBar
El desarrollo de un sistema de evaluación de la calidad de los sistemas de evaluación de la calidad de los sistemas de evaluaciónTicker
datos (estrategias con mayor frecuencia de operación).
El nivel de simulación backtest se basa en los datos de la línea K inferior del sistema de backtest, y de acuerdo con un cierto algoritmo, la interpolación de los datos ticker se simula en el marco de los valores de los precios más altos, más bajos, de apertura y cierre de la dada K-línea inferior Bar en esteBar
serie temporal.
El backtest del nivel real del mercado es el dato del nivel real de ticker enBar
Para las estrategias basadas en datos a nivel de ticker, el uso de backtest a nivel de mercado real es más cercano a la realidad.
No existe una opción de línea K inferior para la prueba de retroceso del mercado real (dado que los datos del ticker son reales, no se necesita una línea K inferior para simular la generación).
En el backtest de nivel de simulación, elticker
En el uso real de la prueba de retroceso de nivel de simulación, el período de la línea K inferior debe ser menor que el período de llamada de la API para obtener la línea K cuando se ejecuta la estrategia. De lo contrario, debido al gran ciclo de la línea K inferior y al número insuficiente de tickers generados, los datos se distorsionarán al llamar a la API para obtener la línea K del período especificado. Al usar la prueba de retroceso de la línea K de gran período, puede aumentar adecuadamente el ciclo de línea K inferior.
El mecanismo para generar tickers simulados en la línea K inferior es el mismo que el famoso software de trading MetaTrader 4
Algoritmo específico para simular los datos de tick a partir de los datos de la línea K inferior:
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
}
Por lo tanto, cuando se utiliza el backtest de nivel de simulación, habrá saltos de precios en las series temporales.