Skip to content

Instantly share code, notes, and snippets.

@mikispag
Created March 9, 2017 02:00
Show Gist options
  • Save mikispag/596e25183bf6e0c3ea429a6fdedfeab1 to your computer and use it in GitHub Desktop.
Save mikispag/596e25183bf6e0c3ea429a6fdedfeab1 to your computer and use it in GitHub Desktop.
Dirty script to trade the SEC's $COIN ETF decision on BitFinex
package main
import (
"bytes"
"github.com/beevik/etree"
"github.com/bitfinexcom/bitfinex-api-go"
"github.com/levigross/grequests"
"golang.org/x/net/html"
"log"
"os"
"strings"
"time"
)
const (
API_KEY = ""
API_SECRET = ""
BATS_RSS_URL = "https://www.bats.com/us/equities/regulation/rss/rule_filings/bzx/approved"
BATS_APPROVED_URL = "http://cdn.batstrading.com/resources/regulation/rule_filings/approved/2016/SR-BatsBZX-2016-30.pdf"
SEC_URL = "https://www.sec.gov/rules/sro/batsbzx.htm"
)
func buy() {
client := bitfinex.NewClient().Auth(API_KEY, API_SECRET)
// Market BUY 20 BTC
order, err := client.Orders.Create(bitfinex.BTCUSD, 20, 1, bitfinex.ORDER_TYPE_MARKET)
if err != nil {
log.Println(err)
} else {
log.Println(order)
}
// Take profit @1400
order, err = client.Orders.Create(bitfinex.BTCUSD, -20, 1400, bitfinex.ORDER_TYPE_LIMIT)
if err != nil {
log.Println(err)
} else {
log.Println(order)
}
}
func sell() {
client := bitfinex.NewClient().Auth(API_KEY, API_SECRET)
// Market SELL 20 BTC
order, err := client.Orders.Create(bitfinex.BTCUSD, -20, 1, bitfinex.ORDER_TYPE_MARKET)
if err != nil {
log.Println(err)
} else {
log.Println(order)
}
// Take profit @900
order, err = client.Orders.Create(bitfinex.BTCUSD, 20, 900, bitfinex.ORDER_TYPE_LIMIT)
if err != nil {
log.Println(err)
} else {
log.Println(order)
}
}
func main() {
for {
resp, err := grequests.Get(BATS_RSS_URL, nil)
if err != nil {
log.Println("Unable to make BATS_RSS_URL request: ", err)
}
rss := resp.String()
approved := strings.Contains(rss, "<title>SR-BatsBZX-2016-30</title>")
log.Println("BATS_RSS_URL: ", approved)
if approved {
buy()
break
}
resp, err = grequests.Get(BATS_APPROVED_URL, nil)
if err != nil {
log.Println("Unable to make BATS_APPROVED_URL request: ", err)
}
approved = resp.StatusCode == 200
log.Println("BATS_APPROVED_URL: ", approved)
if approved {
buy()
break
}
resp, err = grequests.Get(SEC_URL, nil)
if err != nil {
log.Println("Unable to make SEC_URL request: ", err)
}
reader := strings.NewReader(resp.String())
root, err := html.Parse(reader)
if err != nil {
log.Println("Unable to parse HTML SEC_URL request: ", err)
}
var b bytes.Buffer
html.Render(&b, root)
html := b.String()
doc := etree.NewDocument()
if err := doc.ReadFromString(html); err != nil {
log.Println("Unable to parse XML SEC_URL request: ", err)
}
for _, t := range doc.FindElements("//b[@class='blue']") {
text := strings.ToLower(t.Text())
if !strings.Contains(text, "longer period") && (strings.Contains(text, "winklevoss") || strings.Contains(text, "bitcoin")) {
log.Println("SEC_URL fragment: ", text)
if strings.Contains(text, "approval") {
buy()
os.Exit(0)
}
if strings.Contains(text, "withdrawal") {
sell()
os.Exit(0)
}
}
}
time.Sleep(5 * time.Second)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment