Polygon上的循环套利入门
写文章登录/注册Polygon上的循环套利入门6 人赞同了该文章概述
DeFi已经发展了有一段时间了,虽然现在在去中心交易所上进行套利已经非常困难了,但是本文仍然要展示一个在Polygon上在单个AMM机制的去中心化交易所上进行循环套利的入门教程,算是抛砖引玉了。至于为啥选择在Ploygon上进行程序测试,是因为以太坊实在太贵了,Polygon这个Layer2网络上交易费用非常便宜。
循环套利的原理众所周知,每个token在这些swap交易所上就有很多对与其他token兑换的pair,而在AMM机制中,每个pair中两个token的价格取决于在这个pair中两个token的的储备量,那么如果在网络中,有人大量取出某一个pair中其中一个token的储备量,那么就会造成这个pair中这个token的价格在短时间内升高。这个时候就需要套利机器人去平衡这个市场,而套利机器人所做的事情就是从其他地方搬运来对应的token,平衡该pair的价格。
知道为什么存在套利的背景之后,套利机器人下一个需要解决的问题就是如何寻找到失衡的pair,这一过程有很多方法可以参考,在这里就不过程阐述来,本文只介绍一种最简单的寻找失衡pair的方法:循环套利。所谓循环套利就是用一个token作为输入,用同一个token作为输出,然后在输入和输出之间经过多个pair进行交易。在多个pair交易的过程中,可以将不平衡的pair变的平衡,然后平衡过程中产生的利润会给到循环套利的发起者。一个理想的循环套利最终输出的token数量应当大于输入的token数量。
接下来的问题就变成了如何寻找到这样一个循环套利的机会。根据上面的定义,我们实际上是想要寻找一个A- B-...- C- A这样一个交易路径。在这里主要需要解决以下两个问题: 1. 在这个循环路径中,需要包含哪些Pair 2. 如果找到这样一个路径,我们应该使用多少数量的token A进行交易
这里我就不去进行算法的推导(主要我懒得敲那些公式),只看实现,具体的算法推导,大家可以去参考这个。
方法实现最简单的套利机器人,应该包含链上程序和链下程序两部分。其中链下程序主要是负责寻找循环套利的机会,链上程序主要负责在链下程序寻找到套利机会之后进行交易。
首先看一下一个最简单的链上程序,链上程序由Solidity编写。该链上程序主要函数是printMoney,函数的输入参数如下: tokenIn:输入token的address amountIn:token的输入金额 amountOutMin:token的最小输出金额 path:套利交易的pair路径 deadline:交易的截止时间 swapAddress:进行套利的swap地址
printMoney函数主要做的事情,从调用者账户转移token到合约地址上,然后合约调用swap的Router02合约的swapExactTokenForTokens方法传入对应的参数进行循环交易。
pragma solidity ^0.5.7; pragma experimental ABIEncoderV2; import ./IERC20.sol ; import ./IUniswapV2Router02.sol ; import ./IWeth.sol ; contract MoneyPrinter { address owner; constructor() public { owner = msg.sender; modifier onlyOwner() { require(msg.sender == owner); function setOwner(address _o) onlyOwner external { owner = _o; function printMoney( address tokenIn, uint256 amountIn, uint256 amountOutMin, address[] memory path, uint256 deadline, address swapAddress ) onlyOwner public { IUniswapV2Router02 uni = IUniswapV2Router02(swapAddress); IERC20 erc20 = IERC20(tokenIn); erc20.transferFrom(msg.sender, address(this), amountIn); erc20.approve(swapAddress, amountIn); // usdt -1 six decimal would fail! uni.swapExactTokensForTokens(amountIn, amountOutMin, path, msg.sender, deadline); function() external payable {}
链上程序还是比较简单的,要部署一个链上程序的原因,主要是希望循环交易能够在一个区块中完成。
接下来看一下链下程序,链下程序由python实现,首先是链下程序的核心,在Swap的pair中寻找套利的路径以及输入token的最优数量。该函数的输入如下: pairs:交易所的pairs对 tokenIn:从什么token开始计算 tokenOut:到什么token结束 maxHops:最大交易深度 currentPairs:当前的pair对路径 path:交易的token路径 bestTrades:最佳的套利交易对 count:最佳的套利交易对数量
def findArb(pairs, tokenIn, tokenOut, maxHops, currentPairs, path, bestTrades, count=5): for i in range(len(pairs)): newPath = path.copy() pair = pairs[i] if not pair[ token0 ][ address ] == tokenIn[ address ] and not pair[ token1 ][ address ] == tokenIn[ address ]: continue if pair[ reserve0 ]/pow(10, pair[ token0 ][ decimal ]) 1 or pair[ reserve1 ]/pow(10, pair[ token1 ][ decimal ]) 1: continue if tokenIn[ address ] == pair[ token0 ][ address ]: tempOut = pair[ token1 ] else: tempOut = pair[ token0 ] newPath.append(tempOut) if tempOut[ address ] == tokenOut[ address ] and len(path) 2: Ea, Eb = getEaEb(tokenOut, currentPairs + [pair]) newTrade = { route : currentPairs + [pair], path : newPath, Ea : Ea, Eb : Eb } if Ea and Eb and Ea Eb: newTrade[ optimalAmount ] = getOptimalAmount(Ea, Eb) if newTrade[ optimalAmount ] 0: newTrade[ outputAmount ] = getAmountOut(newTrade[ optimalAmount ], Ea, Eb) newTrade[ profit ] = newTrade[ outputAmount ]-newTrade[ optimalAmount ] newTrade[ p ] = int(newTrade[ profit ])/pow(10, tokenOut[ decimal ]) else: continue bestTrades = sortTrades(bestTrades, newTrade) bestTrades.reverse() bestTrades = bestTrades[:count] elif maxHops 1 and len(pairs) 1: pairsExcludingThisPair = pairs[:i] + pairs[i+1:] bestTrades = findArb(pairsExcludingThisPair, tempOut, tokenOut, maxHops-1, currentPairs + [pair], newPath, bestTrades, count) return bestTrades
上面我们已经实现如何寻找一个套利机会,那么在寻找一个套利机会之后,下一步应该考虑如何调用链上程序进行交易。在python中主要使用web3py与链上合约进行交互。交互的流程也非常简单,首先构建交易信息,然后使用自己的私钥对交易进行加密,最后发送交易。
def printMoney(amountIn, p, gasPrice): deadline = int(time.time()) + 600 # 调用合约交易 tx = printer.functions.printMoney(startToken[ address ], amountIn, amountIn, p, deadline, swap_addr).buildTransaction({ from : address, value : 0, gasPrice : gasPrice, gas : ***, nonce : web3.eth.getTransactionCount(address), try: # 估算gas消耗 gasEstimate = web3.eth.estimateGas(tx) print( estimate gas cost: , gasEstimate*gasPrice/1e18) signed_tx = web3.eth.account.sign_transaction(tx, private_key= 私钥 ) txhash = web3.eth.sendRawTransaction(signed_tx.rawTransaction) print(txhash.hex()) return txhash except Exception as e: print( gas estimate err: , e) return None数字加密货币是草根翻身的最后机会,真的错过了,找绳也没用!
五百年一遇的金融变革,让我们用全部的力量与全部的热忱拥抱区块链
币圈一日,互联网十年!在币里疗伤并收获着无穷的快乐与财富,美哉善哉!
如果你是刚接触的小白,或者是经常亏损爆仓 的朋友,可以让我们一起共同努力。让我们的口袋达到我们所预期的效果。让我们一起在这个市场持久的走下去,迎来最终的胜利。
了解更多币圈一线报道,与作者、读者更深入探讨、交流,欢迎大家来一起交流,互相学习!
------
延伸阅读:
新手炒币必看、你还在害怕失去机会吗?
做货币投资,我知道的亏损80%都是重仓操作。盈利了,重仓想赢更多,亏损了,重仓想回本,这就是人性弱点。人性弱点其实大家都知道,但是一旦你投入到这个市场里面,利益,恐惧,浮躁一系列的因素会使你忘记自身弱点,亏损了后知后觉,其实人进入投机市场本来就是一种错误,若你还以为能轻松获胜那就大错特错了。所谓专业的投资者和普通的投资者区别就在于知识和态度。专业者会战战兢兢,控制风险,预防踩雷。而普通投资者,操作不严谨,专业知识不达标,这样子利润会和风险一样大,处于一种赌.博状态,至于赌.博最后的结局相信大家也都有所耳闻。所以专业者会持续盈利,而普通投资者的结局只有一种,而这一种里面又分两种,一个是运气好刚好赌对一波行情赚了之后又重仓操作去赌下一波,一个就是直接亏损然后继续亏损。
交易员总是害怕失去机会,才会导致频繁交易、不断地交易,因为害怕某一次的机会错过了,会导致失去大行情。所以,每一次机会来临时,如果不参与,就好像失去几个亿似的,心痛刀割,很痒,不参与就很难受、痛苦。于是,交易员疲于奔命,不断地在交易的泥潭中挣扎,越挣扎陷的越深。所以,能克服害怕失去机会的毛病,是很重要的。那么,如何克服害怕失去机会的毛病?
第一,明白何为你的机会,你的机会是什么?否则的话,你根本不知道自己在等什么机会,满屏的波动都是机会,只要有波动,就有贪婪中的利润,你就会时刻想冲杀进去。你不杀进去,你就会责骂自己失去赚钱的机会,会自责,所以会时刻害怕失去机会。
第二,扎实技术分析,扎实基本功。建立起相对成熟的交易系统,或者研究基本面,对某个商品的供需研究透了,这样你的机会才可能是正确的;否则如果你等的机会是错误的,谈何赚钱,等这样的机会又有何意义?掌握深厚的技术理论,每日进行分析,学以致用,加强对技术理论的学习和深刻理解;再在实战中,应用技术理论进行分析,结合实战,从中选择成功率最高的几个图形机会,这种机会才是我们真正需要等的,这样你就会慢慢形成自己的交易系统,明白自己的机会是什么。
第三,放弃暴富的观念,不要求迅速暴富,而求稳定富裕。一年能赚50%以上足以,不渴求一年翻几倍。不求每日都赚,不求每周都赚,不求每月都赚。一年赚50%-100%就行了,等你资金大了,几千万,一年能30%,就不错了,长期坚持,放弃暴富的心态后,仓位就不会重了,心态也变好了,有技术分析的功底,能够通过技术分析,耐心地筛选严格符合自己的交易机会,这样的话,操盘的单子也就自然少了很多,不担心失去机会了。
第四,不要盯盘,千万不要盯盘。盯盘会让你感觉机会稍纵即逝,时刻想参与,例如:下跌时你刚出来的单子,看到行情又上涨,害怕失去上涨的机会,又立马进去,结果你都不知道这个上涨是反弹,还是上涨趋势,频繁亏损。另外,盯盘的时候,你的心情会和价格一样波动,判断容易失去理智,该持有的单子,稍微有了一点盈利,看到行情下跌了一点害怕,就止盈,或者该止损的单子,看到行情又上涨了一点,抱有解套的希望,又不止损,等等。
如果两个方向你都想去做,左顾右盼、依依不舍,你的交易失误的概率就会很高。如果你只做一个方向,你判断成功概率会高。趋势是多,你只做多;放弃回调,再去做多。人的思维是有一个认知、思考、执行的惯性依赖的,在交易中如此,在现实生活中也是如此。比如:过去足协体内有折返跑测试,很像我们的双向交易,这个测试是最累人的,也是许多优秀的运动员无法通过体能测试的根源,最终足协不得不在争议声中取消了折返跑。
人生需要规划,钱财需要打理;你不理财,财不理你;赚钱靠机会,投资靠智慧,理财靠专业。投资犹如下棋,棋艺高者能看出五步,七步甚至十几步,而棋艺低者只能看出两三步,高者顾大局,谋大势,不以一子一地为重,以最终赢棋为目标,低者则寸土必争,只为争一时之需,结果频频受困。趋势,一定要有长远眼光,投资,一定要有长远规划,而布局技巧是成功的关键。详细交流了解请加笔者!
------------------
欢迎阅读推荐阅读:
WSTETH币怎么买卖交易?WSTETH币上线了哪些交易所?