Tästä lähtien voimme alkaa määritellä, miltä arkkitehtuurimme näyttää.
Ensin tarvitsemme muuttujan, joka ilmaisee, missä tilassa Botti on tällä hetkellä. Tämä on joko BUY tai SELL. Boolean- tai enum-arvon pitäisi sopia tähän tarkoitukseen hyvin.
Sitten meidän on asetettava kynnysarvot ostolle ja myynnille. Nämä ilmaisevat hinnan prosentuaalisen laskun tai nousun sen jälkeen, kun viimeksi teimme operaation.
Esimerkiksi, jos ostin omaisuuserän 100$:lla ja sen hinta on nyt 102$, meillä on 2 % nousu. Jos meillä on SELL-kynnys asetettu 1 %:n nousuun, botimme myy silloin, koska se on tehnyt voittoa yli kynnysarvomme.
Tapauksessamme nämä kynnysarvot ovat vakioita. Tarvitsemme niitä 4 kappaletta, kaksi jokaista tilaa varten:
BUY Thresholds (Jos Botti on SELL-tilassa)
-
DIP_THRESHOLD
: Ostaa omaisuuserän, jos sen hinta laski yli kynnysarvon. Tämän ideana on noudattaa ”osta matalalta, myy korkealta” -strategiaa, jossa yrität ostaa omaisuuserän, kun se on aliarvostettu, ja odotat sen arvon nousevan, jotta voit myydä sen. -
UPWARD_TREND_THRESHOLD
: Ostaa omaisuuserän, jos sen hinta on noussut yli kynnysarvon. Tämä on vastoin ”osta matalalta, myy korkealta” -filosofiaa, mutta sillä pyritään tunnistamaan, kun hinta nousee, emmekä halua jättää käyttämättä tilaisuutta ostaa ennen kuin se nousee vielä korkeammalle.
Tässä on havainnollistus, joka saattaa auttaa:
Jos suoritimme MYYNTI-operaation yllä olevaan kuvaan merkityssä kohdassa, jossa on merkintä ”MYYDÄÄN”, meillä on nyt kynnysarvot asetettuna osto-operaatiolle.
Jos hinta menee joskus alimman vihreän viivan alapuolelle tai ylimmän vihreän viivan yläpuolelle, suoritamme BUY-operaation. Tässä tapauksessa ylitimme ensin ylemmän kynnysarvon, joten ostimme perustuen BUY_DIP_THRESHOLD
.
SELL Thresholds (If the Bot is in BUY State)
-
PROFIT_THRESHOLD
: Myy omaisuuserän, jos sen hinta on noussut kynnysarvon yläpuolelle sen jälkeen, kun ostimme sen. Näin saamme voittoa. Myymme korkeampaan hintaan kuin ostimme. -
STOP_LOSS_THRESHOLD
: Ihannetapauksessa haluaisimme botin myyvän vain silloin, kun se tekee voittoa. Ehkä markkinat ovat kuitenkin juuri laskemassa merkittävästi ja haluamme päästä pois ennen kuin on liian myöhäistä ja ostaa sitten halvemmalla. Siksi tätä kynnysarvoa käytetään myymään tappiolla, mutta tavoitteena on estää suuremman tappion syntyminen.
Tässä on esimerkki:
Tässä ostimme pisteessä, joka on merkitty merkinnällä ”BUY”. Sitten saavutimme ylemmän kynnyksen ennen alempaa kynnystä, eli myimme omaisuuserämme voitolla. Näin kaupankäyntibotit tienaavat rahaa.
Nyt meillä on jo peruskäsitys siitä, miten botti toimii, joten siirrymme (pseudo)koodin pariin.
API-aputoiminnot
Aluksi bottimme tarvitsee muutamia aputoimintoja, joilla saamme tietoja pörssin API:sta. Tarvitsemme:
Ylläolevan pitäisi olla itsestään selvää, mutta sinun täytyy varmistaa, että olet tietoinen siitä, mitä valuuttoja API:n POST
kyselyt kysyvät, kun teet osto- tai myyntioperaation.
Usein, kun esimerkiksi vaihdat USD:tä kultaan, voit määrittää joko kuinka paljon kultaa haluat ostaa tai kuinka paljon USD:tä haluat myydä. Valuuttojen saaminen oikein on erittäin tärkeää.
Botin silmukkasykli
Nyt kun meillä on apufunktiomme, aletaan määritellä botin työnkulkua. Ensimmäiseksi tarvitsemme äärettömän silmukan, jossa on jonkin verran lepoaikaa. Sanotaan, että haluamme botin yrittävän suorittaa operaation 30 sekunnin välein. Tältä se voisi näyttää:
Sitotaan sitten muuttujat ja vakiot, joista puhuimme, sekä päätöksenteon kulku. API-apufunktioita lukuun ottamatta koodimme päätyisi jotakuinkin näin:
Huomautus: Kynnysarvojen arvot ovat tässä vain mielivaltaisia arvoja. Sinun kannattaa valita omat oman strategiasi mukaan.
Jos yllä oleva yhdistetään apufunktioihin ja silmukkafunktioon, joka voi olla myös main
, meillä pitäisi nyt olla itsellämme toimivan botin peruspilarit.
Joka iteraatiossa bottimme tarkistaa senhetkisen tilansa (OSTO tai MYYNTI) ja yrittää tehdä kauppaa kovakoodattujen kynnysarvojen perusteella. Sen jälkeen se päivittää osto-/myyntitilan ja operaation viimeisimmän hinnan.
Sitten se tekee kaiken uudelleen.
Vaihe 5: Botin hiominen
Botkimme perusarkkitehtuuri on valmiina, mutta on luultavasti muutama asia, joiden lisäämistä kannattaa harkita vielä.
Lokit
Kun rakensin ensimmäisen kerran muunnelman tästä botista, yksi asia, joka oli minulle olennainen, oli jatkuva lokitietojen kirjaaminen botin toimista sekä terminaaliin että erilliseen lokitiedostoon.
Loin jokaisessa vaiheessa tällaisia lokeja:
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
Tiedostoon meneviin lokeihin lisättäisiin myös aikaleima, joten kun kävin palvelimella kokonaisen päivän jälkeen ja löysin esimerkiksi virheen, pystyin jäljittämään sen tarkalleen tapahtumapaikkaan sekä saamaan selville kaiken muunkin, mitä botti teki matkan varrella.
Tämän pitäisi onnistua perustamalla createLog
-funktio, jota kutsutaan jokaisessa vaiheessa. Jotain tällaista:
Trendien tunnistaminen
Botkimme päätavoitteena tulisi olla ostaminen alhaisella hinnalla ja myyminen voitolla. Meillä on kuitenkin kaksi kynnysarvoa, jotka ovat tavallaan ristiriidassa tämän ajatuksen kanssa: UPWARD_TREND_THRESHOLD
ja STOP_LOSS_THRESHOLD
.
Nämä kynnysarvot muka kertovat meille, milloin meidän pitäisi myydä tappiolla tai ostaa hinnan noustessa. Ajatuksena on, että yritämme tunnistaa trendejä, jotka jäävät yleisen strategian ulkopuolelle, mutta voivat olla meille haitallisia tai hyödyllisiä, joten meidän pitäisi toimia.
Mutta edellä esittämäni tapa jäsentää se on varsin rajallinen. Staattinen tilannekuva hinnasta on kaukana trendin osoittamisesta.
Onneksi ilman suurempaa vaivaa voit tehdä tästä hieman luotettavamman.
Mitä sinun tarvitsee tehdä, on myös seurata useampia hintoja kuin vain lastOpPrice
. Voit esimerkiksi seurata 10 tai 20 iteraation takaista hintaa ja verrata sitä nykyiseen hintaan lastOpPrice
:n sijaan. Näin pystyttäisiin luultavasti paremmin tunnistamaan trendi, koska tarkistetaan pikemminkin hinnan nopeat muutokset kuin pitkän ajan kuluessa tapahtunut muutos.
Tietokanta?
Tämä yksinkertainen botti ei suoritusaikana oikeastaan tarvitse tietokantaa, koska se käsittelee hyvin vähän dataa ja pystyy pitämään kaiken tiedon muistissa.
Mutta mitä tapahtuu, kun botti esimerkiksi epäonnistuu? Miten se voisi määrittää lastOpPrice
:n ilman, että tarkistat sen manuaalisesti?
Välttääksesi manuaalisen työn tekemisen omalta osaltasi, saatat haluta pitää jonkinlaista kevytrakenteista tietokantaa, joka pitää kirjaa muutamista asioista, kuten lastOpPrice
.
Tällöin botin käynnistyessä se ei käytä oletusarvoja, vaan se todella tarkistaa tallennetut arvot ja jatkaa siitä.
Sitä riippuen, kuinka yksinkertaiseksi haluat tehdä tämän, voit jopa harkita .txt
– tai json
-tiedostojen ”tietokantaa”, koska saatat joka tapauksessa tallentaa vain muutaman arvon.
Dashboard
Jos haluat helpottaa botin toiminnan visualisointia, sekä hallita sitä ilman, että sinun tarvitsee mennä manuaalisesti korjailemaan koodia, kannattaa harkita botin liittämistä kojelautaan.
Tämä edellyttäisi, että bottisi on liitetty omaan web-palvelimeen/API:hen, jonka avulla voit hallita sen toimintoja.
Siten voisit esimerkiksi muuttaa kynnysarvoja helpommin.
Esimerkkitauluun on saatavilla monia ilmaisia kojelautamalleja, joten sinun ei tarvitse edes tehdä omaa. Katso esimerkkejä Start Bootstrapista ja Creative Timistä.
Strategioiden testaaminen aiemmilla tiedoilla
Monet pörssit tarjoavat sinulle pääsyn aiempiin hintatietoihin, samoin kuin voit yleensä helposti hankkia nämä tiedot muualta, jos tarvitset niitä.
Tämä on erittäin hyödyllistä, jos haluat testata strategiaasi ennen sen käyttöönottoa. Voit suorittaa simulaation botistasi aiemmilla tiedoilla ja ”väärällä rahalla” nähdäksesi, kuinka hyvin määrittelemäsi kynnysarvot olisivat toimineet, ja säätää niitä todellista tilannetta varten.
Lisäpisteitä kynnysarvoista ja toimeksiannoista
Toimeksiantoja antaessasi on muutama asia, joita sinun on syytä huomioida.
Ensiksi sinun on ymmärrettävä, että on olemassa kahdenlaisia toimeksiantotyyppejä: limiittitoimeksiannot (limit orders) ja markkinatoimeksiannot. Sinun pitäisi tosiaan lukea tästä hieman tarkemmin, jos et tunne käsitteitä, mutta annan sinulle peruskatsauksen tässä.
Pörssitoimeksiannot ovat toimeksiantoja, jotka toteutetaan senhetkiseen markkinahintaan, ja ne toteutetaan useimmissa tapauksissa välittömästi.
Limit-toimeksiannot taas tapahtuvat, kun annat toimeksiannon markkinahintaa alhaisemmalla hinnalla (jos kyseessä on BUY-toimeksianto) tai korkeammalla hinnalla kuin markkinahinta (jos kyseessä on SELL-toimeksianto). Niiden toteutuminen ei ole taattua, sillä hinta ei välttämättä saavuta asettamaasi raja-arvoa.
Limit-toimeksiantojen etuna on se, että voit ennakoida markkinoiden liikkeitä ja antaa toimeksiannon siitä, mihin odotat markkinoiden menevän ennen kuin tällainen liike tapahtuu.
Limit-toimeksiannoista peritään lisäksi yleensä alhaisemmat palkkiot kuin markkinatoimeksiannoista. Tämä johtuu siitä, että markkinatoimeksiannoista peritään yleisesti niin sanottu ”ottajapalkkio”, kun taas limiittitoimeksiannoista peritään ”toteuttajapalkkio”.
Syy nimityksiin ja niihin liittyviin palkkioihin on se, että markkinatoimeksiannot vain hyväksyvät (”ottavat”) senhetkisen markkinahinnan, kun taas markkinahinnan ulkopuoliset limiittitoimeksiannot lisäävät likviditeettiä ja siten ”tekevät markkinoita”, mistä ne ”palkitaan” alhaisemmilla maksuilla.
Huomaa, että tämän artikkelin botti soveltuu parhaiten markkinatoimeksiantoihin.
Viimeiseksi, maksujen aiheeseen liittyen, kun asetat PROFIT_THRESHOLD
, muista ottaa maksut huomioon.
Tehdäksesi voittoa sinun on suoritettava BUY- ja sen jälkeen SELL-operaatio, jolloin sinulta peritään 2 maksua.
Siten sinun on varmistettava, että myyt voitolla vasta, kun pystyt vähintään kattamaan maksusi, muuten teet itse asiassa tappiota.
Ajatellaanpa, että jos oletetaan, että palkkiot olisivat kiinteät, jos ostaisit omaisuuserän 100,00$:lla, josta peritään 0,50$:n palkkiot, ja sitten myisit sen 100,75$:lla, josta peritään taas 0,50$:n palkkiot, olisit tehnyt bruttovoittoa 0,75%:n verran, mutta todellisuudessa nettotappiota kertyisi 0,25%:n verran.
Kuvittele, että bottiisi myytäisiin koko ajan tappiolliseen hintaan. Menettäisit paljon rahaa melko nopeasti…
Loppuhuomautukset
Se siitä botistamme. Toivottavasti tämä opetusohjelma oli hyödyllinen.
Ajatuksena oli keskittyä kaikkiin käsitteisiin, jotka sinun täytyy tietää rakentaaksesi kaupankäynnin botin, vaikka et olisi koskaan aiemmin käynyt kauppaa, eikä opettaa sinua ohjelmoimaan.
oletuksena on, että kaikki lukijat osaavat tehdä HTTP-pyyntöjä valitsemallaan kielellä, joten olisi parasta keskittyä muihin asioihin.
Tämä on ensimmäinen tutoriaali, jonka kirjoitan näin (pseudokoodipohjainen), joten kertokaa minulle, mitä mieltä olette konseptista.
Kiitos lukemisesta! Ja jos tämä artikkeli oli mielestäsi hyödyllinen, tukekaa minua taputuksilla 👏👏.