Mēs restartējām papīra stratēģiju darījuma vidū un saņēmām citādu orderu secību nekā pirms restartēšanas. Tie paši tirgus dati, tā pati stratēģijas versija, tas pats konta atlikums. Signāla aprēķins sakrita. Taču stratēģijas atmiņa par tās pozīciju un neizpildītajiem orderiem — ne.
Mēs izsekojām neatbilstībai, veselu dienu atkārtoti izspēlējot scenārijus. Noderīgā atziņa bija vienkārša: programmatūrai restartēšana ir tirgus notikums. Ja nepārbaudāt, kā stratēģija atjauno savu stāvokli, tīrs atpakaļtests var noslēpt papīra tirdzniecības sistēmu, kas aizmirst, kas tai pieder.
09:10 — Izvēlējāmies neuzkrītošu pozīciju
Testa stratēģija tirgoja likvīdu perpetual līgumu: ieiet garajā pozīcijā, kad īsais slīdošais vidējais šķērso garāko virzienā uz augšu, un iziet, kad notiek pretējs šķērsojums. Atkārtojumu sākām ar jau atvērtu nelielu pozīciju un neizpildītu limit orderi, kas samazina pozīciju un atļauj tikai tās samazināšanu. Tādējādi atkopšanas procesam bija jāatjauno divi fakti: kas mums piederēja un ko jau bijām lūguši biržai izdarīt.
Kontrolpunktā kontā bija 0.04 līgumi. Orderis par 0.01 bija atvērts. Stratēģijas process abas vērtības bija saglabājis kešatmiņā, taču palaišanas laikā tas ielādēja tikai pozīciju. Tas uzskatīja, ka kešotais orderis vairs nepastāv.
09:25 — Parādījās pirmais dublētais orderis
Pēc restartēšanas stratēģija ieraudzīja esošo garo pozīciju, izpildīja signāla loģiku un iesniedza vēl vienu orderi pozīcijas samazināšanai par 0.01. Tagad papīra tirdzniecības vidē bija divi aktīvi orderi. Katrs atsevišķi bija pareizs. Taču kopā tie varēja pārdot divreiz vairāk, nekā bija paredzēts, ja izpildītos abi.
Sākumā vainojām signālu ciklu. Tas nebija pie vainas — problēma bija nepilnīgā momentuzņēmumā. Stratēģija vaicāja: “Kāda pozīcija man ir?” Taču tā nekad nepajautāja: “Kuri orderi joprojām ir aktīvi?”
| Stāvoklis pēc restartēšanas | Procesa priekšstats | Konta faktiskais stāvoklis |
|---|---|---|
| Pozīcija | Garā pozīcija 0.04 | Garā pozīcija 0.04 |
| Atvērtie pozīcijas samazināšanas orderi | Nav | Divi, katrs par 0.01 |
| Paredzētā ekspozīcija pēc viena ordera izpildes | Garā pozīcija 0.03 | Varētu kļūt par garo pozīciju 0.02 |
10:00 — Izlabojām atkopšanu, tad atklājām laika nobīdes problēmu
Mainījām palaišanas procesu, lai tas pirms jaunu lēmumu pieņemšanas atjaunotu stāvokli, izmantojot konta pozīcijas un atvērtos orderus. Tas novērsa dublēšanos. Pēc tam padarījām atvienošanos mazāk paredzamu: viens orderis tika izpildīts, kamēr stratēģija bija bezsaistē, un izpildes paziņojums pienāca pēc atkārtotas savienošanās.
Konta momentuzņēmumā izpilde jau bija atspoguļota. Pēc tam pienākušais paziņojums samazināja lokālo pozīciju vēlreiz. Dažas sekundes stratēģija uzskatīja, ka tai ir 0.02 līgumi, lai gan kontā bija 0.03. Nākamā līdzsvarošana balstījās uz neesošu pozīcijas iztrūkumu.
Pievienojām saskaņošanas noteikumus: par sākumpunktu izmantot konta momentuzņēmumu, ar notikumu identifikatoriem ignorēt izpildes, kas tajā jau ir atspoguļotas, un neiesniegt orderus, kamēr nav pabeigta sākotnējā sinhronizācija. Paziņojums var pienākt novēloti vai divreiz. Atkopšanai jāspēj rēķināties ar abiem gadījumiem.
13:40 — Atkārtojums atklāja nemanāmu neatbilstību
Atkārtoti izspēlējām vienu un to pašu cenu kustību sākotnējā un restartētajā scenārijā. Salīdzinot tikai gala P&L, problēmu nebūtu pamanījuši: pēc tirgus apgriešanās abās versijās bija viena un tā pati pozīcija. To atklāja orderu notikumu salīdzināšana.
Reģistrējām katru lēmumu kopā ar nolasīto stāvokli: pozīciju, atvērtos orderus, pēdējā apstrādātā izpildes notikuma identifikatoru, signāla vērtību un stratēģijas versiju. Tad pirmajam atšķirīgajam notikumam varējām atrast izskaidrojumu. Vienā izpildes reizē sistēma redzēja aktīvu orderi, otrā — tukšu sarakstu. Vēlāk vienā no tām izpilde tika ieskaitīta divreiz.
Vienāds gala atlikums nepierāda, ka darbība bijusi vienāda. Salīdziniet lēmumu un orderu secību, īpaši atkopšanas posmos.
16:20 — Ko nākamreiz darītu citādi
Pārāk ilgi atkārtoti izspēlējām cenu datus, pirms pārbaudījām konta stāvokļa izmaiņas. Nākamreiz vispirms ieviestu kļūmju gadījumus un uzturētu tirgus kustību gandrīz nemainīgu. Tā programmatūras kļūdu būtu viegli pamanīt, un svārstīga tirgus kustība nenomāktu diagnostiku.
- Restartēt ar pozīciju un daļēji izpildītu orderi.
- Atvienoties pēc ordera iesniegšanas un atkal pieslēgties, pirms pienāk paziņojums par izpildi.
- Piegādāt vienu un to pašu izpildes notikumu divreiz un pārbaudīt, vai stāvoklis mainās tikai vienu reizi.
- Bloķēt jaunus orderus, līdz ir saskaņotas gan pozīcijas, gan atvērtie orderi.
- Salīdzināt lēmumu un orderu žurnālus nepārtrauktā un pēc restartēšanas izpildītā scenārijā.
Iemācījāmies arī saglabāt atkopšanas momentuzņēmumu kopā ar stratēģijas versiju un notikumu žurnālu. Tādējādi kļūmi varēja reproducēt dažu minūšu laikā, nevis paļauties uz to, ka kāds atcerēsies precīzu atkārtotas savienošanās secību.
Papīra stratēģija, kas darbojas pareizi tikai tik ilgi, kamēr tās process turpina darboties, vēl nav izgājusi pilnu mēģinājumu. Restartējiet to pozīcijas vidū, panāciet novēlotu izpildes paziņojumu pienākšanu un pārbaudiet katru pēc tam nosūtīto orderi. Mērķis nav pierādīt, ka kļūmju nekad nebūs. Mērķis ir padarīt atkopšanu redzamu, pirms papīra konts šo pašu mācību negaidīti iemāca jums.
← Visi raksti


