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

MQL5 / Pułapki

Numer magiczny na rachunku netting

Na rachunku netting pozycja należy do instrumentu, nie do eksperta. Numer magiczny potrafi zniknąć albo zmienić właściciela.

1 fragment kodu z tej strony przeszedł przez kompilator MetaEditor build 6090, 2026-08-05.

Programiści piszący wielowalutowe lub wielostrategiczne Eksperty (EA) często zapominają, że MQL5 obsługuje dwa fundamentalnie różne systemy rachunków: Hedging (tradycyjny dla MT4 i brokerów offshore) oraz Netting (standard na giełdach i regulowanych rynkach europejskich). Przejście z testera (który domyślnie używa Hedgingu) na konto rzeczywiste Netting bez odpowiednich zabezpieczeń w kodzie to gwarancja katastrofy finansowej.

Netting: Wszystko jest jedną pozycją

Na koncie Hedging możesz mieć jednocześnie pozycję BUY 0.1 lota i SELL 0.1 lota na EURUSD. Otwierają się one jako niezależne bilety (tickets). Na koncie Netting wysłanie zlecenia SELL 0.1, gdy masz już BUY 0.1, zamknie pozycję długą (zrealizuje stratę/zysk) i otworzy krótką. Jeśli wyślesz SELL 0.2, odwróci pozycję na 0.1 SELL. Niezrozumienie tego faktu sprawia, że strategie "Grid" (siatki) czy "Martingale" całkowicie psują się na kontach Netting.

Numer magiczny na rachunku nettingNa rachunku netting pozycja należy do instrumentu, nie do eksperta. Numer magiczny potrafi zniknąć albo zmienić właściciela. Zachowanie zleceń na dwóch systemach rachunków Konto Hedging Pozycja 1: BUY 0.1 Pozycja 2: SELL 0.1 Obie pozycje istnieją niezależnie. Konto Netting Start: BUY 0.1 + SELL 0.1 Pozycja ZEROWA Zlecenie SELL zamknęło LONG. Magic Number zostaje zresetowany!

Paradoks Magic Number w trybie Netting

Na koncie Hedging każda pozycja ma swój własny Magic Number (identyfikator strategii). Na koncie Netting dany instrument finansowy może mieć tylko jedną otwartą pozycję. Jeśli EA "A" (Magic 100) otworzy BUY 0.1 na EURUSD, a następnie EA "B" (Magic 200) otworzy SELL 0.2 na EURUSD, pozycja odwróci się na SELL 0.1. Jaką wartość ma teraz pole POSITION_MAGIC? W MT5 przyjmuje ono Magic Number ostatniego zlecenia, które zmodyfikowało wolumen! Oznacza to, że EA "A" całkowicie straci kontrolę nad pozycją, a próba jej zamknięcia przez EA "A" zakończy się błędem "Invalid Volume" lub zamknięciem pozycji EA "B".

// Zle podejscie: zakladamy, ze pozycja z naszym numerem magicznym jest nasza.
// MQL5 nie ma funkcji wybierajacej pozycje po numerze magicznym - jest tylko
// wybor po symbolu albo po bilecie, a numer sprawdza sie po fakcie.
bool ZamknijNaszaPozycje(const ulong magic)
  {
   if(!PositionSelect(_Symbol))
      return false;

   if(PositionGetInteger(POSITION_MAGIC) != (long)magic)
      return false;

   // Blad na rachunku netting: zamykamy caly wolumen netto instrumentu,
   // takze te czesc, ktora otworzyla inna strategia.
   return handel.PositionClose(_Symbol);
  }

// Bezpieczne podejście: detekcja systemu rachunku
bool IsNettingAccount() {
    return (ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE) == ACCOUNT_MARGIN_MODE_RETAIL_NETTING;
}

void OnTrade() {
    if(IsNettingAccount()) {
        // Ostrzeżenie dla użytkownika lub wymuszenie handlu tylko na jeden instrument na raz
        Print("UWAGA: Wykryto konto Netting. Strategie wielowalutowe mogą kolidować.");
    }
}