Przejdź do treści
MQL5 · MetaTrader 5 · po polsku
kod odczarowany

MQL5 / Błędy

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.

Trzy liczby, które o tym decydują
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.01

Ską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.

Dopasowanie wolumenu do instrumentu
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);

Powiązane