Filtr spreadu przed wejściem
Jak odczytać bieżący spread, dlaczego wartość z SYMBOL_SPREAD bywa nieaktualna i jak nie wpaść w filtr, który blokuje handel na zawsze.
3 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
Spread rozszerza się przy publikacji danych, przy otwarciu sesji i w weekendowej przerwie. Strategia o przewadze rzędu kilku punktów potrafi w tych momentach tracić wyłącznie na koszcie wejścia.
Dwa sposoby odczytu
//--- wartość podawana przez serwer, zaokrąglona do punktów
long zSerwera = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
//--- policzony z bieżącego kwotowania
MqlTick tick;
if(!SymbolInfoTick(_Symbol, tick))
return;
double punkt = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
int zTicku = (int)MathRound((tick.ask - tick.bid) / punkt);Wartości zwykle się zgadzają, ale SYMBOL_SPREAD bywa aktualizowana rzadziej niż same kwotowania. W momentach, o które w tym filtrze chodzi — czyli przy gwałtownym rozszerzeniu — liczenie z ticku jest wiarygodniejsze.
Filtr
bool SpreadDopuszczalny(const string symbol, const int maksymalnyPunktow)
{
MqlTick tick;
if(!SymbolInfoTick(symbol, tick))
return false;
double punkt = SymbolInfoDouble(symbol, SYMBOL_POINT);
if(punkt <= 0.0)
return false;
int biezacy = (int)MathRound((tick.ask - tick.bid) / punkt);
if(biezacy > maksymalnyPunktow)
{
PrintFormat("Spread %d pkt przekracza dopuszczalne %d — pomijam sygnał.",
biezacy, maksymalnyPunktow);
return false;
}
return true;
}Filtr progresywny zamiast progu
Zamiast odrzucać sygnał, można doliczyć spread do kosztu i sprawdzić, czy przewaga jeszcze się w nim mieści:
double kosztWejscia = (tick.ask - tick.bid);
double oczekiwanyZysk = dystansCelu * punkt;
if(kosztWejscia > oczekiwanyZysk * 0.2)
return false; // koszt zjada ponad piątą część celuTaki filtr sam dostosowuje się do instrumentu i nie wymaga strojenia progu.
W testerze tego nie zobaczysz
Tester strategii używa spreadu z historii albo wartości stałej i nie modeluje gwałtownych rozszerzeń. Filtr spreadu w backteście prawie nigdy się nie uruchamia, więc jego wpływ na wynik wygląda na zerowy — a na rachunku bywa różnicą między zyskiem a stratą. Więcej o tej rozbieżności w trzech modelach ticków.