retcode 10014
10014 — TRADE_RETCODE_INVALID_VOLUME
Wolumen zlecenia nie mieści się w granicach instrumentu albo nie jest wielokrotnością jego kroku.
3 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
CTrade::OrderSend: market buy 0.037 EURUSD [invalid volume]Co ten kod znaczy
Wolumen narusza jedno z trzech ograniczeń instrumentu: jest mniejszy od minimum, większy od maksimum albo nie jest całkowitą wielokrotnością kroku.
double minimum = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); // np. 0.01
double maksimum = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); // np. 500.0
double krok = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP); // np. 0.01Skąd biorą się złe wolumeny
Prawie zawsze z wyliczania wielkości pozycji z ryzyka. Dzielenie kwoty ryzyka przez wartość punktu daje liczbę w rodzaju 0.0374, a instrument przyjmuje tylko wielokrotności 0.01. Zaokrąglenie musi nastąpić w dół, do kroku — zaokrąglenie w górę potrafi przekroczyć założone ryzyko.
double DopasujWolumen(const string symbol, double wolumen)
{
double minimum = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double maksimum = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double krok = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
if(krok <= 0.0)
krok = minimum;
wolumen = MathFloor(wolumen / krok) * krok;
wolumen = MathMax(minimum, MathMin(maksimum, wolumen));
int cyfry = (int)MathMax(0, MathRound(-MathLog(krok) / MathLog(10.0)));
return NormalizeDouble(wolumen, cyfry);
}Kontrola przed wysłaniem
OrderCheck sprawdza całe zapytanie bez wysyłania go na serwer i wypełnia strukturę wyniku tym samym kodem zwrotnym, który dostałbyś naprawdę:
MqlTradeCheckResult kontrola;
if(!OrderCheck(zapytanie, kontrola))
PrintFormat("Zapytanie nie przejdzie: %d — %s", kontrola.retcode, kontrola.comment);