Skip to content

Instantly share code, notes, and snippets.

@Valian
Created January 18, 2018 23:33
Show Gist options
  • Star 50 You must be signed in to star a gist
  • Fork 15 You must be signed in to fork a gist
  • Save Valian/d16ef72a0e17ee82c0acf606d6a744d7 to your computer and use it in GitHub Desktop.
Save Valian/d16ef72a0e17ee82c0acf606d6a744d7 to your computer and use it in GitHub Desktop.
Short script for finding Binance Triangle arbitrage opportunities - requires python-binance installed
from collections import defaultdict
from operator import itemgetter
from time import time
from binance.client import Client
FEE = 0.0005
PRIMARY = ['ETH', 'USDT', 'BTC', 'BNB']
def main():
start_time = time()
prices = get_prices()
prices_time = time()
print(f"Downloaded in: {prices_time - start_time:.4f}s")
triangles = list(find_triangles(prices))
print(f"Computed in: {time() - prices_time:.4f}s")
if triangles:
for triangle in sorted(triangles, key=itemgetter('profit'), reverse=True):
describe_triangle(prices, triangle)
else:
print("No triangles found, try again!")
def get_prices():
client = Client(None, None)
prices = client.get_orderbook_tickers()
prepared = defaultdict(dict)
for ticker in prices:
pair = ticker['symbol']
ask = float(ticker['askPrice'])
bid = float(ticker['bidPrice'])
for primary in PRIMARY:
if pair.endswith(primary):
secondary = pair[:-len(primary)]
prepared[primary][secondary] = 1 / ask
prepared[secondary][primary] = bid
return prepared
def find_triangles(prices):
triangles = []
starting_coin = 'BTC'
for triangle in recurse_triangle(prices, starting_coin, starting_coin):
coins = set(triangle['coins'])
if not any(prev_triangle == coins for prev_triangle in triangles):
yield triangle
triangles.append(coins)
def recurse_triangle(prices, current_coin, starting_coin, depth_left=3, amount=1.0):
if depth_left > 0:
pairs = prices[current_coin]
for coin, price in pairs.items():
new_price = (amount * price) * (1.0 - FEE)
for triangle in recurse_triangle(prices, coin, starting_coin, depth_left - 1, new_price):
triangle['coins'] = triangle['coins'] + [current_coin]
yield triangle
elif current_coin == starting_coin and amount > 1.0:
yield {
'coins': [current_coin],
'profit': amount
}
def describe_triangle(prices, triangle):
coins = triangle['coins']
price_percentage = (triangle['profit'] - 1.0) * 100
print(f"{'->'.join(coins):26} {round(price_percentage, 4):-7}% <- profit!")
for i in range(len(coins) - 1):
first = coins[i]
second = coins[i + 1]
print(f" {second:4} / {first:4}: {prices[first][second]:-17.8f}")
print('')
if __name__ == '__main__':
main()
@Tilanthi
Copy link

Tilanthi commented Dec 20, 2021

Hey alissonf216 - thanks for the comment correcting @uk ... 's fee figure (which I think was meant to be percentage). But essentially for the retail trader, tri-arb has not really been a profitable strategy for the last few years - most retail traders do not have access to sufficiently optimised low latency configurations, and the available liquidity on most of the exchanges that have low enough fees to allow any possibility of profit is usually too low to guarantee closure of a triangular loop, with the consequence that the trader builds up a substantial 'bank' of intermediate coins where the tri-arbitrage loop has not closed. This strategy was 'fun' many years ago, but with the aggressive front-running bots now active on most exchanges (perhaps even 'zero-latency' ones co-located within the exchange racks) it is not worth wasting time with, apart from if you want a flutter for a bit of crypto fun. There are possibilities if you understand how to build things, in quad arbitrage - but it is a much slower kind of arbitrage strategy, and the available profitable windows tend to only last for short periods of time (sometimes as much as a few 10's of minutes a day) before they close - so again, not really suitable for the average retail trader, and requires simultaneously running a simulator to determine the short periods when a given market quadruplet is in a profitable situation. There are much easier ways these days to make money with automated trading bots, and in my view you would have to be a true tri-arb aficionado to expect this kind of strategy to produce any significant profit. Perhaps someone will jump in here and tell us all that they are making mega squillions of dollars a year with tri-arb - but I would be surprised should this prove to be the case !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment