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_MODE | kierunek pozycji i to, czy wolno tylko zamykać |
SYMBOL_ORDER_MODE | typy 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.
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.
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;
}