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

MQL5 / Błędy

retcode 10043

10043 — TRADE_RETCODE_SHORT_ONLY

Rzadki kod, który odsłania rzecz częstą: twój broker pozwala na mniej, niż zakłada kod. Plus skrypt, który sprawdza to na wszystkich instrumentach naraz.

2 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.

CTrade::OrderSend: market buy 0.10 XYZ [only short positions allowed]

Co ten kod znaczy

Instrument przyjmuje wyłącznie pozycje krótkie. Występuje rzadko — przy instrumentach w szczególnym trybie obrotu i przy niektórych certyfikatach. Jego lustrzanym odbiciem jest 10042, dozwolone tylko pozycje długie, które spotyka się znacznie częściej.

Rzecz ważniejsza od samego kodu

Ten kod należy do rodziny odmów, które łączy jedna cecha: ekspert dowiaduje się o ograniczeniu dopiero po wysłaniu zlecenia. Instrument zna to ograniczenie przez cały czas i chętnie o nim powie, jeśli się zapyta.

Kod, który pyta przed wysłaniem, zamiast reagować na odmowę, jest krótszy, szybszy i nie zaśmieca dziennika. Wymaga jednak sprawdzenia dwóch różnych właściwości, bo ograniczenia siedzą w dwóch miejscach:

WłaściwośćCo ogranicza
SYMBOL_TRADE_MODEkierunek pozycji i to, czy wolno tylko zamykać
SYMBOL_ORDER_MODEtypy zleceń, w tym dostępność stop lossa i take profitu

Przegląd oferty brokera

Zamiast sprawdzać instrument po instrumencie, warto raz przejrzeć całą listę. Poniższy skrypt wypisuje ograniczenia wszystkich instrumentów z okna Rynek i zwykle bywa zaskoczeniem — nawet u brokera, u którego pracuje się od lat.

MQL5\Scripts\PrzegladOferty.mq5
void OnStart()
  {
   PrintFormat("%-14s %-14s %-6s %-6s %-6s", "instrument", "tryb handlu",
               "limit", "stop", "SL/TP");

   for(int i = 0; i < SymbolsTotal(true); i++)
     {
      string symbol = SymbolName(i, true);

      long handel = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
      long zlecenia = SymbolInfoInteger(symbol, SYMBOL_ORDER_MODE);

      string opisHandlu = "pelny";
      if(handel == SYMBOL_TRADE_MODE_DISABLED)
         opisHandlu = "wylaczony";
      else if(handel == SYMBOL_TRADE_MODE_CLOSEONLY)
         opisHandlu = "zamykanie";
      else if(handel == SYMBOL_TRADE_MODE_LONGONLY)
         opisHandlu = "tylko dlugie";
      else if(handel == SYMBOL_TRADE_MODE_SHORTONLY)
         opisHandlu = "tylko krotkie";

      //--- wypisujemy tylko instrumenty z jakimkolwiek ograniczeniem
      bool limit = ((zlecenia & SYMBOL_ORDER_LIMIT) == SYMBOL_ORDER_LIMIT);
      bool stop  = ((zlecenia & SYMBOL_ORDER_STOP) == SYMBOL_ORDER_STOP);
      bool stopy = ((zlecenia & SYMBOL_ORDER_SL) == SYMBOL_ORDER_SL);

      if(opisHandlu == "pelny" && limit && stop && stopy)
         continue;

      PrintFormat("%-14s %-14s %-6s %-6s %-6s", symbol, opisHandlu,
                  limit ? "tak" : "NIE", stop ? "tak" : "NIE",
                  stopy ? "tak" : "NIE");
     }

   Print("Instrumenty bez ograniczen pominieto.");
  }

Reakcja w kodzie

Sprawdzenie robi się raz przy starcie i powtarza okresowo, bo tryb handlu zmienia się w trakcie życia instrumentu.

Czy wolno wejść w tym kierunku
bool WolnoWejsc(const string symbol, const bool kupno)
  {
   long tryby = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);

   if(tryby == SYMBOL_TRADE_MODE_DISABLED ||
      tryby == SYMBOL_TRADE_MODE_CLOSEONLY)
      return false;

   if(kupno && tryby == SYMBOL_TRADE_MODE_SHORTONLY)
      return false;
   if(!kupno && tryby == SYMBOL_TRADE_MODE_LONGONLY)
      return false;

   return true;
  }

Powiązane