-
-
Save aido/5623833 to your computer and use it in GitHub Desktop.
A simple stop loss bot. Adjust STOP_PRICE and STOP_VOLUME to your needs. The file can be reloaded after editing without restarting goxtool by simply pressing the l key. An update of prof7bit's original _stoploss.py at https://gist.github.com/prof7bit/5437131 to sell entire BTC balance when STOP_VOLUME = 0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
a simple stop loss bot. | |
adjust STOP_PRICE and STOP_VOLUME to your needs. | |
The file can be reloaded after editing without | |
restarting goxtool by simply pressing the l key. | |
""" | |
import strategy | |
import goxapi | |
# pylint: disable=C0301 | |
# USD (EUR or other Fiat) price for the sell stop | |
# positive values are an absolute fixed price, | |
# negative values enable trailing stop mode and the | |
# value is the trailing distance | |
STOP_PRICE = 98.90 | |
# how many BTC to sell at or below the stop price | |
STOP_VOLUME = 0 | |
class Strategy(strategy.Strategy): | |
"""a simple stoploss bot""" | |
def __init__(self, gox): | |
strategy.Strategy.__init__(self, gox) | |
gox.history.signal_changed.connect(self.slot_changed) | |
self.got_wallet = False | |
self.already_executed = False | |
self.btc_wallet = 0 | |
self.trail_distance = 0 | |
self.user_currency = gox.currency | |
self.START_VOLUME = 0 | |
def slot_changed(self, history, _no_data): | |
"""price history has changed (new trades in history)""" | |
if self.already_executed: | |
return | |
if not self.got_wallet: | |
try: | |
self.debug("Retrieving wallet data...") | |
self.btc_wallet = goxapi.int2float(self.gox.wallet["BTC"], "BTC") | |
except: | |
self.debug("Could not retrieve wallet data, retrying...") | |
return | |
else: | |
self.got_wallet = True | |
if not STOP_VOLUME: | |
self.STOP_VOLUME = self.btc_wallet | |
else: | |
self.STOP_VOLUME = STOP_VOLUME | |
if STOP_PRICE < 0: | |
self.debug("initializing trailing stop: sell %f BTC @ %f / BTC" % (self.STOP_VOLUME, STOP_PRICE)) | |
self.stop_price = 0 | |
self.trail_distance = goxapi.float2int(-STOP_PRICE, self.user_currency) | |
history.signal_changed(history, None) # fire the signal once | |
else: | |
self.debug("initializing stop loss: sell %f BTC @ %f / BTC" % (self.STOP_VOLUME / 1e8, STOP_PRICE)) | |
self.stop_price = goxapi.float2int(STOP_PRICE, self.user_currency) | |
self.trail_distance = 0 | |
else: | |
last_candle = history.last_candle() | |
if not last_candle: | |
self.debug("Could not retrieve candle data from goxtool, retrying...") | |
else: | |
price_last = last_candle.cls | |
if self.trail_distance: | |
price_trail = price_last - self.trail_distance | |
if price_trail > self.stop_price: | |
self.stop_price = price_trail | |
self.debug("*** trailed stop to %f" % | |
goxapi.int2float(self.stop_price, self.user_currency)) | |
if not self.stop_price: | |
return | |
if price_last <= self.stop_price: | |
self.debug("*** market order: sell %f BTC at %f / BTC" % (self.STOP_VOLUME, STOP_PRICE)) | |
self.gox.sell(0, int(self.STOP_VOLUME * 1e8)) | |
self.already_executed = True | |
def slot_trade(self, gox, (date, price, volume, typ, own)): | |
"""a trade message has been receivd""" | |
# not interested in other people's trades | |
if not own: | |
return | |
text = {"bid": "sold", "ask": "bought"}[typ] | |
self.debug("*** %s %f at %f" % ( | |
text, | |
gox.base2float(volume), | |
gox.quote2float(price) | |
)) | |
self.check_trades() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment