SYMBOL_VOLUME_STEP
Minimalny krok zmiany wolumenu zlecenia. Zaokrąglenie musi iść w dół, nie do najbliższej wielokrotności. Wolumen
double SymbolInfoDouble(string symbol, SYMBOL_VOLUME_STEP);
1 fragment kodu z tej strony przeszedł przez kompilator MetaEditor build 6090, 2026-08-05.
Wolumen musi być całkowitą wielokrotnością tej wartości. Typowo 0.01 na walutach, 0.1 na części indeksów, 1.0 na akcjach.
Dlaczego to nie jest oczywiste
Zaokrąglenie musi iść w dół, nie do najbliższej wielokrotności. Wolumen wyliczony z ryzyka i zaokrąglony w górę przekracza założone ryzyko — przy kroku 1.0 na akcjach różnica między 1.4 a 2.0 to czterdzieści procent więcej, niż zamierzałeś.
Druga rzecz: liczbę miejsc dziesiętnych do NormalizeDouble też trzeba wziąć z kroku, a nie wpisać na sztywno. Krok 0.01 daje dwa miejsca, krok 1.0 zero miejsc, a wysłanie 1.00 tam, gdzie broker oczekuje 1, bywa odrzucane.
Kod
//--- liczba miejsc dziesiętnych wynikająca z kroku wolumenu
int CyfryWolumenu(const string symbol)
{
double krok = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
if(krok <= 0.0)
return 2;
return (int)MathMax(0.0, MathRound(-MathLog(krok) / MathLog(10.0)));
}
//--- zaokrąglenie zawsze w dół, do kroku
double wolumen = MathFloor(surowyWolumen / krok) * krok;
wolumen = NormalizeDouble(wolumen, CyfryWolumenu(symbol));