Zaokrąglenie lota - realne ryzyko inne niż zakładane
W skrócie: bot liczy lot tak, żeby strata na stop lossie wyniosła np. 100 USD, ale wynik trzeba zaokrąglić do kroku lota brokera. Zaokrąglenie w dół daje trochę mniejsze ryzyko i to jest w porządku. Kłopot zaczyna się, gdy wyliczony lot jest mniejszy od minimalnego: wtedy pozycja o minimalnym locie ryzykuje więcej, niż zakładałem.
Wzór i trzy ograniczenia brokera
Lot liczę z ryzyka w USD i odległości do stop lossa:
Lot = ryzyko w USD / strata 1 lota na stop lossie
Na złocie 1 lot to u większości brokerów 100 uncji. Ruch ceny o 1 USD to 100 USD na 1 locie i 1 USD na 0,01 lota.
Wynik prawie nigdy nie jest okrągły, a broker ma trzy ograniczenia, które są w specyfikacji symbolu:
- minimalny lot, na złocie zwykle 0,01,
- krok lota, zwykle 0,01, na części indeksów i akcji 0,1 albo 1,
- maksymalny lot na jedno zlecenie.
Przypadek 1: zaokrąglenie w dół
Przykład. Ryzyko 100 USD, złoto, stop loss 7,30 USD od ceny wejścia.
- Strata 1 lota: 7,30 x 100 = 730 USD.
- Lot: 100 / 730 = 0,1369.
- Po zaokrągleniu w dół do kroku 0,01: 0,13 lota.
- Ryzyko: 0,13 x 730 = 94,90 USD.
Tracę 5% planowanego ryzyka. Przy większych pozycjach różnica maleje, przy małych rośnie. Dla ryzyka 20 USD i tego samego stop lossa wychodzi 0,027, czyli 0,02 lota i 14,60 USD. To już 27% mniej niż plan.
Zawsze zaokrąglam w dół. Zaokrąglenie do najbliższej wartości dałoby tutaj 0,03 lota i 21,90 USD, czyli więcej niż założone ryzyko. Na koncie prop wolę zarobić trochę mniej, niż przekroczyć limit przez matematykę.
Przypadek 2: lot poniżej minimalnego
To jest sytuacja, która naprawdę psuje ryzyko. Przykład: konto 5 000 USD, ryzyko 0,6%, czyli 30 USD na transakcję. Złoto, szeroki stop loss 45 USD od ceny.
- Strata 1 lota: 4 500 USD.
- Lot: 30 / 4 500 = 0,0067.
- Minimalny lot to 0,01, mniejszej pozycji nie otworzę.
- Ryzyko przy 0,01 lota: 45 USD, czyli 150% planu.
Bot ma tu dwie możliwości: pominąć transakcję albo wejść minimalnym lotem i zaryzykować więcej. Obie są poprawne, ale trzeba wybrać świadomie. Bot, który po cichu podnosi lot do minimalnego, na małym koncie potrafi ryzykować półtora raza więcej, niż pokazują ustawienia.
Ja ustawiam to tak: jeśli ryzyko przy minimalnym locie przekracza plan o więcej niż ustalony procent, bot transakcję pomija i zapisuje to w logu. W teście widzę wtedy, ile transakcji odpadło, i wiem, że konto jest za małe na tę strategię albo stop loss jest za szeroki.
To samo ograniczenie, tylko ostrzejsze, jest na kontraktach futures. Opisałem je w artykule Mikro kontrakty futures.
Przypadek 3: lot powyżej maksymalnego
Odwrotna sytuacja zdarza się na dużych kontach z ciasnym stop lossem. U jednej z moich prop firm złoto ma maksymalny lot 5 na zlecenie. Przykład: ryzyko 1 000 USD i stop loss 1,50 USD dają 6,67 lota. Bot może otworzyć 5 lotów, czyli ryzykuje 750 USD.
Tu ryzyko jest mniejsze od planu, więc konta to nie zabije. Wynik będzie jednak inny niż w teście u brokera z wyższym limitem.
Koszty dochodzą do ryzyka
Strata na stop lossie to nie tylko odległość razy lot. Dochodzi prowizja. Na złocie w moich prop firmach to 5 USD za lot w jednej i 11 USD za lot w drugiej. Przy 0,13 lota wychodzi 0,65 albo 1,43 USD, czyli niewiele. Przy strategii z ciasnym stop lossem i dużym lotem prowizja potrafi dodać kilka procent do każdej straty.
Dochodzi też poślizg i spread w chwili zamknięcia. Dlatego 100 USD ryzyka traktuję jako stratę typową, a nie maksymalną. Więcej w artykule Luka cenowa i stop loss.
Kod: lot z ryzyka, zaokrąglony w dół
// Lot z ryzyka w USD i odległości SL (w cenie). Zwraca 0, gdy minimalny lot przekracza dopuszczalne ryzyko.
double LotFromRisk(const string symbol, const double riskUsd, const double slDistance, const double maxOverRiskPct)
{
double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
double step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
if(tickValue <= 0 || tickSize <= 0 || step <= 0 || slDistance <= 0)
return 0.0;
double lossPerLot = slDistance / tickSize * tickValue; // strata 1 lota na SL
double lot = MathFloor(riskUsd / lossPerLot / step) * step; // zawsze w dół
if(lot < minLot)
{
// minimalny lot ryzykuje więcej niż plan - wchodzę tylko, gdy przekroczenie jest małe
double overPct = (minLot * lossPerLot / riskUsd - 1.0) * 100.0;
return (overPct <= maxOverRiskPct) ? minLot : 0.0;
}
return MathMin(lot, maxLot);
}
Po otwarciu pozycji bot zapisuje w logu planowane i faktyczne ryzyko w USD. Przy przeglądzie widać wtedy od razu, gdzie zaokrąglenie zmieniło wynik.
Checklista
- znam minimalny lot, krok lota i maksymalny lot symbolu u mojego brokera,
- bot zaokrągla lot w dół, nie do najbliższej wartości,
- wiem, co bot robi, gdy wyliczony lot jest mniejszy od minimalnego,
- w logu jest planowane i faktyczne ryzyko każdej transakcji,
- przy małym koncie sprawdzone w teście, ile transakcji odpada albo przekracza ryzyko,
- prowizja doliczona do straty na stop lossie.
Powiązane
- Mikro kontrakty futures: MES, MNQ, MGC
- Luka cenowa i stop loss
- Ryzyko łączne kilku pozycji i kilku botów
- Dzienny limit straty
- Pojęcia z artykułu: słowniczek, skorowidz
Ostrzeżenie: handel CFD i forex wiąże się z wysokim ryzykiem utraty kapitału. Strata na stop lossie może być większa niż wyliczone ryzyko. Artykuł ma charakter edukacyjny i nie jest rekomendacją inwestycyjną.