func main() { initFlags() var client bitcoin.Client if flagExchange == "bitstamp" { client = bitstamp.NewClient(flagClientId, flagApiKey, flagApiSecret) } else if flagExchange == "bitfinex" { client = bitfinex.NewClient(flagApiKey, flagApiSecret) } else if flagExchange == "kraken" { client = kraken.NewClient(flagApiKey, flagApiSecret) } else { fmt.Printf("Unknown exchange: %v\n", flagExchange) os.Exit(1) } client.SetDryRun(flagTest) openOrders, err := client.OpenOrders() if err != nil { fmt.Printf("Error open orders: %v\n", err) return } if flagTest { fmt.Printf("%v open orders:\n", len(openOrders)) for _, order := range openOrders { fmt.Printf("%v\n", order) } } else { if len(openOrders) == 4 { return } } orderMap := make(map[string]*StatusOrder) for _, order := range openOrders { orderMap[order.String()] = &StatusOrder{order, ORDER_REMOVE} } A, err := client.Balance(bitcoin.FIAT) if err != nil { fmt.Printf("Error balance: %v\n", err) return } b, err := client.Balance(bitcoin.BTC) if err != nil { fmt.Printf("Error balance: %v\n", err) return } A += flagOffsetUsd b += flagOffsetBtc R := flagBtcRatio / (1 - flagBtcRatio) F, err := client.Fee() if err != nil { fmt.Printf("Error fee: %v\n", err) return } if flagSpread < 200*F { fmt.Printf( "spread (%.2f%%) must be at least twice the fee (%.2f%%) "+ "not to make a loss.\n", flagSpread, 100*F) return } s := 1 + (flagSpread / 100) previousRate := R * A / b fmt.Printf("Rate = %.2f\n", previousRate) fmt.Printf("Fiat = %v\n", A) fmt.Printf("BTC = %v\n", b) fmt.Printf("Fee = %v\n", F) placeBuyOrders(A, b, R, F, s, orderMap) placeSellOrders(A, b, R, F, s, orderMap) for _, order := range orderMap { err := order.Execute(client) if err != nil { fmt.Printf("Error executing order: %v: %v\n", order, err) } } }