Le programme de backtest de la plate-forme FMZ est un processus de contrôle complet, et le programme polling non-stop selon une certaine fréquence.onTick
niveau, et non leonBar
Un meilleur appui pour le backtest des stratégies basées sur lesTicker
données (stratégies ayant une fréquence de fonctionnement plus élevée).
Le backtest de niveau de simulation est basé sur les données inférieures de la ligne K du système de backtest, et selon un certain algorithme, l'interpolation des données ticker est simulée dans le cadre des valeurs des prix d'ouverture, de clôture et de clôture les plus élevés, les plus bas de la barre inférieure de la ligne K donnée dans ceBar
séries chronologiques.
Le backtest au niveau du marché réel est les données du niveau réel des tickersBar
Pour les stratégies basées sur des données de niveau ticker, l'utilisation de backtest au niveau du marché réel est plus proche de la réalité.
Il n'existe pas d'option de ligne K inférieure pour le backtest du marché réel (parce que les données ticker sont réelles, aucune ligne K inférieure n'est nécessaire pour simuler la génération).
Dans le backtest au niveau de la simulation, les données généréesticker
La période de la ligne K inférieure doit être inférieure à la période d'appel de l'API pour obtenir la ligne K lorsque la stratégie est en cours d'exécution. Sinon, en raison du grand cycle de la ligne K inférieure et du nombre insuffisant de tickers générés, les données seront déformées lors de l'appel de l'API pour obtenir la ligne K de la période spécifiée. Lorsque vous utilisez le backtest de la ligne K inférieure à grande période, vous pouvez augmenter de manière appropriée le cycle de la ligne K inférieure.
Le mécanisme de génération de tickers simulés sur la ligne K inférieure est le même que le célèbre logiciel de trading MetaTrader 4
Algoritme spécifique pour simuler les données de tick à partir des données inférieures de la ligne 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
}
Par conséquent, lors de l'utilisation du backtest de niveau de simulation, il y aura des sauts de prix dans la série temporelle.