ui changes and cs prices
All checks were successful
Test and deploy staging / staging (push) Successful in 11m52s

This commit is contained in:
2026-09-25 00:44:06 +00:00
parent c757d0882a
commit abac077541
200 changed files with 6236 additions and 2311 deletions

View File

@@ -44,14 +44,105 @@ export const race = {
const t = (m: number, s: number) => m * 60 + s;
export const horses: Horse[] = [
{ n: 1, name: 'Rihane', driver: 'Micha Brouwer', trainer: 'Danny Brouwer', sex: 'M', form: [2, 3, 9, 7, 4], record: t(1, 13.7), trial: { heat: 2, pos: 2, time: t(1, 17.7), odds: 3.0 } },
{ n: 2, name: 'Rose Starlake', driver: 'Jeffrey Mieras', trainer: 'Dion Tesselaar', sex: 'M', form: [1, 2, 2, 1, 'D'], record: t(1, 13.4), trial: { heat: 2, pos: 1, time: t(1, 17.3), odds: 3.5 } },
{ n: 3, name: 'Rising Sun Boko', driver: 'Danny Brouwer', trainer: 'Danny Brouwer', sex: 'H', form: [2, 3, 1, 4, 1], record: t(1, 14.2), trial: { heat: 1, pos: 2, time: t(1, 13.8), odds: 23.1 } },
{ n: 4, name: 'Roy Schermer', driver: 'Robin Bakker', trainer: 'Paul Hagoort', sex: 'R', form: [3, 2, 'D', 2, 1], record: t(1, 11.8), trial: { heat: 1, pos: 3, time: t(1, 14.5), odds: 7.8 } },
{ n: 5, name: 'Rolleman Flevo', driver: 'Dion Tesselaar', trainer: 'Dion Tesselaar', sex: 'H', form: [1, 1, 1, 1, 1], record: null, trial: { heat: 1, pos: 1, time: t(1, 13.8), odds: 1.3 }, note: '13 uit 13' },
{ n: 6, name: 'Royal Express', driver: 'Jim Veldman', trainer: 'Paul Hagoort', sex: 'M', form: [3, 1, 6, 1, 3], record: t(1, 12.4), trial: { heat: 2, pos: 3, time: t(1, 17.8), odds: 1.8 } },
{ n: 7, name: 'Ram Jam', driver: 'Michel Rothengatter', trainer: 'Michel Rothengatter', sex: 'R', form: [4, 1, 6, 1, 1], record: t(1, 11.5), trial: { heat: 1, pos: 4, time: t(1, 14.6), odds: 8.8 } },
{ n: 8, name: 'Rex Beuckenswijk', driver: 'Jaap van Rijn', trainer: 'Jeroen Engwerda', sex: 'R', form: [6, 4, 2, 1, 1], record: null, trial: { heat: 1, pos: 6, time: t(1, 15.2), odds: 34.9 } },
{ n: 9, name: 'Ragna L Kite', driver: 'Rob de Vlieger', trainer: 'Rob de Vlieger', sex: 'M', form: [4, 2, 3, 1, 3], record: t(1, 14.8), trial: { heat: 2, pos: 4, time: t(1, 17.8), odds: 6.8 } },
{ n: 10, name: 'Ritchy Diamond', driver: 'Patrick de Haan', trainer: 'Michel Rothengatter', sex: 'R', form: [5, 3, 1, 'D', 2], record: null, trial: { heat: 1, pos: 5, time: t(1, 14.7), odds: 20.9 } }
{
n: 1,
name: 'Rihane',
driver: 'Micha Brouwer',
trainer: 'Danny Brouwer',
sex: 'M',
form: [2, 3, 9, 7, 4],
record: t(1, 13.7),
trial: { heat: 2, pos: 2, time: t(1, 17.7), odds: 3.0 }
},
{
n: 2,
name: 'Rose Starlake',
driver: 'Jeffrey Mieras',
trainer: 'Dion Tesselaar',
sex: 'M',
form: [1, 2, 2, 1, 'D'],
record: t(1, 13.4),
trial: { heat: 2, pos: 1, time: t(1, 17.3), odds: 3.5 }
},
{
n: 3,
name: 'Rising Sun Boko',
driver: 'Danny Brouwer',
trainer: 'Danny Brouwer',
sex: 'H',
form: [2, 3, 1, 4, 1],
record: t(1, 14.2),
trial: { heat: 1, pos: 2, time: t(1, 13.8), odds: 23.1 }
},
{
n: 4,
name: 'Roy Schermer',
driver: 'Robin Bakker',
trainer: 'Paul Hagoort',
sex: 'R',
form: [3, 2, 'D', 2, 1],
record: t(1, 11.8),
trial: { heat: 1, pos: 3, time: t(1, 14.5), odds: 7.8 }
},
{
n: 5,
name: 'Rolleman Flevo',
driver: 'Dion Tesselaar',
trainer: 'Dion Tesselaar',
sex: 'H',
form: [1, 1, 1, 1, 1],
record: null,
trial: { heat: 1, pos: 1, time: t(1, 13.8), odds: 1.3 },
note: '13 uit 13'
},
{
n: 6,
name: 'Royal Express',
driver: 'Jim Veldman',
trainer: 'Paul Hagoort',
sex: 'M',
form: [3, 1, 6, 1, 3],
record: t(1, 12.4),
trial: { heat: 2, pos: 3, time: t(1, 17.8), odds: 1.8 }
},
{
n: 7,
name: 'Ram Jam',
driver: 'Michel Rothengatter',
trainer: 'Michel Rothengatter',
sex: 'R',
form: [4, 1, 6, 1, 1],
record: t(1, 11.5),
trial: { heat: 1, pos: 4, time: t(1, 14.6), odds: 8.8 }
},
{
n: 8,
name: 'Rex Beuckenswijk',
driver: 'Jaap van Rijn',
trainer: 'Jeroen Engwerda',
sex: 'R',
form: [6, 4, 2, 1, 1],
record: null,
trial: { heat: 1, pos: 6, time: t(1, 15.2), odds: 34.9 }
},
{
n: 9,
name: 'Ragna L Kite',
driver: 'Rob de Vlieger',
trainer: 'Rob de Vlieger',
sex: 'M',
form: [4, 2, 3, 1, 3],
record: t(1, 14.8),
trial: { heat: 2, pos: 4, time: t(1, 17.8), odds: 6.8 }
},
{
n: 10,
name: 'Ritchy Diamond',
driver: 'Patrick de Haan',
trainer: 'Michel Rothengatter',
sex: 'R',
form: [5, 3, 1, 'D', 2],
record: null,
trial: { heat: 1, pos: 5, time: t(1, 14.7), odds: 20.9 }
}
];

View File

@@ -43,7 +43,14 @@ export const gPresets: Record<string, Partial<GWeights>> = {
};
const SCALE = 0.55;
const POSITION_POINTS: Record<number, number> = { 1: 1, 2: 0.75, 3: 0.6, 4: 0.45, 5: 0.35, 6: 0.25 };
const POSITION_POINTS: Record<number, number> = {
1: 1,
2: 0.75,
3: 0.6,
4: 0.45,
5: 0.35,
6: 0.25
};
const positionPoints = (r: Result) => (r === 'D' ? 0 : (POSITION_POINTS[r] ?? 0.1));
const DRAW_SCORE = [0, 0.6, 0.7, 0.6, 0.45, 0.4, 0.25, 0.1, 0, -0.2, -0.3];
@@ -62,7 +69,10 @@ const mean = (xs: number[]) => xs.reduce((a, b) => a + b, 0) / xs.length;
function rawForm(h: Runner, w: GWeights): number | null {
if (h.form.length === 0) return null;
const decay = h.form.map((_, i) => Math.pow(0.5, i / w.halfLife));
return h.form.reduce((s: number, r, i) => s + decay[i] * positionPoints(r), 0) / decay.reduce((a, b) => a + b, 0);
return (
h.form.reduce((s: number, r, i) => s + decay[i] * positionPoints(r), 0) /
decay.reduce((a, b) => a + b, 0)
);
}
export function gFeatures(runners: Runner[], w: GWeights): GFeatures[] {
@@ -89,7 +99,14 @@ export function gFeatures(runners: Runner[], w: GWeights): GFeatures[] {
// debutanten: geen bewijs dat ze in de draf blijven
const base = h.form.length === 0 ? 0.12 : 0.03;
const pFail = Math.min(0.5, base + 0.1 * disq + 0.03 * poor);
return { form: pick('form'), speed: pick('speed'), level: pick('level'), draw: DRAW_SCORE[h.n] ?? 0, pFail, estimated };
return {
form: pick('form'),
speed: pick('speed'),
level: pick('level'),
draw: DRAW_SCORE[h.n] ?? 0,
pFail,
estimated
};
});
}
@@ -117,9 +134,19 @@ export type GPrediction = {
export function gPredict(runners: Runner[], w: GWeights): GPrediction[] {
if (runners.length === 0) return [];
const feats = gFeatures(runners, w);
const z = Object.fromEntries(gFeatureKeys.map((k) => [k, zscores(feats.map((f) => f[k]), SD_FLOOR[k])])) as Record<GFeatureKey, number[]>;
const z = Object.fromEntries(
gFeatureKeys.map((k) => [
k,
zscores(
feats.map((f) => f[k]),
SD_FLOOR[k]
)
])
) as Record<GFeatureKey, number[]>;
const rows = runners.map((horse, i) => {
const contributions = Object.fromEntries(gFeatureKeys.map((k) => [k, w[k] * z[k][i] * SCALE])) as Record<GFeatureKey, number>;
const contributions = Object.fromEntries(
gFeatureKeys.map((k) => [k, w[k] * z[k][i] * SCALE])
) as Record<GFeatureKey, number>;
const riskPenalty = w.risk * Math.log(1 - feats[i].pFail);
const logit = Object.values(contributions).reduce((a, b) => a + b, 0) + riskPenalty;
return { horse, features: feats[i], contributions, riskPenalty, logit, p: 0 };

View File

@@ -11,7 +11,10 @@ describe('derby model', () => {
});
it('renormalises after scratching', () => {
const preds = predict(horses.filter((h) => h.n !== 5), defaultWeights);
const preds = predict(
horses.filter((h) => h.n !== 5),
defaultWeights
);
expect(preds.reduce((a, r) => a + r.p, 0)).toBeCloseTo(1, 9);
expect(preds.find((r) => r.horse.n === 5)).toBeUndefined();
});

View File

@@ -43,7 +43,14 @@ export type FeatureKey = (typeof featureKeys)[number];
/** logit-schaal: z-scores × gewichten worden hiermee vermenigvuldigd */
const SCALE = 0.55;
const POSITION_POINTS: Record<number, number> = { 1: 1, 2: 0.75, 3: 0.6, 4: 0.45, 5: 0.35, 6: 0.25 };
const POSITION_POINTS: Record<number, number> = {
1: 1,
2: 0.75,
3: 0.6,
4: 0.45,
5: 0.35,
6: 0.25
};
const positionPoints = (r: Result) => (r === 'D' ? 0 : (POSITION_POINTS[r] ?? 0.1));
/** binnenste startnummers zijn goud, 9 en 10 staan in de tweede rij */
@@ -65,7 +72,9 @@ export function features(h: Horse, all: Horse[], w: Weights): Features {
h.form.reduce((sum: number, r, i) => sum + decay[i] * positionPoints(r), 0) /
decay.reduce((a, b) => a + b, 0);
const heatWinner = Math.min(...all.filter((o) => o.trial.heat === h.trial.heat).map((o) => o.trial.time));
const heatWinner = Math.min(
...all.filter((o) => o.trial.heat === h.trial.heat).map((o) => o.trial.time)
);
const trial = -(h.trial.time - heatWinner) - (h.trial.heat === 2 ? w.heatGap : 0);
const known = all.filter((o) => o.record !== null).map((o) => o.record as number);
@@ -76,7 +85,15 @@ export function features(h: Horse, all: Horse[], w: Weights): Features {
const poor = h.form.filter((r) => r !== 'D' && r >= 7).length;
const pFail = Math.min(0.5, 0.03 + 0.1 * disq + 0.03 * poor);
return { form, trial, record, draw: DRAW_SCORE[h.n], market: -Math.log(h.trial.odds), pFail, recordEstimated };
return {
form,
trial,
record,
draw: DRAW_SCORE[h.n],
market: -Math.log(h.trial.odds),
pFail,
recordEstimated
};
}
function zscores(values: number[]): number[] {
@@ -98,7 +115,9 @@ export type Prediction = {
export function predict(runners: Horse[], w: Weights): Prediction[] {
if (runners.length === 0) return [];
const feats = runners.map((h) => features(h, runners, w));
const z = Object.fromEntries(featureKeys.map((k) => [k, zscores(feats.map((f) => f[k]))])) as Record<FeatureKey, number[]>;
const z = Object.fromEntries(
featureKeys.map((k) => [k, zscores(feats.map((f) => f[k]))])
) as Record<FeatureKey, number[]>;
const rows = runners.map((horse, i) => {
const contributions = Object.fromEntries(

View File

@@ -16,7 +16,8 @@ export const scenarios: Scenario[] = [
{
key: 'overladen',
title: 'De favoriet wordt overladen',
story: 'Iedereen op de baan zet op Rolleman Flevo. Zijn notering zakt naar 1,20 en de rest wordt duur.',
story:
'Iedereen op de baan zet op Rolleman Flevo. Zijn notering zakt naar 1,20 en de rest wordt duur.',
lesson:
'Rolleman winnend is rood: bij 1,20 moet hij meer dan 83% van de tijd winnen om quitte te spelen, en zo zeker is zelfs een ongeslagen paard niet. De waarde zit bij plaatsweddenschappen op paarden die de toto vergeet.',
scratched: [],
@@ -26,7 +27,8 @@ export const scenarios: Scenario[] = [
{
key: 'eens',
title: 'De toto is het eens met het model',
story: 'De noteringen liggen precies in lijn met de kansen van het model, met de gebruikelijke marge van 20% erop.',
story:
'De noteringen liggen precies in lijn met de kansen van het model, met de gebruikelijke marge van 20% erop.',
lesson:
'Alles is rood. Als de kansen kloppen, wint de marge van de toto altijd. Niet wedden is dan de juiste zet — en dat is een prima uitkomst van een middag kijken.',
scratched: []
@@ -34,7 +36,8 @@ export const scenarios: Scenario[] = [
{
key: 'nietstarter',
title: 'Rolleman Flevo start niet',
story: 'Vlak voor de start wordt nummer 5 teruggetrokken. De toto moet zich in een paar minuten herstellen.',
story:
'Vlak voor de start wordt nummer 5 teruggetrokken. De toto moet zich in een paar minuten herstellen.',
lesson:
'Zonder de favoriet worden de kansen herverdeeld en worden Rising Sun Boko en Rose Starlake de favorieten. Vink een niet-starter altijd meteen uit, anders klopt geen enkel getal meer.',
scratched: [5],

View File

@@ -43,7 +43,8 @@ export type Race = {
};
const t = (m: number, s: number) => m * 60 + s;
const ze = (c: number, slug: string) => `https://www.zeturf.be/nl/course-du-jour/2026-09-20/R14C${c}-duindigt-${slug}`;
const ze = (c: number, slug: string) =>
`https://www.zeturf.be/nl/course-du-jour/2026-09-20/R14C${c}-duindigt-${slug}`;
export const races: Race[] = [
{
@@ -61,14 +62,92 @@ export const races: Race[] = [
preview:
'Tex D.A. (3) kan mogelijk op herhaling op deze baan waar hij op 26 juli sterk won voor tweede Ektor D.A. (6) en met als vierde Orszana JR (5). Maar de ruin treft in El Zarka D.A. (1) en Farida P (2) twee sterke tegenstanders. Beide bleven weliswaar op iets meer dan 8 lengte op deze baan ongeplaatst, maar dat was tegen de top van Europa. Princess T (4) versloeg Tex D.A. met een neusje verschil op de grasbaan van Joure, dus ook deze merrie moeten we serieus nemen. Een koers waarin veel mogelijk is.',
tips: [3, 1, 2, 6],
sources: [{ label: 'ZEturf koerskaart', href: ze(3, 'hh-sheikh-mansour-bin-zayed-al-nahyan-prijs') }],
sources: [
{ label: 'ZEturf koerskaart', href: ze(3, 'hh-sheikh-mansour-bin-zayed-al-nahyan-prijs') }
],
runners: [
{ n: 1, name: 'El Zarka D.A.', driver: 'Jurico Bogaerts', trainer: 'Johan Verstrepen', sex: 'R', age: 12, form: [7, 9, 5, 5, 3], times: [], purses: [250000, 100000, 26400, 92764, 6000], record: null, kg: 64, note: 'loopt tegen de Europese top' },
{ n: 2, name: 'Farida P', driver: 'Anne Engels', trainer: 'Peter Deckers', sex: 'M', age: 7, form: ['D', 10, 3, 3, 1], times: [], purses: [250000, 100000, 26400, 92764, 6000], record: null, kg: 62, note: 'D = gevallen in Waregem' },
{ n: 3, name: 'Tex D.A.', driver: 'Luca van Toor', trainer: 'Bianca Dunk', sex: 'R', age: 9, form: [10, 1, 2, 2, 2], times: [], purses: [250000, 5000, 4000, 6000, 6000], record: null, kg: 61, note: 'won 26 juli op Duindigt' },
{ n: 4, name: 'Princess T', driver: 'Mirko Sanna', trainer: 'Gerard Zoetelief', sex: 'M', age: 6, form: [1, 4, 3, 5, 4], times: [], purses: [4000, 6000, 4000, 6000, 6000], record: null, kg: 57, note: 'versloeg Tex D.A. in Joure' },
{ n: 5, name: 'Orszana JR', driver: 'Josephine Bruning', trainer: "Manouk van 't Slot", sex: 'M', age: 8, form: [4, 4, 4, 7], times: [], purses: [5000, 4000, 4200, 5100], record: null, kg: 56 },
{ n: 6, name: 'Ektor D.A.', driver: 'Siem Bos', trainer: 'Johan Verstrepen', sex: 'H', age: 4, form: [3, 2, 5, 3, 7], times: [], purses: [6000, 5000, 6000, 6000, 7000], record: null, kg: 55 }
{
n: 1,
name: 'El Zarka D.A.',
driver: 'Jurico Bogaerts',
trainer: 'Johan Verstrepen',
sex: 'R',
age: 12,
form: [7, 9, 5, 5, 3],
times: [],
purses: [250000, 100000, 26400, 92764, 6000],
record: null,
kg: 64,
note: 'loopt tegen de Europese top'
},
{
n: 2,
name: 'Farida P',
driver: 'Anne Engels',
trainer: 'Peter Deckers',
sex: 'M',
age: 7,
form: ['D', 10, 3, 3, 1],
times: [],
purses: [250000, 100000, 26400, 92764, 6000],
record: null,
kg: 62,
note: 'D = gevallen in Waregem'
},
{
n: 3,
name: 'Tex D.A.',
driver: 'Luca van Toor',
trainer: 'Bianca Dunk',
sex: 'R',
age: 9,
form: [10, 1, 2, 2, 2],
times: [],
purses: [250000, 5000, 4000, 6000, 6000],
record: null,
kg: 61,
note: 'won 26 juli op Duindigt'
},
{
n: 4,
name: 'Princess T',
driver: 'Mirko Sanna',
trainer: 'Gerard Zoetelief',
sex: 'M',
age: 6,
form: [1, 4, 3, 5, 4],
times: [],
purses: [4000, 6000, 4000, 6000, 6000],
record: null,
kg: 57,
note: 'versloeg Tex D.A. in Joure'
},
{
n: 5,
name: 'Orszana JR',
driver: 'Josephine Bruning',
trainer: "Manouk van 't Slot",
sex: 'M',
age: 8,
form: [4, 4, 4, 7],
times: [],
purses: [5000, 4000, 4200, 5100],
record: null,
kg: 56
},
{
n: 6,
name: 'Ektor D.A.',
driver: 'Siem Bos',
trainer: 'Johan Verstrepen',
sex: 'H',
age: 4,
form: [3, 2, 5, 3, 7],
times: [],
purses: [6000, 5000, 6000, 6000, 7000],
record: null,
kg: 55
}
]
},
{
@@ -88,14 +167,107 @@ export const races: Race[] = [
tips: [4, 7, 6, 5],
sources: [{ label: 'ZEturf koerskaart', href: ze(4, 'handelsonderneming-schieweg-b-v-prijs') }],
runners: [
{ n: 1, name: 'Puck Ballaco', driver: 'Micha Brouwer', trainer: 'Rob de Vlieger', sex: 'M', age: 4, form: [4, 4, 1, 4, 3], times: [t(1, 17.9), t(1, 16.3), t(1, 16.6), t(1, 16.5), t(1, 17.8)], purses: [2750, 4000, 4000, 4400, 1100], record: t(1, 13.0) },
{ n: 2, name: 'Otini Bianco', driver: 'Rob de Vlieger', trainer: 'Rob de Vlieger', sex: 'R', age: 5, form: ['D', 6, 1, 2, 'D'], times: [t(1, 15.5), t(1, 15.9), t(1, 16.4)], purses: [2750, 4400, 2750, 2750, 2750], record: t(1, 14.7), note: 'won 31 juli op Duindigt' },
{ n: 3, name: 'Memory de Legume', driver: 'Patrick de Haan', trainer: 'Patrick de Haan', sex: 'M', age: 7, form: [6, 7, 8, 4, 4], times: [t(1, 19.7), t(1, 16.9), t(1, 15.6), t(1, 18.2), t(1, 14.1)], purses: [1600, 4400, 4400, 1500, 2200], record: t(1, 14.1) },
{ n: 4, name: "Pasion d'Oro", driver: 'Jaap van Rijn', trainer: 'Jack Mollema', sex: 'H', age: 4, form: [1, 5, 1, 1, 5], times: [t(1, 16.6), t(1, 11.6), t(1, 12.2), t(1, 21.1), t(1, 14.0)], purses: [2750, 19567, 2200, 1650, 13806], record: t(1, 11.6), note: 'liep in Zweden tegen sterkere' },
{ n: 5, name: 'Nobell Starro', driver: 'Robin Bakker', trainer: 'Fons Bakker', sex: 'R', age: 6, form: [4, 2, 1, 2, 'D'], times: [t(1, 14.0), t(1, 16.2), t(1, 11.1)], purses: [2750, 5000, 2000, 2200, 4400], record: t(1, 11.1) },
{ n: 6, name: 'Michel D', driver: 'Jim Veldman', trainer: 'Huug van Dijk', sex: 'H', age: 7, form: [3, 2, 1, 2, 1], times: [t(1, 20.2), t(1, 15.6), t(1, 14.1), t(1, 16.9), t(1, 14.9)], purses: [5000, 2750, 2000, 5500, 1500], record: t(1, 13.8), note: 'laatste tijd over 3375 m' },
{ n: 7, name: 'Louis Vuiton', driver: 'Hugo Langeweg', trainer: 'Hugo Langeweg', sex: 'R', age: 8, form: [2, 5, 4, 'D', 1], times: [t(1, 17.8), t(1, 12.1), t(1, 16.9)], purses: [2750, 11000, 2200, 1650, 2750], record: t(1, 12.1), note: 'Paradepaard 2025' },
{ n: 8, name: 'Nolana Boko', driver: 'John Dekker', trainer: 'Carel Roodenrijs', sex: 'R', age: 6, form: [1, 'D', 5, 4, 4], times: [t(1, 19.1), t(1, 20.9), t(1, 13.9), t(1, 23.0)], purses: [1600, 2750, 1100, 2000, 1210], record: t(1, 13.4), note: 'vaak op tragere banen (Alkmaar)' }
{
n: 1,
name: 'Puck Ballaco',
driver: 'Micha Brouwer',
trainer: 'Rob de Vlieger',
sex: 'M',
age: 4,
form: [4, 4, 1, 4, 3],
times: [t(1, 17.9), t(1, 16.3), t(1, 16.6), t(1, 16.5), t(1, 17.8)],
purses: [2750, 4000, 4000, 4400, 1100],
record: t(1, 13.0)
},
{
n: 2,
name: 'Otini Bianco',
driver: 'Rob de Vlieger',
trainer: 'Rob de Vlieger',
sex: 'R',
age: 5,
form: ['D', 6, 1, 2, 'D'],
times: [t(1, 15.5), t(1, 15.9), t(1, 16.4)],
purses: [2750, 4400, 2750, 2750, 2750],
record: t(1, 14.7),
note: 'won 31 juli op Duindigt'
},
{
n: 3,
name: 'Memory de Legume',
driver: 'Patrick de Haan',
trainer: 'Patrick de Haan',
sex: 'M',
age: 7,
form: [6, 7, 8, 4, 4],
times: [t(1, 19.7), t(1, 16.9), t(1, 15.6), t(1, 18.2), t(1, 14.1)],
purses: [1600, 4400, 4400, 1500, 2200],
record: t(1, 14.1)
},
{
n: 4,
name: "Pasion d'Oro",
driver: 'Jaap van Rijn',
trainer: 'Jack Mollema',
sex: 'H',
age: 4,
form: [1, 5, 1, 1, 5],
times: [t(1, 16.6), t(1, 11.6), t(1, 12.2), t(1, 21.1), t(1, 14.0)],
purses: [2750, 19567, 2200, 1650, 13806],
record: t(1, 11.6),
note: 'liep in Zweden tegen sterkere'
},
{
n: 5,
name: 'Nobell Starro',
driver: 'Robin Bakker',
trainer: 'Fons Bakker',
sex: 'R',
age: 6,
form: [4, 2, 1, 2, 'D'],
times: [t(1, 14.0), t(1, 16.2), t(1, 11.1)],
purses: [2750, 5000, 2000, 2200, 4400],
record: t(1, 11.1)
},
{
n: 6,
name: 'Michel D',
driver: 'Jim Veldman',
trainer: 'Huug van Dijk',
sex: 'H',
age: 7,
form: [3, 2, 1, 2, 1],
times: [t(1, 20.2), t(1, 15.6), t(1, 14.1), t(1, 16.9), t(1, 14.9)],
purses: [5000, 2750, 2000, 5500, 1500],
record: t(1, 13.8),
note: 'laatste tijd over 3375 m'
},
{
n: 7,
name: 'Louis Vuiton',
driver: 'Hugo Langeweg',
trainer: 'Hugo Langeweg',
sex: 'R',
age: 8,
form: [2, 5, 4, 'D', 1],
times: [t(1, 17.8), t(1, 12.1), t(1, 16.9)],
purses: [2750, 11000, 2200, 1650, 2750],
record: t(1, 12.1),
note: 'Paradepaard 2025'
},
{
n: 8,
name: 'Nolana Boko',
driver: 'John Dekker',
trainer: 'Carel Roodenrijs',
sex: 'R',
age: 6,
form: [1, 'D', 5, 4, 4],
times: [t(1, 19.1), t(1, 20.9), t(1, 13.9), t(1, 23.0)],
purses: [1600, 2750, 1100, 2000, 1210],
record: t(1, 13.4),
note: 'vaak op tragere banen (Alkmaar)'
}
]
},
{
@@ -113,14 +285,89 @@ export const races: Race[] = [
preview:
'Sisi Hazelaar (5) is op basis van haar laatste tweede plaats in Wolvega, waar ze een puike indruk maakte, kansrijk. Zo ook Seabiscuit Lobell (4), die vorige week bij haar debuut tweede werd achter Salina Meerswal; met een fijn stuk speed kan ze binnendoor plek twee veroveren. Spirit Meerswal (2) debuteerde met een derde plaats in Wolvega in 15,2 en is kanshebber nummer drie. Sophie Starlake (1) debuteert voor de stal van Dion Tesselaar, en dan zijn we sowieso gewaarschuwd.',
tips: [5, 4, 2, 1],
sources: [{ label: 'ZEturf koerskaart', href: ze(5, 'south-holland-prijs-tct-tweejarigen-satellietkoers') }],
sources: [
{
label: 'ZEturf koerskaart',
href: ze(5, 'south-holland-prijs-tct-tweejarigen-satellietkoers')
}
],
runners: [
{ n: 1, name: 'Sophie Starlake', driver: 'Dion Tesselaar', trainer: 'Dion Tesselaar', sex: 'M', age: 2, form: [], times: [], purses: [], record: null, note: 'debutant · stal Tesselaar' },
{ n: 2, name: 'Spirit Meerswal', driver: 'Jaap van Rijn', trainer: 'Jack Mollema', sex: 'H', age: 2, form: [3], times: [t(1, 15.2)], purses: [5500], record: t(1, 15.2) },
{ n: 3, name: 'Shiva Jabi', driver: 'Jan Baas', trainer: 'Jan Baas', sex: 'H', age: 2, form: ['D', 'D'], times: [], purses: [3300, 5500], record: null, note: 'twee keer uit de draf' },
{ n: 4, name: 'Seabiscuit Lobell', driver: 'Hugo Langeweg', trainer: 'Hugo Langeweg', sex: 'M', age: 2, form: [2], times: [t(1, 15.2)], purses: [3300], record: t(1, 15.2), note: '2e bij debuut, 10 september' },
{ n: 5, name: 'Sisi Hazelaar', driver: 'Jeffrey Mieras', trainer: 'Dion Tesselaar', sex: 'M', age: 2, form: [2, 'D'], times: [t(1, 15.0)], purses: [5500, 5500], record: t(1, 15.0) },
{ n: 6, name: 'Sir Bianco', driver: 'Frans van der Blonk', trainer: 'Frans van der Blonk', sex: 'R', age: 2, form: [], times: [], purses: [], record: null, note: 'debutant' }
{
n: 1,
name: 'Sophie Starlake',
driver: 'Dion Tesselaar',
trainer: 'Dion Tesselaar',
sex: 'M',
age: 2,
form: [],
times: [],
purses: [],
record: null,
note: 'debutant · stal Tesselaar'
},
{
n: 2,
name: 'Spirit Meerswal',
driver: 'Jaap van Rijn',
trainer: 'Jack Mollema',
sex: 'H',
age: 2,
form: [3],
times: [t(1, 15.2)],
purses: [5500],
record: t(1, 15.2)
},
{
n: 3,
name: 'Shiva Jabi',
driver: 'Jan Baas',
trainer: 'Jan Baas',
sex: 'H',
age: 2,
form: ['D', 'D'],
times: [],
purses: [3300, 5500],
record: null,
note: 'twee keer uit de draf'
},
{
n: 4,
name: 'Seabiscuit Lobell',
driver: 'Hugo Langeweg',
trainer: 'Hugo Langeweg',
sex: 'M',
age: 2,
form: [2],
times: [t(1, 15.2)],
purses: [3300],
record: t(1, 15.2),
note: '2e bij debuut, 10 september'
},
{
n: 5,
name: 'Sisi Hazelaar',
driver: 'Jeffrey Mieras',
trainer: 'Dion Tesselaar',
sex: 'M',
age: 2,
form: [2, 'D'],
times: [t(1, 15.0)],
purses: [5500, 5500],
record: t(1, 15.0)
},
{
n: 6,
name: 'Sir Bianco',
driver: 'Frans van der Blonk',
trainer: 'Frans van der Blonk',
sex: 'R',
age: 2,
form: [],
times: [],
purses: [],
record: null,
note: 'debutant'
}
]
}
];