Otvorite listu otvorenih naloga (Open Orders). Ako take-profit strana vašeg OCO naloga pokazuje delimično izvršenje, a stop strane više nema na listi, stranica se nije zaglavila. Sistem je stop nalog već ugasio, a ono što nije prodato sada stoji samo na take-profit ceni. Ako cena krene naniže, nijedan nalog neće to prodati umesto vas.
Pravilo je zapisano u dokumentaciji Binance Spot API-ja. U zapisu o izmenama kojim je OCO uveden piše redosled: ako je limit strana (LIMIT_MAKER) dodirnuta, ona se izvršava prva, a tek zatim se otkazuje stop-loss strana. „Dodirnuta“ ne znači potpuno izvršena; dovoljno je da druga strana preuzme deo. Rečnik spot pojmova kaže isto drugim rečima: kada se jedan od naloga izvrši, drugi automatski ističe (automatically expired).
Dva naloga iste količine, a ostaje samo jedan
OCO je par. Jedna strana je limit nalog tipa LIMIT_MAKER, pa u knjigu naloga ulazi samo kao maker. Druga je stop nalog, STOP_LOSS ili STOP_LOSS_LIMIT. Obe strane moraju imati istu količinu.
Cene moraju da „opkole“ poslednju cenu trgovanja. Kod prodajnog OCO: limit cena > poslednja cena > stop cena. Kod kupovnog je obrnuto: limit cena < poslednja cena < stop cena. Ako redosled nije ispoštovan, nalog se odbija pri slanju.
Zamišljen je tako da se završi na jedan od dva načina: sve prodato na cilju ili sve prodato na stopu. Ali limit strana čeka u redu, a kupac koji do nje stigne možda hoće samo deo količine. Pravilo i to računa kao izvršenje limit strane. Šta delimično izvršenje znači samo po sebi, objašnjeno je u tekstu Izvršen je samo deo. Šta je sa ostatkom?
Prodajni OCO od 0.5 ETH posle izvršenih 0.2
Imate 0.5 ETH, poslednja cena je 2,450 USDT. Postavljate prodajni OCO: take-profit limit 2,600, stop okidač 2,300, stop limit 2,290, obe strane po 0.5 ETH. Pošto je 2,600 > 2,450 > 2,300, nalog prolazi.
Cena zatim dođe do 2,600. Vaša prodaja stoji iza naloga koji su na toj ceni bili pre nje, a kad red stigne do vas, kupovina sa druge strane pokriva još samo 0.2 ETH. Po redosledu iz dokumentacije, tada se dešava sledeće:
- limit strana izvrši 0.2 ETH, prelazi u delimično izvršen nalog, a 0.3 ETH i dalje stoji na 2,600;
- stop strana se gasi, a u API-ju ima status EXPIRED;
- od celog OCO ostaje samo taj jedan delimično izvršen prodajni limit nalog.
Kasnije cena padne na 2,250. Preostalih 0.3 ETH se ne prodaje na 2,300, jer nalog koji bi se tu aktivirao više ne postoji. I dalje su ponuđeni po 2,600. Po ceni od 2,450 tih 0.3 ETH vredi oko 735 USDT, a po 2,250 oko 675 USDT. Tih 60 USDT pada u celosti pogađa 0.3 ETH koji nemaju stop.
Šta treba da piše u otvorenim nalozima, istoriji naloga i istoriji trgovanja
Otvoreni nalozi: treba da ostane jedan prodajni limit nalog. Pogledajte izvršenu i preostalu količinu, u primeru 0.2 i 0.3. Ako je stop nalog i dalje na listi, limit strana još nije izvršena i gornji opis ne važi za vaš slučaj.
Istorija naloga: tu završava stop nalog, i to ne kao izvršen. API ga beleži kao EXPIRED, odvojeno od naloga koji ste sami otkazali; kako razlikovati ta dva ishoda, piše u tekstu EXPIRED: ništa nije izvršeno ili je nalog završen?
Istorija trgovanja: sadrži samo izvršenja limit strane. Može ih biti jedno ili više, a zbir treba da bude 0.2 ETH. Ako se ne slaže, uporedite ih jedno po jedno kao u tekstu Istorija naloga i trgovanja: isti nalog.
Kako vratiti stop na preostalih 0.3 ETH: prvo otkazati, pa postaviti
Da bi ostatak ponovo imao cilj iznad i stop ispod, otkažite preostali prodajni limit nalog, sačekajte da se 0.3 ETH vrati u raspoloživi saldo, pa postavite novi OCO na 0.3 ETH po trenutnim cenama. Obrnutim redom ne ide: nalog koji još stoji drži tih 0.3 ETH, pa bi novi OCO naišao na nedovoljan saldo (vidi Otvoreni nalozi: zašto je saldo rezervisan?).
Između otkazivanja i novog naloga postoji kratak razmak. Kada pošaljete otkazivanje, u istoriji naloga proverite da je stari nalog završen i da je izvršena količina ostala 0.2, pa novi OCO dimenzionišite prema onome što je zaista ostalo. Izvršenja koja stignu dok otkazivanje putuje opisana su u tekstu Posle otkazivanja: koliki novi nalog poslati?
Novi OCO se proverava prema poslednjoj ceni u trenutku slanja. Recimo da je cena sada 2,590: cilj od 2,600 je i dalje iznad nje, a stop od 2,300 ispod, pa stare cene prolaze. Recimo da je cena u međuvremenu skočila na 2,620: cilj od 2,600 je sada ispod poslednje cene i nalog se odbija. U spisku API grešaka poruka glasi „A limit order in a sell OCO must be above.“ (kod -1166).
Vrlo mali ostatak je poseban slučaj. Ako je ostalo samo 0.001 ETH, to je po 2,300 oko 2.3 USDT, ispod minimalne vrednosti naloga za par (ovde je za ETH/USDT uzeto 5 USDT kao primer; važe pravila trgovanja tog para). Novi OCO neće proći, a posle otkazivanja taj iznos postaje ostatak koji ne možete prodati zasebno, vidi Binance ne dozvoljava da prodate ceo saldo. Tada je jednostavnije ostaviti prvobitni limit nalog da stoji.
Obrnut slučaj: stop se aktivira prvi
Ako cena prvo padne do stop okidača, redosled je obrnut. U zapisu o izmenama stoji da se limit maker strana otkazuje pre nego što se izvrši stop-loss strana. U primeru tada u knjigu ulazi stop-limit prodaja na 2,290; ako cena propadne kroz taj nivo i niko ne kupi po 2,290, ostajete sa neizvršenim stop-limit nalogom i bez take-profita. To je ista rupa koju ima i samostalni stop-limit nalog, opisana u tekstu Stop je aktiviran. Zašto sredstvo nije prodato?
Ako vam je važno da posle aktiviranja izlaz bude siguran, stop strana može biti običan stop bez limita (u API-ju STOP_LOSS, izvršava se po tržišnoj ceni). Cena toga je što više ne kontrolišete cenu izvršenja, a kod plitke knjige ona može biti znatno niža od okidača; vidi Da li vidljiva dubina pokriva ovaj tržišni nalog?
Otkažete jednu stranu, otkazan je ceo OCO
Isti zapis o izmenama kaže da otkazivanje bilo koje strane otkazuje ceo OCO. Zato ne možete da uklonite cilj a zadržite stop: nestaju obe strane, a celih 0.5 ETH se vraća u raspoloživi saldo. Ako vam treba samo stop, otkažite OCO i postavite zaseban stop-limit nalog.
Redosled izvršenja i pravila o cenama iz ovog teksta potiču iz dokumentacije Binance Spot API-ja objavljene na GitHubu (zapis o izmenama, OCO odeljak u REST API referenci i kodovi grešaka). Nazivi dugmadi i statusa na sajtu i u aplikaciji su onakvi kakve vidite na svom ekranu.