Първоначално написано от
Mateev
Пиша този постинг, за да обясня за един проблем в роботите, генерирани от Strategi Quant. Всъщност този проблем го има с голям процент от публичните роботи в интернет, и се дължи преди всичко на лошо написан софтуер от програмист-бързак, които претупва софтуера си и оставя в него много недомислици.
Какво точно се случи?
Един от роботите ми се опита да сключи сделка в първата секунда след отваряне на пазара в понеделник през нощта. СЪщия робот го имаше на 3 различни брокера (Алпари, ИнстаФорекс и ИЦ Маркетс). В два от брокерите сделката се отвори (при Инстафорекс с голямо закъснение и слипидж), но в ИЦ Маркетс робота даде 3 поредни грешки през няколко секунди и се отказа да прави опити за отваряне на позиция. Сделката се оказа печеливша, но в третия брокер я пропуснах заради лошо написан код на самия робот.
Реших да разнищя проблема, и се оказа, че ИЦ Маркетс пускат котировките да текат още в полунощ, като с това излъгват роботите по света да започнат да търгуват, но в същото време търговията си остава забранена през първата една минута след полунощ. Това е допустимо, но донякъде е подвеждащо, защото освен роботи и живи хора се подлъгват да опитват да сключват сделки. Както и да е - робота трябваше да се справи с подобна ситуация, но не можа, и причината е лошо написания му код. Погледнах в кода и открих, че във функцията OnTick() робота смята логиката на стратегията и след това прави 3 поредни опита за сключване на сделка, без да напуска самата функция. Един вид или сделката трябва да се сключи точно в този тик и в никой друг, или въобще се отказваме от нея. Тъпо, нали ......
Не стига това, че робота не успя да сключи сделката, но и на всичкото отгоре повече от 30 секунди беше блокирал функцията OnTick() и така пречеше на другите роботи да си свършат работата, защото не връщаше контрола. Та този проблем ме накара да се замисля, че той присъства в абсолютно всички роботи, логиката на работа на които зависи от един единствен тик. Например роботите, работещи по цената Open на всеки нов бар. Тази Open цена е един единствен тик, и ако нещо се обърка със сключването на сделката, тя се пропуска като такава. А могат да се объркат много неща. Например друг робот да блокира Trading Context по време на този тик, или например някакво временно прекъсване на интернет, което в българските условия може да се случва доста често.
За да не се случва този проблем, в търговската логика на робота трябва да е заложено да прави много опити за сключване на сделка например в следващите 5-10 минути след сигнала. Самият сигнал трябва да информира търговската логика колко е допустимия период от време за правене на сделка или колко е допустимата промяна на цената, за да е разрешено продължаването на опитите за сключване на сделка. Самата търговска логика от своя страна не трябва да блокира функцията OnTick(), а да направи един бърз опит за отваряне на сделка и ако е неуспешен, да се откаже от нови опити и да даде шанс на други роботи да си пробват късмета.
Тоест има два варианта за писане на търговска логика - набързо претупан вариант, който масово се практикува в публичните роботи, и втори доста по-сложен добре обмислен и реализиран вариант с многократни опити за направа на търговска операция и анализ на всяка една от многобройните грешки, които могат да възникнат. Респективно и вземане на много на брой различни решения в зависимост от конкретната грешка, която е възникнала. Този втори тип софтуер се пише бавно и трудно най-вече поради невъзможността да се симулират всички възможни грешки и да се дебъгне софтуера така, щото успешно да се справя с всяка една от тях.
Роботите на Strategy Quant са от първия тип (калпаво написани), а руските портфейлни роботи, които закупих, са от втория тип (много добре написани). Руските роботи дори анализират спреда, изясняват си какви са неговите средни и минимални стойности, и след това при команда за търговска операция изчакват тик с хубав спред, за да направят опит за сделка по него. Ако не успеят, пробват се пак през някакъв интервал от време.