Por exemplo: A: ETH_BTC B: ETH_USDT A troca C ((na verdade é a troca B, outro par de transações, que é logicamente C。)): BTC_USDT
A troca B, C é uma combinação de ETH_BTC e A. A troca BC é uma troca.
// 交易对以 ETH_BTC , ETH_USDT , BTC_USDT 为例 // 教学策略,还有很大优化空间,例如:币平衡模块,根据手续费率控制对冲差价,硬搬砖等等。 function main () { if (exchanges[0].GetQuoteCurrency() != exchanges[2].GetCurrency().split("_")[0] || exchanges[0].GetCurrency().split("_")[0] != exchanges[1].GetCurrency().split("_")[0]) { throw "交易所 交易对 配置错误。" } var marketSlideRate = 1 // 1.02 var hedgeDiff = 0.0007 var hedgeAmount = 0.1 var isFirst = true var concurrenter = function (funcName, isWait, tasks, amounts) { for (var i = 0 ; i < exchanges.length; i++) { if (isFirst) { exchanges[i].acc = _C(exchanges[i].GetAccount) exchanges[i].initAcc = exchanges[i].acc } if (isWait) { var a = funcName == "GetTicker" ? exchanges[i].ticker = exchanges[i].tiR.wait() : exchanges[i].id = exchanges[i].trR.wait() if (funcName == "trade") { exchanges[i].acc = _C(exchanges[i].GetAccount) } } else { var b = funcName == "GetTicker" ? exchanges[i].tiR = exchanges[i].Go(funcName) : exchanges[i].trR = exchanges[i].Go(tasks[i], -1, amounts[i], exchanges[i].GetCurrency()) } } if (funcName == "trade" && isWait) { Log("BTC:", exchange.BTC = exchanges[0].acc.Balance + exchanges[2].acc.Stocks, "ETH:", exchange.ETH = exchanges[0].acc.Stocks + exchanges[1].acc.Stocks, "USDT:", exchange.USDT = exchanges[1].acc.Balance + exchanges[2].acc.Balance, "#FF0000") LogProfit(exchange.USDT - (exchanges[1].initAcc.Balance + exchanges[2].initAcc.Balance) - (exchanges[0].initAcc.Balance + exchanges[2].initAcc.Stocks - exchange.BTC) * exchanges[2].ticker.Last - (exchanges[0].initAcc.Stocks + exchanges[1].initAcc.Stocks - exchange.ETH) * exchanges[1].ticker.Last) } isFirst = false } while (1) { concurrenter("GetTicker", false) concurrenter("GetTicker", true) var tickerA = exchanges[0].ticker var tickerB = exchanges[1].ticker var tickerC = exchanges[2].ticker var tickerBC = { Buy : tickerB.Buy / tickerC.Sell, Sell : tickerB.Sell / tickerC.Buy, } if (tickerA.Buy - tickerBC.Sell > hedgeDiff && exchanges[0].acc.Stocks > 0.2 && exchanges[1].acc.Balance > 500 && exchanges[2].acc.Stocks > 0.03) { // Sell A , Buy BC (Buy B Sell C) concurrenter("trade", false, ["Sell", "Buy", "Sell"], [hedgeAmount, marketSlideRate * tickerB.Sell * hedgeAmount, tickerB.Sell * hedgeAmount / tickerC.Buy]) concurrenter("trade", true) } if (tickerBC.Buy - tickerA.Sell > hedgeDiff && exchanges[0].acc.Balance > 0.03 && exchanges[1].acc.Stocks > 0.2 && exchanges[2].acc.Balance > 500) { // Buy A , Sell BC (...) concurrenter("trade", false, ["Buy", "Sell", "Buy"], [marketSlideRate * hedgeAmount * tickerA.Sell, hedgeAmount, marketSlideRate * hedgeAmount * tickerA.Sell * tickerC.Sell]) concurrenter("trade", true) } Sleep(500) } }
BNMBNMPro: TypeError: não pode ler a propriedade 'Sell' de null no principal (__FILE__:45) Pro: GetTicker: 429: {"msg":"Solicitações muito frequentes."," código":"50011"}
BNMBNMOu seja, é preciso ter três moedas para correr, ou é preciso ter USDT para correr.
BNMBNMComo é que não podes correr?
FmzeroOnde estão os vídeos didáticos?
Inventor quantificado - sonho pequenoTrês moedas são necessárias.
Inventor quantificado - sonho pequenoPedidos muito frequentes!
BNMBNMOu seja, é preciso ter três moedas para correr, ou é preciso ter USDT para correr.
BNMBNMO volume de negociação pode ser definido como 0.03? O que é que 0.0007 e 1/1.02 representam?
BNMBNMEstá bem, vou correr outra vez.
Inventor quantificado - sonho pequenoPara obter informações sobre o erro, envie aqui ou no grupo oficial da FMZ @dreamback.
BNMBNMNão posso correr, não posso dizer que fiz um erro, posso baixar o meu WeChat?
Inventor quantificado - sonho pequenoEnvie uma pergunta específica, ou adicione o grupo oficial do FMZ no WeChat:
BNMBNMO que você pode fazer com o seu WeChat?
Inventor quantificado - sonho pequenoÉ uma estratégia de "ao vivo" e, se houver um problema, é preciso enviar uma pergunta concreta.