#测试研究环境 https://www.fmz.com/digest-topic/4459 三角对冲细节,以及手续费
var fmz = require("fmz"); var task = fmz.VCtx({ start: '2020-01-01 00:00:00', end: '2020-01-20 18:00:00', period: '1d', exchanges: [{'eid':'Huobi','currency':'ETH_BTC',"balance":1, "stocks":10}, {'eid':'OKEX', 'currency':'ETH_USDT',"balance":10000, "stocks":1}, {'eid' : 'OKEX', 'currency':'BTC_USDT', "balance": 10000, "stocks":1}] });
var accA = exchanges[0].GetAccount() accA
{ Balance: 1, FrozenBalance: 0, Stocks: 10, FrozenStocks: 0 }
var accB = exchanges[1].GetAccount(); accB
{ Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }
var accC = exchanges[2].GetAccount(); accC
{ Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }
var initSumBTC = accA.Balance + accC.Stocks initSumBTC
2
var initSumETH = accA.Stocks + accB.Stocks initSumETH
11
var initSumUSDT = accB.Balance + accC.Balance initSumUSDT
可以看到,初始BTC总数是2个,ETH总数是11个,USDT总数是20000个,下面我们获取一下当前的各个交易对的行情信息
var tickerA = exchanges[0].GetTicker() tickerA
{ Time: 1577839560000, High: 0.01792601, Low: 0.01792599, Sell: 0.01792601, Buy: 0.01792599, Last: 0.017926, Volume: 256.2683, OpenInterest: 0 }
_D(tickerA.Time)
'2020-01-01 00:00:00'
var tickerB = exchanges[1].GetTicker() tickerB
{ Time: 1577840280000, High: 128.90000001, Low: 128.89999999, Sell: 128.90000001, Buy: 128.89999999, Last: 128.9, Volume: 4036.4944, OpenInterest: 0 }
_D(tickerB.Time)
'2020-01-01 00:00:00'
var tickerC = exchanges[2].GetTicker() tickerC
{ Time: 1577839024800, High: 7176.30000001, Low: 7176.29999999, Sell: 7176.30000001, Buy: 7176.29999999, Last: 7176.3, Volume: 120.3639, OpenInterest: 0 }
as we can see, exchange A & B trades ETH, while C trades USDT
A/B交易所可以进行间接对冲操作,无法直接对冲,原因在于计价币种不同。A交易所的计价币种是BTC,B交易所的计价币种是USDT。假设对于A交易所买入,exchanges[0].Buy(price, amount); 买入时根据对手卖出的价格作为下单价格,即ticker.Sell. B交易所为了对冲,就要进行卖出操作,即exchanges[1].Sell(price, amount); 卖出时根据对手要买入的价格作为下单价格,即: tickerB.Buy。 因为A交易所买入时消耗的是BTC,B交易所卖出时得到USDT,需要把USDT换成BTC,即补缺A交易所消耗使用的BTC,即C交易所执行exchanges[2].Buy(price, amount),把USDT换成BTC,C交易所买入,需要看对手的卖出价格,即
ticker.Sell
。 A交易所买入的价格一定要比B交易所卖出的价格更低,那么C交易所就只用花少一点的USDT就能买回A交易所消耗掉的BTC,就赚到了USDT金额差 所以如下:
var diffB2A = tickerA.Sell - tickerB.Buy / tickerC.Sell diffB2A
-0.000035892371670689927
说明A交易所买入的价格比BC交易所组合成的价格要低,对冲产生的USDT差额为diffB2A
另一个对冲方向同理,A交易所执行卖出ETH的操作,B交易所执行买入ETH的操作,C交易所执行卖出BTC的操作换回USDT。达到ETH,BTC都是平衡的,只有USDT增减
var diffA2B = tickerA.Buy - tickerB.Sell/tickerC.Buy diffA2B
-0.00003591237450770515
我们执行一次tickerA.Buy - tickerB.Sell / tickerC.Buy 的操作,对其中的各个数值变化查看
var idA = exchanges[0].Sell(tickerA.Buy, 1); var nowAccA = exchanges[0].GetAccount() nowAccA
{ Balance: 1.01792407, FrozenBalance: 0, Stocks: 9, FrozenStocks: 0 }
通过查看账户变化来看卖出ETH的影响
diffBalanceA = nowAccA.Balance - accA.Balance diffBalanceA
0.01792407000000007
nowAccA.Stocks - accA.Stocks
-1
通过查看订单来看卖出ETH的影响
var orderA = exchanges[0].GetOrder(idA) orderA
{ Id: 1, Price: 0.01792599, Amount: 1, DealAmount: 1, AvgPrice: 0.01795999, Type: 1, Offset: 0, Status: 1, ContractType: 'ETH_BTC_Huobi' }
orderA.Price*orderA.Amount - diffBalanceA
0.000001919999999929617
var feeRatioA = 0.00107 var feeA = orderA.DealAmount * orderA.AvgPrice * feeRatioA feeA
0.000019217189299999998
var idB = exchanges[1].Buy(tickerB.Sell, 1); var nowAccB = exchanges[1].GetAccount(); nowAccB
{ Balance: 9870.84219998, FrozenBalance: 129.15780001, Stocks: 1, FrozenStocks: 0 }
var orderB = exchanges[1].GetOrder(idB) orderB
{ Id: 2, Price: 128.90000001, Amount: 1, DealAmount: 0, AvgPrice: 0, Type: 0, Offset: 0, Status: 0, ContractType: 'ETH_USDT_OKEX' }
var feeRatioB = 0.002 var feeB = orderB.Amount * orderB.Price * feeRatioB feeB
0.25780000002000003
var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance); idC
1
var nowAccC = exchanges[2].GetAccount() nowAccC
{ Balance: 10128.53291899, FrozenBalance: 0, Stocks: 0.9821, FrozenStocks: 0 }
var orderC = exchanges[2].GetOrder(idC) orderC
{ Id: 1, Price: 7176.29999999, Amount: 0.0179, DealAmount: 0.0179, AvgPrice: 7194.99999999, Type: 1, Offset: 0, Status: 1, ContractType: 'BTC_USDT_OKEX' }
var feeRatioC = 0.002 var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last feeC
0.00003589328762727896
var nowSumBTC = nowAccA.Balance + nowAccC.Stocks nowSumBTC
2.0000240700000003
var nowSumETH = nowAccA.Stocks + nowAccB.Stocks + nowAccA.FrozenStocks nowSumETH
10
var nowSumUSDT = nowAccB.Balance + nowAccC.Balance nowSumUSDT
19999.375118969998
nowSumBTC- initSumBTC
0.000024070000000264713
nowSumETH - initSumETH
-1
nowSumUSDT - initSumUSDT
-0.6248810300021432