Ochrona konta — poziom systemowy

8. Ochrona konta — poziom systemowy

Daily Loss Hard Limit

Jeśli dzienny P/L spadnie poniżej -(Inp_Daily_Loss_HardLimit)% bilansu:
  → g_DailyLossReached = true
  → WSZYSTKIE nowe zlecenia zablokowane do końca dnia
  → Istniejące pozycje nadal zarządzane

Domyślnie: 4% bilansu.

Drawdown Freeze

Jeśli aktualny drawdown > Inp_Drawdown_FreezeLimit%:
  → g_DrawdownFreeze = true
  → Nowe zlecenia zamrożone

Domyślnie: 0.5% (bardzo konserwatywne, idealne dla prop firm).

Daily Target Profit

Jeśli dzienny P/L > +Inp_Daily_Target_Profit%:
  → g_DailyTargetReached = true
  → Trading zatrzymany — zysk jest zabezpieczony

Domyślnie: 15% — po osiągnięciu celu system sam się wyłącza na dany dzień.

Equity Trailing Lock (Master)

Mechanizm ochrony equity działający na poziomie całego konta:

Jeśli equity wzrośnie o >= Inp_Equity_TSL_Trigger%:
  → Ustawia "equity high watermark"
  → Jeśli equity spadnie poniżej high - Inp_Equity_TSL_Buffer%:
     → Zamyka WSZYSTKIE pozycje natychmiastowo

Domyślnie: Trigger 5%, Buffer 0.2%. Chroni przed utratą dużego dziennego zysku.

Zarządzanie pozycjami — warstwy ochrony

7. Zarządzanie pozycjami — warstwy ochrony

ManagePositions() wykonuje się na KAŻDYM ticku dla każdej otwartej pozycji. Warstwy ochrony są stosowane w ściśle określonej kolejności priorytetów.

Warstwa 0: Virtual Stop Loss (najwyższy priorytet — awaryjne cięcie)

Nie jest to SL wysłany do brokera — to wewnętrzna kontrola poziomu straty:

active_cap = base_capital (zależnie od trybu)
pos_profit = zysk + swap + prowizja
max_loss = active_cap × Inp_Virtual_SL_Percent / 100

Jeśli |pos_profit| >= max_loss → natychmiastowe zamknięcie pozycji

Log: "VIRTUAL SL HIT! Position #123 loss (-45.23) exceeded 4.00% of Active Capital (1132.50). Closing immediately."

To zabezpieczenie działa jako ostatnia linia obrony przed katastroficzną stratą, niezależnie od spreadu, poślizgu czy warunków brokera.

Warstwa 0.5: Profit Lock (agresywne trailing bliskie TP)

Aktywuje się gdy cena zbliży się do TP na odległość Inp_E_PL_Trigger_Points (500 pkt):

  • Włącza agresywny trailing SL oparty o Inp_E_PL_TSL_Points (200 pkt) od aktualnej ceny
  • SL przesuwa się tylko w kierunku zysku (ratchet — nigdy wstecz)
  • Chroni wypracowany zysk tuż przed osiągnięciem TP

Log: "Position #123: PROFIT LOCK Activated!"

Warstwa 1: Physical TSL BB (Bollinger Band Trailing SL)

Dwufazowy mechanizm:

  • Faza 1: Standard Hard SL wysłany do brokera przy otwarciu
  • Faza 2: Aktywuje się gdy profit_in_points >= Inp_E_ProfitToActivateBB (1500 pkt)

Po wejściu w Fazę 2:

  • BUY: SL = MAX(BB_Lower, open_price + floor_dist) — podąża za dolnym pasmem BB (nigdy poniżej otwarcia + podłoga)
  • SELL: SL = MIN(BB_Upper, open_price - floor_dist) — podąża za górnym pasmem BB

BB TSL ma wyższy priorytet niż Hard BE — gdy Faza 2 aktywna, Hard BE jest ignorowane.

Log: "Position #123 entered Phase 2 (TSL BB)."

Warstwa 2: Hard Break-Even (klasyczny BE)

Przenosi fizyczny SL do (lub powyżej) ceny otwarcia gdy zysk osiągnie Inp_HardBE_Trigger_Points (200 pkt):

BUY: new_SL = open_price + (Inp_HardBE_Level_Points × _Point)  // np. +100 pkt
SELL: new_SL = open_price - (Inp_HardBE_Level_Points × _Point)

SL jest przesuwany tylko w kierunku zysku. Po jednorazowej aktywacji flaga is_breakeven1_set = true — Hard BE nie jest powtarzany.

Log: "Position #123: Hard Break-Even set at +100 pts."

Warstwa 3: Virtual Negative Break-Even

Innowacyjny mechanizm pozwalający pozycji „oddychać” po osiągnięciu pewnego zysku:

  1. Po osiągnięciu Inp_NegBE_Trigger_Points (5000 pkt) zysku → aktywuje się is_breakeven2_set = true
  2. Jeśli pozycja cofnie się do poziomu Inp_NegBE_Level_Points (np. -3000 pkt) → pozycja jest zamykana
  3. Działa wyłącznie gdy Hard BE NIE jest jeszcze ustawiony

Sens: pozycja osiągnęła duży zysk (5000 pkt), system „pozwala” jej wrócić do -3000 pkt zanim ją zatnie. Drastycznie zmniejsza liczbę przedwcześnie zamkniętych trendów.

Log: "Position #123: Virtual Negative BE Activated." → "Position #123: Closed by Virtual Negative BE."

Dynamic Take Profit (rozszerzanie TP przy silnym trendzie)

Gdy cena zbliży się do TP na Inp_E_PL_Trigger_Points:

  1. Sprawdza BB (z osobnym szerszym odchyleniem Inp_E_BB_TP_Deviation = 3.0)
  2. Jeśli cena przebija zewnętrzne pasmo BB (silny trend!) → TP jest przesuwany dalej o Inp_E_TP_Extension_Points (500 pkt)
  3. Można wielokrotnie rozszerzać — bez limitu liczby rozszerzeń

Log: "Position #123: Dynamic TP Extended by 500 points!"

Dynamic Channel (Box Trading) — tunel ceny

6. Dynamic Channel (Box Trading) — tunel ceny

Ogranicza strefę handlu do dynamicznie wyznaczonego korytarza cenowego.

Standardowy Box (długoterminowy)

Aktualizowany co Inp_Channel_Update_Hours godzin (domyślnie 6h):

  1. Zapamiętuje aktualną cenę BID jako base_price
  2. g_Channel_Upper = base_price + Channel_Points_Up × _Point
  3. g_Channel_Lower = base_price - Channel_Points_Down × _Point
  4. Handel dozwolony tylko gdy cena mieści się w kanale

Domyślne ustawienia: Upper +20000 pkt, Lower -5000 pkt — asymetryczny kanał zakłada większy potencjał wzrostowy.

Log: "NEW STANDARD PRICE CHANNEL: Base: 2100.50 | Upper: 2300.50 | Lower: 2050.50"

Manualny Box (Anti-Crash Protection)

Inp_ManualBox_Enable = true pozwala ręcznie ustawić granice absolutne cenami:

  • Inp_ManualBox_Upper — górna granica (cena)
  • Inp_ManualBox_Lower — dolna granica (cena)

Użycie: trader może ręcznie wyznaczyć tunel przed ważnym eventem fundamentalnym lub przy handlu w określonym reżimie rynkowym.

Priorytet kanałów (IsPriceInChannel)

1. Muzzle Box (aktywny podczas Impulse) — PRIORYTET
2. Manual Box (jeśli Inp_ManualBox_Enable=true)
3. Standard Dynamic Channel (jeśli Inp_Channel_Enable=true)

Status wyświetlany na panelu jako g_Status_Channel.

Institutional Impulse + Muzzle Mode

5. Institutional Impulse + Muzzle Mode

Jeden z kluczowych mechanizmów. Wykrywa instytucjonalne impulsy (nagłe, gwałtowne ruchy generowane przez duży kapitał) i natychmiast zmienia charakterystykę systemu.

Wykrywanie impulsu

Na każdym nowym barze na Inp_Impulse_TF (domyślnie M1):

  1. Oblicza średni zasięg i średni wolumen z ostatnich Inp_Impulse_AvgPeriod (20) świec
  2. Pobiera ATR
  3. Oblicza velocity = |current_close - prev_close| / prev_close
  4. Impuls wykryty jeśli zasięg świecy > Inp_Impulse_Min_Range_Points (50 pkt) ORAZ spełniony przynajmniej jeden z warunków:
  • velocity > Inp_Impulse_Velocity (0.5% zmiany ceny)
  • current_range > RangeMult × avg_range (2× średniej)
  • current_range > ATRMult × ATR (2× ATR)
  • current_volume > VolMult × avg_volume (1.5× średniego wolumenu)

Log: "Institutional Impulse Detected! Activating MUZZLE MODE for 15 mins."

Muzzle Mode — jak zmienia się charakterystyka systemu

Po wykryciu impulsu system wchodzi w Muzzle Mode (tryb wyciszenia):

ParametrNormalny trybPodczas Impulsu (Muzzle Mode)
Min. ciało świecy Smart DI2 pkt150 pkt
Poziom blokady CCIInp_Block_CCI_Level (350)Inp_Muzzle_CCI_Block_Level (130)
Sygnały SELLDozwoloneBlokowane jeśli Channel_Down=0
Kanał cenowyStandardowyMuzzle Box (anchor w momencie impulsu)

Kluczowe: Gdy Inp_Muzzle_Channel_Points_Down = 0, podczas impulsu system działa wyłącznie jako BUY ONLY — sprzedaż jest całkowicie blokowana. Pozwala to uchwycić trend po biciu.

Dynamiczny Muzzle Channel

W momencie wykrycia impulsu system zapamiętuje aktualną cenę BID (g_Muzzle_BasePrice). Wszystkie kolejne sygnały muszą mieścić się w:

  • Upper: base_price + Muzzle_Channel_Points_Up
  • Lower: base_price - Muzzle_Channel_Points_Down (lub -DBL_MAX gdy Down=0)

Wygaszenie Muzzle Mode

Muzzle Mode wygasa gdy spełnione są WSZYSTKIE warunki:

  1. Upłynął cooldown: (czas_teraz - czas_impulsu) > Impulse_Cooldown_Mins × 60
  2. Rynek się uspokoił: current_range ≤ 1.5 × avg_range AND current_volume ≤ 1.5 × avg_vol
  3. Ukształtował się szczyt lub dołek: poprzednia świeca wyższy high (peak) lub niższy low (trough) niż sąsiednie

Log: "Market calmed down. MUZZLE MODE deactivated."

Macro Risk Matrix — dynamiczny scoring instytucjonalny

4. Macro Risk Matrix — dynamiczny scoring instytucjonalny

To najbardziej unikalna funkcja systemu. AHS przed każdym zleceniem pyta o zdanie 19 globalnych aktywów, analizując ich kondycję przez pryzmat 5 wskaźników każdy — łącznie 95 uchwytów wskaźnikowych.

Skład Macro Risk Matrix

Tech Titans (≈60% puli):

AktywoWaga bazowa
Apple (AAPL)8%
Microsoft (MSFT)8%
Nvidia (NVDA)8%
Amazon (AMZN)5%
Meta (META)5%
Alphabet (GOOGL)5%
Tesla (TSLA)4%
Broadcom (AVGO)4%
Costco (COST)3%
Netflix (NFLX)2%
PepsiCo (PEP)2%
Cisco (CSCO)2%
T-Mobile (TMUS)2%
Adobe (ADBE)1%
AMD1%

Global Macro (≈40% puli):

AktywoWaga bazowaSpecjalna rola
Bitcoin (BTC)10%Risk-On barometr
Gold (GOLD)10%Odwrotna korelacja — Risk-Off
EURUSD10%Proxy siły dolara (DXY)
AUDJPY10%Carry trade / apetyt na ryzyko

Dynamiczne ważenie — co wyróżnia ten system

Wagi bazowe to punkt wyjścia, nie wartości stałe. Dla każdego aktywa obliczany jest multiplier na podstawie aktualnych wskaźników:

Wskaźniki dla każdego aktywa (H1):
  → MA50, MA200 (trend długoterminowy)
  → RSI(14)     (momentum/wykupienie-wyprzedanie)
  → CCI(14)     (odchylenie od średniej)
  → MFI(14)     (przepływ pieniądza)

Logika mnożnika dla BUY scoring:
  → Trend byczty (MA50 > MA200):          +0.5
  → Wyprzedanie (RSI<30 lub CCI<-100):   +0.5
  → Wykupienie (RSI>70 lub CCI>100):     -0.5
  → Pieniądz napływa (MFI>50):           +0.2

Logika mnożnika dla SELL scoring:
  → Trend niedźwiedzi (MA50 < MA200):    +0.5
  → Wykupienie (RSI>70 lub CCI>100):    +0.5
  → Wyprzedanie (RSI<30 lub CCI<-100): -0.5
  → Pieniądz odpływa (MFI<50):          +0.2

Minimalna wartość mnożnika = 0.1 (ochrona przed wagą ujemną).

Mechanizm scoringu

effective_weight = base_weight × multiplier
max_pool += effective_weight            // maksymalny możliwy wynik

// Czy aktywo potwierdza kierunek?
if BUY:  price > MA50 → align_score += effective_weight
if SELL: price < MA50 → align_score += effective_weight

// GOLD jest odwrotny (is_inverse=true):
// Bycze GOLD = Risk-Off = potwierdza SELL, nie BUY

final_alignment = (align_score / max_pool) × 100%

Blokada: Jeśli final_alignment < Inp_Macro_Min_Alignment_Percent (domyślnie 70%) → zlecenie zablokowane.

Lazy Evaluation

Macro Matrix NIE jest obliczana na każdym ticku. Jest wyzwalana wyłącznie w momencie gdy jakaś strategia wygeneruje sygnał. Dramatycznie redukuje zużycie CPU. Log: "BUY Align: 82% (Pool: 145)" / "Block BUY: Macro Score".

Jeśli żaden rynek nie jest aktywny

Gdy wszystkie aktywa są nieaktywne (brak danych, rynek zamknięty) → max_pool = 0 → filtr pomijany, trading dozwolony. System nie blokuje się sam gdy brakuje danych globalnych.

Strategie — szczegółowy opis algorytmów

3. Strategie — szczegółowy opis algorytmów

3.1 Smart DI (Directional Index)

Idea: Mierzy dominację jednego kierunku rynkowego na podstawie wskaźnika ADX, analizując różnicę między liniami DI+ i DI-.

Algorytm krok po kroku:

  1. Pobiera wartości DI+ i DI- z ADX (bufor 1 — poprzednia zamknięta świeca, by uniknąć repaintingu)
  2. Oblicza diff = |DI+ - DI-|
  3. Pobiera dane ostatniej zamkniętej świecy na Inp_Strat_TF
  4. Oblicza rozmiar ciała świecy: body = |close - open| / _Point
  5. Jeśli aktywny Impulse/Muzzle Mode: minimalne ciało świecy wzrasta z Inp_Strat_Min_Candle_Body do Inp_Muzzle_Min_Candle_Body (domyślnie 150 pkt zamiast 2 pkt) — charakterystyka strategii zmienia się podczas impulsu
  6. Sygnał BUY: DI+ > DI- AND diff > Min_DI_Diff AND DI- < Max_Opposite_DI
  7. Sygnał SELL: DI- > DI+ AND diff > Min_DI_Diff AND DI+ < Max_Opposite_DI

Log: "Smart DI BUY" / "Smart DI SELL"

Kluczowa właściwość: Parametr Inp_Strat_Max_Opposite_DI ogranicza siłę opozycji — nawet jeśli DI+ dominuje, zbyt silne DI- blokuje sygnał. Działa jako wbudowany filtr jakości trendu.

3.2 MTF Point System (Multi-TimeFrame)

Idea: Scoring zgodności trendu na 4 niezależnych timeframach przy użyciu krzyżowania EMA5/EMA7. Punktuje każdy timeframe i wymaga minimum X punktów.

Algorytm krok po kroku:

  1. Na każdym z 4 timeframów (TF1, TF2, TF3, TF4) pobiera EMA5 i EMA7
  2. BUY point: EMA5 > EMA7 na danym TF → score++
  3. SELL point: EMA5 < EMA7 na danym TF → score++
  4. Jeśli score >= Inp_MTF_Min_Score (domyślnie 3 z 4) → sygnał aktywny

Warunek sprawdzania: Co nowy bar na Inp_MTF_TF1 (najszybszy TF)

Log: "MTF BUY" / "MTF SELL"

Filozofia: System nie wymaga stuprocentowej zgodności — nawet 3 na 4 TF jest wystarczające. Daje elastyczność przy płynnych rynkach, gdzie wszystkie TF rzadko wskazują jednocześnie.

3.3 Three Consecutive Candles (3 Candles)

Idea: Wykrywa mini-trend: 3 kolejne zamknięte świece o tym samym kierunku z minimalnym ciałem.

Algorytm krok po kroku:

  1. Pobiera 3 ostatnie zamknięte świece na Inp_Filter_3Candles_TF
  2. Dla każdej świecy: body = |close - open| / _Point
  3. Jeśli ciało którejkolwiek świecy < Inp_Filter_3Candles_MinBody → sygnał fałszywy
  4. BUY: wszystkie 3 świece są wzrostowe (close > open)
  5. SELL: wszystkie 3 świece są spadkowe (close < open)

Log: "3 Candles BUY" / "3 Candles SELL"

Siła: Prosta, wizualnie intuicyjna, bardzo skuteczna jako walidator — potwierdza momentum zanim Smart DI lub MTF dadzą sygnał.

Multi-Core Strategy Engine — „kto pierwszy ten lepszy”

2. Multi-Core Strategy Engine — „kto pierwszy ten lepszy”

Jest to najważniejsza innowacja systemu. Wbrew nazwie sugerującej jedną strategię, AHS to silnik z wymiennymi rdzeniami strategii, gdzie każda strategia może jednocześnie pełnić dwie role:

RolaParametrOpis
Trigger (wyzwalacz)_As_Strategy = trueStrategia GENERUJE sygnał transakcyjny
Validator (walidator)_As_Filter = trueStrategia POTWIERDZA sygnały innych

Zasada „kto pierwszy ten lepszy” (First-Come-First-Served)

Strategie są ewaluowane sekwencyjnie w stałej kolejności:

EvaluateStrategies()
  1. Smart DI (jeśli As_Strategy=true)  → sygnał? → filtry → zlecenie → RETURN
  2. MTF Point System (jeśli As_Strategy=true) → sygnał? → filtry → zlecenie → RETURN
  3. 3 Consecutive Candles (jeśli As_Strategy=true) → sygnał? → filtry → zlecenie → RETURN

Kluczowe znaczenie: Gdy strategia nr 1 (Smart DI) wygeneruje sygnał i przejdzie przez wszystkie filtry, system natychmiast otwiera zlecenie i wychodzi z funkcji (return). Strategie 2 i 3 nie są już w tym ticku sprawdzane. Nie ma głosowania, uśredniania ani konsensusu — pierwszy ważny sygnał wygrywa.

Każda strategia sprawdzana jest tylko raz na nowy bar (na własnym timeframie), co eliminuje wielokrotne sygnały wewnątrz tej samej świecy.

Możliwe konfiguracje

  • SmartDI jako trigger, MTF+3Candles jako filtry — SmartDI daje sygnał, ale muszą go potwierdzić oba pozostałe systemy
  • Wszystko jako trigger — trzy niezależne strategie rywalizują o otwarcie zlecenia
  • MTF jako trigger, SmartDI jako filter — MTF generuje, SmartDI potwierdza
  • Dowolna kombinacja — każda strategia może być włączona/wyłączona niezależnie w obu rolach

Walidator nie weryfikuje samego siebie

Inteligentna logika: strategia X działając jako filtr NIE waliduje sygnałów własnych. Przykład: jeśli SmartDI jest wyzwalaczem, filtr SmartDI jest pomijany (nie sprawdza sam siebie) — sprawdzane są tylko filtry MTF i 3Candles.

// Walidator pomija własne źródło
if (Inp_SmartDI_As_Filter && trigger_source != "SmartDI") {
    if (!CheckSmartDI_Condition(is_buy)) return false;
}

Architektura i powiązania modułów

1. Architektura i powiązania modułów

System składa się z pięciu plików nagłówkowych dołączanych do skompilowanego pliku głównego _AHS_Main.ex5:

_AHS_Main.ex5
  ├── AHS_Inputs.mqh      → Wszystkie parametry wejściowe, enumeracje, zmienne globalne stanu
  ├── AHS_Filters.mqh     → Filtry rynkowe (The Shield): Macro Matrix, Impulse, Channel, ADX/MA, Smart DI, MTF, 3Candles
  ├── AHS_Strategy.mqh    → Multi-Core Engine: kalkulacja wielkości pozycji, wykonanie zlecenia
  ├── AHS_Management.mqh  → Zarządzanie pozycjami: TSL BB, Hard BE, Neg BE, Dynamic TP, EOD Terminator
  └── AHS_Panel.mqh       → Graficzny panel informacyjny: status, MTF dashboard, lista pozycji

Przepływ OnTick() — krok po kroku

Każdy napływający tick przez główną pętlę EA przechodzi przez ściśle określoną sekwencję:

OnTick()
  1. Sprawdzenie licencji (CLicenseManager.IsExpired)
  2. Sprawdzenie harmonogramu sesji (IsScheduleAllowed)
  3. EOD Terminator (CheckForEODClose) → awaryjne zamknięcie wszystkich pozycji
  4. Aktualizacja dziennego P/L i reset dzienny
  5. Sprawdzenie Account Protection:
       → DailyLossReached? → blokada nowych zleceń
       → DrawdownFreeze?   → blokada nowych zleceń
       → DailyTargetReached? → blokada nowych zleceń
  6. Equity Trailing Lock (master equity trailing SL)
  7. Institutional Impulse Detection (CheckInstitutionalImpulse)
  8. Dynamic Channel Update (UpdateDynamicChannel) co X godzin
  9. News Filter → blokada przed/po newsach
 10. ManageAllPositions() → zarządzanie wszystkimi otwartymi pozycjami
 11. Sprawdzenie warunku cooldown + limitu pozycji
 12. EvaluateStrategies() → Multi-Core Engine szuka sygnału
 13. Aktualizacja panelu informacyjnego

Wszystkie etapy są niezależne — zarządzanie pozycjami (krok 10) działa niezależnie od wyszukiwania sygnałów (krok 12). Oznacza to, że nawet jeśli nowe zlecenia są zablokowane, otwarte pozycje są zawsze zarządzane.

Full Technical Documentation

AHS — Adaptive Hybrid System v78.00

Full Technical Documentation

Multi-Core Strategy Engine for MetaTrader 5 (MQL5)

Project built from July 10th, 12+ hours a day, often seven days a week — through April 21st.


TABLE OF CONTENTS

  1. Architecture & Module Connections
  2. Multi-Core Strategy Engine — “First Come, First Served”
  3. Strategies — Detailed Algorithm Descriptions
  4. Macro Risk Matrix — Dynamic Institutional Scoring
  5. Institutional Impulse + Muzzle Mode — Behavior Change During Impulse
  6. Dynamic Channel (Box Trading) — Price Tunnel
  7. Position Management — Protection Layers
  8. Account Protection — System Level
  9. Manual Trade Management (Click & Forget)
  10. Trading Schedule & EOD Terminator
  11. News Filter
  12. Weekly Filter & Fibonacci (Anti-Crash)
  13. Capital Management & Position Sizing
  14. Pyramiding (Position Scaling)
  15. Information Panel
  16. License & Updates
  17. Full Input Parameter Reference

1:500

Pełna Dokumentacja Techniczna

AHS — Adaptive Hybrid System v78.00

Multi-Core Strategy Engine dla MetaTrader 5 (MQL5)

Projekt realizowany od 10 lipca, ponad 12 godzin dziennie, często przez cały tydzień — do 21 kwietnia.



SPIS TREŚCI

  1. Architektura i powiązania modułów
  2. Multi-Core Strategy Engine — koncepcja “kto pierwszy ten lepszy”
  3. Strategie — szczegółowy opis algorytmów
  4. Macro Risk Matrix — dynamiczny scoring instytucjonalny
  5. Institutional Impulse + Muzzle Mode — zmiana charakterystyki podczas impulsu
  6. Dynamic Channel (Box Trading) — tunel ceny
  7. Zarządzanie pozycjami — warstwy ochrony
  8. Ochrona konta — poziom systemowy
  9. Obsługa manualna (Click & Forget)
  10. Harmonogram i EOD Terminator
  11. News Filter
  12. Filtr Tygodniowy i Fibonacci
  13. Zarządzanie kapitałem i wielkością pozycji
  14. Pyramiding (skalowanie)
  15. Panel informacyjny
  16. Licencja i aktualizacje
  17. Pełna lista parametrów wejściowych (Inputs)




1:500

Adaptive Hybrid System - Multi-Core Strategy Engine -US100
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.