Odtud můžeme začít určovat, jak bude vypadat naše architektura.
Nejprve potřebujeme proměnnou, která bude označovat stav, ve kterém se bot právě nachází. To je buď BUY, nebo SELL. Tomuto účelu by měl dobře vyhovovat boolean nebo enum.
Poté musíme nastavit naše prahové hodnoty pro nákup a prodej. Ty udávají procentuální pokles nebo nárůst ceny od doby, kdy jsme naposledy provedli operaci.
Příklad pokud jsem nakoupil aktivum za 100 USD a jeho cena je nyní 102 USD, máme 2% nárůst. Pokud máme nastavenou prahovou hodnotu SELL na 1% nárůst, náš bot pak bude prodávat, protože dosáhl zisku nad naší prahovou hodnotou.
V našem případě budou tyto prahové hodnoty konstantní. Potřebujeme je 4, dvě pro každý stav:
Prahové hodnoty BUY (pokud je bot ve stavu SELL)
-
DIP_THRESHOLD
: Koupí aktivum, pokud jeho cena klesla o více než prahovou hodnotu. Smyslem tohoto postupu je dodržet strategii „buy low, sell high“, kdy se snažíte koupit aktivum, když je podhodnocené, a očekáváte, že jeho hodnota vzroste, abyste mohli prodat. -
UPWARD_TREND_THRESHOLD
: Kupuje aktivum, pokud jeho cena vzrostla o více než prahovou hodnotu. To je v rozporu s filozofií „nakupovat nízko, prodávat vysoko“, ale cílem je identifikovat, kdy cena roste a my nechceme propásnout příležitost k nákupu dříve, než se ještě zvýší.
Tady je obrázek, který by vám mohl pomoci:
Poznámka: Hodnoty pro prahové hodnoty jsou zde pouze libovolné. Měli byste si zvolit vlastní podle své vlastní strategie.
Pokud výše uvedené spárujeme s pomocnými funkcemi a funkcí smyčky, která by mohla být také main
, měli bychom nyní mít sami základní pilíře fungujícího bota.
Při každé iteraci náš bot zkontroluje svůj aktuální stav (Koupit nebo Prodat) a pokusí se provést obchod na základě natvrdo zakódovaných prahových hodnot. Poté aktualizuje stav BUY/SELL a poslední cenu pro operaci.
Pak to udělá celé znovu.
Krok 5: Vyleštění bota
Základní architektura našeho bota je hotová, ale pravděpodobně bychom ještě mohli zvážit přidání několika věcí.
Záznamy
Když jsem poprvé vytvářel variantu tohoto bota, jednou z věcí, která pro mě byla zásadní, bylo neustálé zaznamenávání akcí bota jak do terminálu, tak do samostatného souboru protokolu.
Při každém kroku jsem vytvářel takovéto logy:
USD Balance = 22.15$
Bought 0.002 BTC for 22.15 USD
Last Operation Price updated to 11,171.40 (BTC/USD)
Could not perform SELL operation - Insufficient balance
K logům, které šly do souboru, se přidávala i časová značka, takže když jsem po celém dni přistupoval k serveru a našel například chybu, mohl jsem ji dohledat přesně tam, kde se stala, stejně jako zjistit vše ostatní, co bot po cestě udělal.
To by mělo být otázkou nastavení funkce createLog
, která se volá při každém kroku. Něco takového:
Identifikace trendů
Hlavním cílem našeho bota by měl být nákup za nízkou cenu a prodej se ziskem. Máme však dva prahy, které této myšlence tak trochu odporují:UPWARD_TREND_THRESHOLD
a STOP_LOSS_THRESHOLD
.
Tyto prahy nám údajně říkají, kdy bychom měli prodávat se ztrátou nebo nakupovat při růstu ceny. Myšlenka je taková, že se snažíme identifikovat trendy, které se vymykají obecné strategii, ale mohou být pro nás škodlivé nebo výhodné, takže bychom měli jednat.
Způsob, jakým jsem to výše strukturoval, je však poměrně omezený. Statický snímek ceny není zdaleka ukazatelem trendu.
Naštěstí to lze bez větších potíží udělat trochu spolehlivěji.
Jediné, co musíte udělat, je také sledovat více cen než jen lastOpPrice
. Můžete například sledovat cenu před 10 nebo 20 iteracemi a porovnávat ji s aktuální cenou místo lastOpPrice
. To by pravděpodobně bylo lepší při identifikaci trendu, protože se kontrolují spíše rychlé posuny v ceně než posun, ke kterému došlo během dlouhého časového období.
Databáze?
Když je spuštěn, tento jednoduchý bot vlastně nepotřebuje databázi, protože zpracovává velmi málo dat a může všechny informace uchovávat v paměti.
Co se však stane, když bot například selže? Jak by mohl určit hodnotu lastOpPrice
, aniž byste ji ručně zkontrolovali?“
Abyste předešli ruční práci na vaší straně, možná budete chtít udržovat nějakou lehkou databázi, která bude sledovat několik věcí, například lastOpPrice
.
Takto bude bot při spuštění namísto použití výchozích hodnot skutečně kontrolovat své uložené hodnoty a od nich bude pokračovat.
Záleží na tom, jak moc to chcete zjednodušit, můžete dokonce uvažovat o „databázi“ .txt
nebo json
souborů, protože možná stejně budete ukládat jen několik hodnot.
Dashboard
Pokud chcete usnadnit vizualizaci operací svého bota, a také jej spravovat, aniž byste museli vstupovat do kódu a ručně se v něm vrtat, můžete zvážit připojení svého bota k ovládacímu panelu.
To by vyžadovalo, aby byl váš bot připojen k vlastnímu webovému serveru/API, který vám umožní ovládat jeho funkce.
Takto byste mohli například snadněji měnit prahové hodnoty.
K dispozici je mnoho bezplatných šablon ovládacích panelů, takže si ani nemusíte vytvářet vlastní. Podívejte se na Start Bootstrap a Creative Tim, kde najdete několik příkladů.
Testování strategií na minulých datech
Mnoho burz vám nabídne přístup k datům o minulých cenách, stejně jako tato data můžete v případě potřeby obvykle snadno získat jinde.
To je velmi užitečné, pokud chcete otestovat svou strategii předtím, než ji uvedete do provozu. Můžete spustit simulaci svého bota s minulými daty a „falešnými penězi“, abyste zjistili, jak dobře by vámi definované prahové hodnoty fungovaly, a upravit je pro skutečný obchod.
Další body k prahovým hodnotám a příkazům
Při zadávání příkazů si musíte dát pozor na několik věcí.
Především byste měli pochopit, že existují dva typy příkazů: limitní a tržní příkazy. Pokud nejste s těmito pojmy obeznámeni, měli byste si o nich něco přečíst, ale základní přehled vám poskytnu zde.
Tržní příkazy jsou příkazy, které se provádějí za aktuální tržní cenu a ve většině případů se fakticky provedou okamžitě.
K limitním příkazům naopak dochází, když zadáte příkaz za cenu nižší než tržní (v případě příkazu BUY) nebo vyšší než tržní (v případě příkazu SELL). Jejich provedení není zaručeno, protože cena nemusí dosáhnout vámi stanovené hranice.
Výhodou limitních příkazů je, že můžete předvídat pohyby trhu a zadat příkaz týkající se toho, kam očekáváte, že se trh vydá dříve, než k takovému pohybu dojde.
Kromě toho se na limitní příkazy obvykle vztahují nižší poplatky než na tržní příkazy. Je to proto, že tržní příkazy podléhají tomu, čemu se běžně říká „poplatek takera“, zatímco limitní příkazy podléhají „poplatkům makera“.
Důvodem těchto názvů a příslušných poplatků je to, že tržní příkazy pouze přijímají („berou“) aktuální tržní cenu, zatímco limitní příkazy mimo tržní cenu přidávají likviditu, a tedy „vytvářejí trh“, za což jsou „odměněny“ nižšími poplatky.
Všimněte si, že bot v tomto článku se nejlépe hodí pro tržní příkazy.
Nakonec k tématu poplatků: při nastavování svých PROFIT_THRESHOLD
, nezapomeňte brát v úvahu poplatky.
Abyste dosáhli zisku, musíte provést operaci BUY a následně SELL, čímž se na vás vztahují 2 poplatky.
Jako takoví se musíte ujistit, že prodáváte se ziskem, až když jste schopni alespoň pokrýt své poplatky, jinak budete ve skutečnosti ve ztrátě.
Přemýšlejte o tom, že za předpokladu, že by poplatky byly paušální, pokud byste nakoupili aktivum za 100,00 USD s poplatkem 0,50 USD a pak ho prodali za 100,75 USD, opět s poplatkem 0,50 USD, dosáhli byste hrubého zisku 0,75 %, ale ve skutečnosti byste měli čistou ztrátu 0,25 %.
Teď si představte, že by váš bot prodával vždy s čistou ztrátou. Poměrně rychle byste přišli o spoustu peněz…
Závěrečné poznámky
To je pro našeho bota vše. Doufám, že tento tutoriál byl užitečný.
Záměrem bylo zaměřit se na všechny koncepty, které potřebujete znát k sestavení obchodního bota, i když jste nikdy předtím neobchodovali, ne vás naučit programovat.
Předpokládáme, že všichni čtenáři jsou schopni provádět HTTP požadavky v jazyce, který si zvolili, takže by bylo nejlepší zaměřit se na jiné aspekty.
Je to první tutoriál, který jsem takto napsal (založený na pseudokódech), takže mi prosím dejte vědět, jak se vám koncept líbil.
Děkuji za přečtení! A pokud si myslíte, že byl tento článek užitečný, klidně mě podpořte nějakým potleskem 👏👏.