Un backtest Python are nevoie de un traseu verificabil: date, informația disponibilă atunci, ordine, execuții și registru reconciliat. Păstrează identificatorii, nu numai orele. Graficul rapid al capitalului nu arată dacă semnalul a folosit publicare ulterioară, lumânare incompletă sau preț interzis de modelul execuției.

Alege mediul după întrebarea de cercetare

Strategy Tester din MT5 acceptă Expert Advisors cu mai multe instrumente, testare și optimizare. Python organizează date și calcule proprii, fără să fie evadare obligatorie dintr-o limită de o pereche. Compară cerințele datelor, contractului și execuției. Pentru diferențe între implementări, folosește același set înghețat și aceleași reguli.

Salvează datele și sensul lor

Notează instrumentul și produsul, furnizorul, fusul, partea cotației, intervalul și perioada descărcată. Verifică ID-urile duplicate, ordinea și lipsurile. Închiderea pieței nu înseamnă automat fișier corupt; completarea golului poate inventa observații. Păstrează fișierul original și pașii transformării.

copy_rates_range din MetaTrader5 întoarce timp, OHLC, tick volume, spread și real volume, fără tarif istoric complet de comision și finanțare. Barele depind de istoricul și setările terminalului: perioada cerută nu dovedește primirea integrală. Argumentele de timp și datele întoarse folosesc UTC. Creează ore explicite înaintea conversiei sesiunilor.

pandas și NumPy susțin calculele. Backtrader organizează evenimentele; simularea portofoliului vectorbt actualizează numerarul și activele prin moduri pentru ordine, semnale sau funcție proprie. Eticheta nu garantează execuție realistă ori durată fixă. Alege bibliotecile necesare, salvează versiunile și verifică licența, drepturile datelor și mediul acceptat. Datele și implementarea pot avea costuri separate.

Eliminarea indexului poate atașa semnalul altei lumânări

Modelul are trei înregistrări de preț încheiate, fictive: A=100, B=102, C=104. Seria separată de marcaje este ordonată C:1, A:0, B:0. Marcajul 1 identifică numai un candidat pentru modelarea ulterioară, fără ordin sau preț de execuție.

Eticheta și poziția pot selecta alte rânduri

Eticheta și poziția pot selecta alte rânduriPrețurile A 100, B 102, C 104 sunt ordonate A,B,C. Marcajele C,A,B sunt 1,0,0. Alinierea după etichetă selectează C 104; înmulțirea pozițională fără ID selectează primul rând, A 100.Prețuri după IDOrdine marcajeA 100C 1B 102A 0C 104B 0Series: ID C → 104Fără ID: primul rând → 100Aceleași date selectează alte rânduri.
Conexiunea verde păstrează ID-ul C. Prima poziție a unui tablou fără index nu are același sens. Sunt prețuri arbitrare, fără costuri sau rezultat financiar.

Pe un ecran mic, derulează diagrama orizontal sau mărește-o. Explicația este disponibilă și în text.

pandas aliniază Series după etichetă. prices * flags produce A:0, B:0, C:104. Conversia ambelor în tablouri și înmulțirea pe poziție produce 100,0,0; atribuirea către A,B,C face din A candidatul. Înainte de to_numpy(), verifică ID-urile, nu numai lungimea. Alinierea corectă nu verifică singură momentul disponibilității semnalului.

Definește când devine utilizabilă înregistrarea

Lumânarea H1 etichetată cu deschiderea 10:00 nu are încă OHLC complet la 10:00. În pandas resampling, closed stabilește apartenența la interval, iar label eticheta marginii. Schimbarea etichetei nu schimbă ora disponibilității agregatului.

Asociază datele macro după publicarea versiunii disponibile, fără simpla lună descrisă. merge_asof cere chei sortate; backward selectează cheia anterioară sau egală, nearest o poate selecta pe cea ulterioară. Niciuna nu știe automat despre revizuiri. Definește toleranța și ordinea evenimentelor cu aceeași oră.

Test fictiv: decizia este la 10:04 UTC; publicările salvate sunt 10:00 cu valoare 50 și 10:05 cu valoare 60. Fără toleranță restrictivă, backward alege 50, cu patru minute înainte. Nearest alege 60, mai aproape la un minut, dar în viitor. Cu toleranță backward inclusivă de două minute, nu există potrivire. Păstrează lipsa; valoarea viitoare ar modifica informația disponibilă.

Altă rețetă folosește numai lumânări încheiate: primele douăzeci au High de la 100 la 119, fiecare Open=High−0,5, Low=High−2 și Close=High−1. Lumânarea 21 are O120/H121/L118/C120,5; 22 are O120,6/H122/L119/C121. Prețurile sunt arbitrare, fără date de piață ori tranzacție FX.

previous_high = bars["high"].shift(1).rolling(20).max()
signal = bars["close"] > previous_high
next_bar_signal = signal.shift(1, fill_value=False)

La lumânarea 21, maximul celor douăzeci anterioare este 119: 120,5>119 este adevărat. Includerea High curent dă prag 121 și condiție falsă. Ultima linie mută semnalul observat în lumânarea 22; nu furnizează execuție, acceptarea ordinului sau ieșire. Păstrează doar intrări complete și definește separat volumul, ordinul și ordinea evenimentelor.

Model RON: ora observației nu este ora publicării

În modelul fictiv din 12 octombrie 2026, decizia de conversie informativă este la 10:04 UTC, adică 13:04 Europe/Bucharest. O rată USD/RON de 4,4 descrie observația 09:55 și devine disponibilă la 10:03. Altă rată, 4,5, descrie observația 10:00, dar se publică numai la 10:06. Sunt date inventate didactic, fără curs BNR, ofertă broker sau conversie fiscală.

Chiar și backward după ora observației selectează 4,5, deși încă nu este disponibilă. Filtrul corect al disponibilității permite 4,4. Pentru un rezultat de 10 USD deja cunoscut la decizie și cost separat 2 RON, raportul informativ este 10×4,4−2=42 RON. Folosirea informației viitoare dă 43 RON. Diferența de 1 RON nu este avantaj economic: provine din alt set de informații. Salvează ambele ore și versiunea fiecărei observații.

USD/RON: compară cele două ore ale înregistrăriiModel fictiv 12 octombrie 2026, decizie 10:04 UTC / 13:04 Europe/Bucharest. Rezultat cunoscut 10 USD, cost separat 2 RON; fără curs oficial ori execuție de schimb.CALCUL IPOTETICObservație 09:55, disponibilă10:034,4 RON/USDObservație 10:00, disponibilă10:064,5 RON/USDDiferență artificială1 RON
USD/RON: compară cele două ore ale înregistrării. Model fictiv 12 octombrie 2026, decizie 10:04 UTC / 13:04 Europe/Bucharest. Rezultat cunoscut 10 USD, cost separat 2 RON; fără curs oficial ori execuție de schimb.

Backward pe ora observației poate include tot informație viitoare. Verifică ora disponibilității înaintea asocierii și păstrează versiunea.

Pe un ecran mic poți derula diagrama orizontal sau o poți mări. Valorile și concluzia apar și în textul de mai jos.

Observație 09:55, disponibilă 10:03
4,4 RON/USD – Admisă la 10:04; raport informativ 42 RON.
Observație 10:00, disponibilă 10:06
4,5 RON/USD – Indisponibilă la decizie; calculul 43 RON introduce viitorul.
Diferență artificială
1 RON – Nu provine dintr-o tranzacție suplimentară sau avantaj măsurat.

Separă semnalul, execuția și costul

În modelul standard documentat Backtrader, ordinul Market emis după procesarea lumânării curente folosește Open al următoarei disponibile. Alte setări pot schimba momentul. Dacă stopul și ținta sunt în aceeași lumânare, OHLC singur nu arată ordinea atingerilor.

Model separat cu o singură tranzacție: cumperi 10.000 EUR la Ask EUR/USD 1,1002, cu Bid simultan 1,1000; ulterior vinzi totul la Bid 1,1012, cu Ask 1,1014. Pipul este 0,0001 USD/EUR. Diferența execuțiilor este zece pips, adică 10 USD. Comision 1 USD pe fiecare parte lasă 8 USD net; finanțare și slippage suplimentar zero. Deducerea încă o dată a spreadului inițial de doi pips ar raporta 6 USD, dublând costul deja reflectat în prețurile execuțiilor.

Precizează finanțarea, conversiile, contractul, marja și respingerea ordinelor pentru produs. La mai multe instrumente, modelează numerarul comun, marja disponibilă și ordinea cererilor simultane. Suma curbelor independente poate include ordine nefinanțabile împreună. Slippage aleator cere distribuție, seed și versiune de bibliotecă declarate.

Registrul face afirmația verificabilă

Model cu R monetar constant: exact patruzeci de câștiguri la +2R și șaizeci de pierderi la −1R dau 80R câștiguri, 60R pierderi, total 20R, PF=80/60≈1,33 și medie 0,2R. Costul 0,1R pe fiecare lasă patruzeci de +1,9R și șaizeci de −1,1R: câștiguri 76R, pierderi 66R, total 10R, PF≈1,15, medie 0,1R. Este aritmetică, fără backtest real.

Alt contraexemplu: condițiile pe cinci lumânări sunt adevărat, adevărat, adevărat, fals, adevărat. Ambele politici intră la 1; stopul închide la 2 înaintea evaluării intrării și nu există ieșiri ulterioare. Politica „fără poziție și condiție adevărată” reintră la 2 și rămâne deschisă. Politica ce cere un fals pentru rearmare așteaptă la 2 și 3, se rearmează la 4 și intră la 5. Numără ambele două intrări, la alte momente. Este mașină de stări aleasă explicit, fără regulă implicită atribuită bibliotecilor.

Păstrează capitalul curent cu pozițiile deschise și rezultatele închise separat. Include capitalul inițial în drawdown și separă depunerile și retragerile de randamente. Nu adăuga randament, Sharpe sau drawdown care nu se poate reproduce din registrul datat și traseul relevant.

Separă selecția de rezultatele pe date rezervate

Fixează ferestrele cronologice de antrenare și test înaintea alegerii regulilor. Salvează fiecare instrument, parametru, filtru și împărțire încercate, inclusiv variantele respinse. Puțini parametri nu înseamnă puține ipoteze. Bailey și coautorii studiază selecția repetată și supraoptimizarea; modelele de aici nu estimează PBO.

Alt eșantion inventat: 75 câștiguri de +0,2R și 25 pierderi de −1R au rată de succes 75%, dar pierd 10R înaintea costurilor: câștiguri 15R, pierderi 25R, PF=0,6. Verifică observațiile, dependența, execuția, costurile și sensibilitatea parametrilor; pragul ratei sau PF nu diagnostichează singur eroarea.

Ce construiești în următoarea etapă?

  1. Creează proiect izolat și păstrează datele originale cu ID, sursă, UTC, partea cotației și versiuni. Exercițiul offline nu cere acreditări live sau ordine.
  2. Parcurge câteva înregistrări specificate complet. Notează disponibilitatea semnalului, următorul eveniment permis pentru execuție și tratamentul lipsurilor ori revizuirilor.
  3. Definește repetarea condiției: adaugă, inversează, reintră după stop sau așteaptă rearmare? Verifică ID-urile intrărilor.
  4. Reconciliază costul și fiecare execuție, apoi derivează rezultatele. Compară aceleași reguli înghețate sub ipoteze alternative declarate ale execuției.
  5. Păstrează încercările, ferestrele rezervate și limitările. Compară perioade similare și incertitudinea; o scădere fixă a performanței nu identifică singură cauza.