A simple bot that trades futures on binance.
Feel free to contribute to the project and propose changes. I will review and accept the good PRs
The bot trades a strategy called the 'TalonSniper'. It can be modified to take your own stragies.
I chose the strategy as a demonstration strategy. I came across it while browsing trading view. On the surface the strategy seems to find points where trends can be considered "confirmed". The strategy was reimplemented by looking at the code in the trading view pine editor and then recreating it in python. This can be found in the trading_signal() function of the bot_functions.py file.
The Bot makes use of Heikin Ashi candles for it's candle representations. This is because Heikin Ashi candles make it easier to spot trends. You can read more about them here
Positions are given to a bot as a list of historic "signals". These tell the bot when to go long, short or stay in whatever it was in before.
The bot uses the second last signal from the list of historic signals to make it's choice of action. This is because the last signal in the list is the current unresolved candle, as this is still in flux.
The bot attempts to stay in positions as long as possible.
If you want to swap out the falcon sniper strategy with one of your own, I recommend doing it like so.
First Create a function that calculates some sort of signal and returns it as a list of integers. Taking Heikin Ashi open, high, low, and close as inputs.
def new_trading_signal(h_o, h_h, h_l, h_c, use_last=False):
entry = [0]
last = 0
for i, v in enumerate(h_o):
if i != 0:
if h_o[i-1] < h_c[i-1]:
entry.append(1)
last = 1
elif h_o[i-1] > h_c[i-1]:
entry.append(-1)
last = -1
else:
if use_last:
entry.append(last)
else:
entry.append(0)
return entry
Then modify the function the bot calls for its entry signalling.
def get_signal(client, _market="BTCUSDT", _period="15m", use_last=False):
candles = client.get_candlestick_data(_market, interval=_period)
o, h, l, c, v = convert_candles(candles)
h_o, h_h, h_l, h_c = construct_heikin_ashi(o, h, l, c)
ohlcv = to_dataframe(h_o, h_h, h_l, h_c, v)
entry = new_trading_signal(h_o, h_h, h_l, h_c, use_last)
return entry
NOTE: the use_last variable allows you to constantly pump out the last non-zero bot signal. This will allow the bot to enter a position as soon as the bot is initiated, rather than it waiting for a new signal to appear. This can also be chained with multi-timescale strategies for better potential performance.
The bot doesn't require much to operate. Simple Numpy, Pandas and binance futures python
you can install some of the requirements as such:
pip install -r requirements.txt
followed by the installation of binance futures python
python -m pip install git+https://github.com/Binance-docs/Binance_Futures_python.git
The bot can be modified for use with any USDT futures market, leverage and time frame combinatiob by editing the settings.json file.
You should replace the market, leverage and period with values that are relevant.
{
"market": "BTCUSDT",
"leverage": "5",
"period": "5m,15m",
"margin_type": "CROSSED",
"trailing_percentage": "2.0"
}
This file is where you should put your API keys. The API Keys should have Futures access enabled, or the bot won't work. You can generate a new api key here when logged in to binance
{
"api_key": "fill_api_key_here",
"api_secret": "fill_api_secret_here"
}
Once you've modified Keys.json and Settings.json you should be ready to go.
python bot.py
nohup python bot.py &
tl;dr - Short answer yes and no!
This really depends on market conditions, leverage and time period! The bot seems to struggle when the market is side-ways, but seems to excell when trending. But again this depends on settings and specific markets. Nothing is guaranteed ( refer to Disclaimer ).
The bot does not take into account liquidation price, although a function has been created for this purpose. Be careful when using any leverage where a 2% move can lead to liquidation of positions - I advice against using leverage sizes that are crazy high (i.e. 30x+)